一次网络分裂指的是,为了各自节点的优化,或者因为宕机,使得网络分离成独立子网的现象。例如,
在这种情况下,各个子网需要具备分裂容忍(partition-tolerant)的能力,保证情况发生时,仍然能正常工作。
CAP中的
分区容错性:单台服务器,或多台服务器出问题(主要是网络问题)后,正常服务的服务器依然能正常提供服务,并且满足设计好的一致性和可用性
重点在于:部分服务器因网络问题,业务依然能够继续运行
- Partition tolerance – if the network stops delivering messages between two sets of servers, will the system continue to work correctly?
作者:fleuria
链接:https://www.zhihu.com/question/54105974/answer/137969919
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"Partition Tolerance" 这个形容词确实挺容易 confuse 的,《A Critique of the CAP Theorem》文章曾这样批评:
we can interpret partition tolerance as meaning “a network partition is among the faults that are assumed to be possible in the system.”
It is misleading to say that an algorithm “provides partition tolerance,” and it is better to say that an algorithm “assumes that partitions may occur.”
至于 Network Partition 应当理解为 CAP 理论中讨论的故障模型,这里需要注意 Network Partition 并非节点 Crash(节点 Crash 属于 FLP 的故障模型),更侧重于 "节点双方一时联系不上对方" 的一个状态。
造成 Partition 的原因可能是网络不可达,也可能是 GC 的 Stop The World 阻塞太久,也可能是 CPU 彪到一个死循环上,总之种种血案。aphyr 曾整理过这么一批血案可以参考: aphyr/partitions-post
一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。
当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。
提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。
然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。
总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。
作者:知乎用户
链接:https://www.zhihu.com/question/54105974/answer/139037688
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。