为什么 CP 系统不能也是 CAP?
Why can't CP systems also be CAP?
我对CAP缩写的理解如下:
- Consistent:每次读取都会得到最近的写入
- A可用:每个节点都可用
- Partion Tolerant:当节点间的网络连接中断时,系统可以继续维护A和C的承诺
假设我的理解或多或少是正确的,那么有件事困扰着我。
据我所知,可用性是通过以下任何技术实现的:
- 负载均衡
- 复制到灾难恢复系统
所以如果我有一个我已经知道是CP的系统,为什么我不能“让它完全CAP”应用其中一种技术使其也可用?我确定我在这里遗漏了一些重要的东西,只是不确定是什么。
是分区容错,你搞错了
只要不发生任何分区,系统就可以保持一致且可用。有 CA 系统说,我们不关心分区。您可以将它们 运行 放在带有服务器硬件的机架中,并且极不可能进行分区。问题是,如果发生分区怎么办?
系统可以选择
- 继续提供服务,希望其他服务器宕机而不是提供相同的服务并提供不同的数据 - 选择 可用性 (AP)
- 停止提供服务,因为它无法再保证一致性,因为它不知道另一台服务器是否已关闭或实际上已启动 运行ning 以及这两者之间的通信中断关闭 - 选择 一致性 (CP)
CAP定理的思想是你不能同时提供可用性和一致性,一旦发生分区,你要么追求可用性并希望最好,要么发挥它安全且不可用,但始终如一。
这里有 2 个很棒的帖子,应该说清楚了:
- You Can’t Sacrifice Partition Tolerance 展示了这样的想法,即每个真正的分布式系统现在都需要处理分区,因此 CA 系统将在第一次出现分区时立即崩溃
- CAP Twelve Years Later: How the "Rules" Have Changed 稍微更新一点,并且更灵活地展示了 CAP 定理,开发人员可以在其中选择应用程序在分区期间的行为方式,并且可以牺牲一点一致性来获得一些可用性,...
所以最后回答你的问题,如果你采用 CP 系统并更频繁地复制它,你可能 运行 进入系统节点之间发送的消息的开销以保持其一致性,或者 -如果大部分节点发生故障或发生网络分区而没有任何部分拥有明显多数,它将无法继续运行,因为它无法再保证一致性。但是,是的,这些界线现在变得越来越模糊,我认为我提供的参考资料会让您更好地理解。
我对CAP缩写的理解如下:
- Consistent:每次读取都会得到最近的写入
- A可用:每个节点都可用
- Partion Tolerant:当节点间的网络连接中断时,系统可以继续维护A和C的承诺
假设我的理解或多或少是正确的,那么有件事困扰着我。
据我所知,可用性是通过以下任何技术实现的:
- 负载均衡
- 复制到灾难恢复系统
所以如果我有一个我已经知道是CP的系统,为什么我不能“让它完全CAP”应用其中一种技术使其也可用?我确定我在这里遗漏了一些重要的东西,只是不确定是什么。
是分区容错,你搞错了
只要不发生任何分区,系统就可以保持一致且可用。有 CA 系统说,我们不关心分区。您可以将它们 运行 放在带有服务器硬件的机架中,并且极不可能进行分区。问题是,如果发生分区怎么办?
系统可以选择
- 继续提供服务,希望其他服务器宕机而不是提供相同的服务并提供不同的数据 - 选择 可用性 (AP)
- 停止提供服务,因为它无法再保证一致性,因为它不知道另一台服务器是否已关闭或实际上已启动 运行ning 以及这两者之间的通信中断关闭 - 选择 一致性 (CP)
CAP定理的思想是你不能同时提供可用性和一致性,一旦发生分区,你要么追求可用性并希望最好,要么发挥它安全且不可用,但始终如一。
这里有 2 个很棒的帖子,应该说清楚了:
- You Can’t Sacrifice Partition Tolerance 展示了这样的想法,即每个真正的分布式系统现在都需要处理分区,因此 CA 系统将在第一次出现分区时立即崩溃
- CAP Twelve Years Later: How the "Rules" Have Changed 稍微更新一点,并且更灵活地展示了 CAP 定理,开发人员可以在其中选择应用程序在分区期间的行为方式,并且可以牺牲一点一致性来获得一些可用性,...
所以最后回答你的问题,如果你采用 CP 系统并更频繁地复制它,你可能 运行 进入系统节点之间发送的消息的开销以保持其一致性,或者 -如果大部分节点发生故障或发生网络分区而没有任何部分拥有明显多数,它将无法继续运行,因为它无法再保证一致性。但是,是的,这些界线现在变得越来越模糊,我认为我提供的参考资料会让您更好地理解。