在关于CAP定理的维基百科文章(https://en.wikipedia.org/wiki/CAP_theorem)中,它指出(大胆强调我的)“当选择一致性而非可用性时,系统将返回错误或超时如果由于网络分区而无法保证特定信息是最新的。“
如果是这样,不选择一致性超过可用性意味着我们也失去了分区容忍度?系统可能已启动,但如果它为我的所有数据访问返回错误,它有什么用处?或者,“网络分区”是否也意味着数据分区?换句话说,如果还暗示了数据分区,则至少知道某些数据部分是最新的,并且可以在满足一致性要求的同时返回。
答案 0 :(得分:2)
假设您有2个数据中心,每个数据中心都有一个单独的数据库,您的系统允许客户端连接到第一个或第二个数据中心。两个数据中心必须同步,因此它们之间存在网络链接。
现在想象一下,网络链接断开,数据库之间不再相互通信(这就是网络分区的意思)。 作为应用程序开发人员,您现在做什么?
你基本上有两个选择:
1)使系统可用,通过CAP定义表示:
系统中未发生故障的[数据库]节点收到的每个请求 必须导致[非错误]响应
请注意,在我们的示例中,两个节点都是非故障的(它们已启动并运行)。
换句话说,您可以允许来自两个数据中心的所有客户端写入和读取数据但是您松散一致性(请参阅下面的定义),因为1个数据库中的写入在另一个数据库中不可见。
2)使系统保持一致(注意它与ACID一致性无关),它通过CAP定义意味着线性化,简单来说就意味着如果写入发生,它必须由整个系统看到(既不是节点必须看到以前的状态)。
在我们的案例中,您需要拒绝来自其中一个数据中心的读取和写入,因此只有一个数据中心可以运行。这样的系统根本没用,并且您不会失去分区容错,因为您可以将所有客户端重新分配到操作数据库。
CAP定理存在很多混淆,我建议你阅读Martin Kleppmann撰写的一篇优秀博客文章,帮助我理解了很多关于这个主题的内容: https://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html