3

In the wikipedia article on CAP Theorem( https://en.wikipedia.org/wiki/CAP_theorem ), it states (bold emphasis mine) "When choosing consistency over availability, the system will return an error or a time-out if particular由于网络分区,无法保证信息是最新的。”

如果是这样,选择一致性而不是可用性是否意味着我们也失去了分区容忍度?系统可能已启动,但如果它对我的所有数据访问都返回错误,那有什么好处?或者,“网络分区”是否也意味着数据分区?换句话说,如果还隐含了数据分区,则至少部分数据已知是最新的,并且可以在满足一致性要求的同时返回。

4

1 回答 1

4

假设您有 2 个数据中心,每个数据中心都有一个单独的数据库,并且您的系统允许客户端连接到第一个或第二个数据中心。两个数据中心必须同步,因此它们之间存在网络链接。

现在想象一下网络链接断开,数据库之间无法再相互通信(这就是网络分区的含义)。作为应用程序开发人员,您现在做什么?

你基本上有2个选择:

1) 使系统可用,根据 CAP 定义,这意味着:

系统中非失败 [database] 节点收到的每个请求都必须产生 [non-error] 响应

请注意,在我们的示例中,两个节点均未发生故障(它们已启动并正在运行)。

换句话说,您可以允许来自两个数据中心的所有客户端写入和读取数据,但您会失去一致性(请参阅下面的定义),因为在一个数据库中的写入在另一个数据库中是不可见的。

2)使系统一致(注意它与ACID一致性无关),CAP定义的意思是线性化,简单来说就是如果写发生了,它必须被整个系统看到(两个节点都不能看到)之前的状态)。

在我们的例子中,这意味着您需要拒绝来自其中一个数据中心的读取和写入,因此只有一个数据中心可以运行。这样的系统一点也不无用,您也不会放松分区容忍度,因为您可以将所有客户端重新路由到操作数据库。

关于 CAP 定理有很多困惑,我建议您阅读 Martin Kleppmann 的一篇出色的博客文章,它帮助我了解了很多关于这个主题的知识: https ://martin.kleppmann.com/2015/05/11/please -stop-calling-databases-cp-or-ap.html

于 2017-10-06T12:58:51.020 回答