虽然我试图理解CAP中的“可用性”(A)和“分区容限”(P),但我发现很难理解各种文章中的解释。
我感觉到A和P可以一起走(我知道不是这样,这就是为什么我听不懂!)。
简单地说,A和P是什么,它们之间的区别是什么?
一致性意味着整个集群中的数据都是相同的,因此您可以从任何节点读取或写入任何节点,并获取相同的数据。
可用性意味着即使集群中的节点出现故障也可以访问集群。
分区容限意味着,即使两个节点之间的“分区”(通信中断)(两个节点都在上,但无法通信),集群也可以继续运行。
为了同时获得可用性和分区容忍度,您必须放弃一致性。考虑在主-主设置中是否有两个节点X和Y。现在,X和Y之间的网络通信中断,因此它们无法同步更新。此时,您可以:
A)允许节点不同步(放弃一致性),或
B)认为群集已“关闭”(放弃可用性)
所有可用的组合是:
您应注意,CA systems don't practically exist(即使某些系统声称是这样)。
[将P与C和A等同地考虑是一个错误,而C,A,P中的'3之2'的概念是误导的。我要简单地解释CAP定理的方式是:“在分布式数据存储中,在进行网络分区时,您必须选择“一致性”或“可用性”,而不能同时选择两者。较新的NoSQL系统试图将重点放在可用性上,而传统的ACID数据库则将重点放在一致性上。
您确实不能选择CA,网络分区不是任何人都想要的,这只是分布式系统的不受欢迎的现实,网络可能会失败。问题是,当发生这种情况时,您会为应用程序选择什么权衡。最早提出该术语的人的article似乎很清楚地解释了这一点。
这里是我讨论CAP的方法,特别是关于P的问题。
只有在您可以使用单一的单服务器数据库(可能具有复制功能,但所有数据都位于一个“故障块”上–服务器不被视为部分故障)的情况下,CA才可能。
如果您的问题需要横向扩展,分布式和多服务器,则可能会发生网络分区。您已经在要求P。我所解决的问题很少是总是采用单服务器范例的(或者如Stonebraker所说,“分布式就是赌注”)。如果您发现CA问题,那么像传统的非横向扩展RDBMS这样的解决方案将带来很多好处。
对我来说,很少见:所以我们继续讨论AP与CP。
只有在有分区时,才可以在AP和CP操作之间进行选择。如果网络和硬件运行正常,您也可以吃蛋糕。
让我们讨论AP / CP的区别。
AP-有网络分区时,让独立的部分自由运行。
CP-当存在网络分区时,请关闭节点或禁止进行读写操作,从而导致确定性故障。
我喜欢可以同时实现这两种功能的体系结构,因为有些问题是AP,有些是CP-有些数据库可以同时做到。在CP和AP解决方案中,也有一些细微之处。
例如,在AP数据集中,您可能会出现读取不一致和生成写冲突的情况-这是两种可能的AP模式。可以将系统配置为具有高读取可用性的AP,但不允许写入冲突吗?或者您的AP系统可以使用强大而灵活的解析系统来接受写入冲突?您最终会需要两者吗,还是可以选择一个只需要一个的系统?
在CP系统中,如果有小分区(单个服务器),您将获得多少不可用性?更大程度的复制会增加CP系统中的不可用性,系统如何处理这些折衷?
这些都是与CP和AP有关的所有问题。
Brewer的“ 12年后”一书是该领域的热门读物。我相信这将清楚地推动CAP辩论,并强烈推荐。
http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed
一致性–当我们发送读取请求时,如果返回的是结果,它应该返回客户端请求给出的最新写入。可用性–您的读/写请求应始终成功。分区容限–发生网络分区(某些机器相互交谈的问题)时,系统仍应正常工作。
在简单的CAP定理中,分布式系统不可能同时提供所有三个保证:
我觉得在任何一个答案中分区容忍度都没有很好地解释,只是为了更详细地解释CAP定理的意思: