原博主->www.zhihu.com/question/54…
一个分布式系统里面,多个节点之间的网络本来应该是连通的。然而可能因为网络故障,使得系统中的多个节点之间网络断开,整个网络就分成了几块区域,数据散布在这些不连通的区域中,这就叫网络分区。
若数据项只在一个节点中保存,当网络分区出现后,和这个节点不连通的部分就访问不到这个数据,这时出现的网络分区就没有容错性。
提高分区容错性的办法就是将一个数据项复制到多个节点上,当出现网络分区后,因数据项分布在多个网络分区里,容错性就提高了。
然而,要把数据复制到多个节点,就会带来数据一致性问题(C),多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这种等待又会带来可用性(A)的问题。
总的来说就是,数据存在的节点越多,分区容错性越高,但要复制更新的数据就越多,一致性(C)就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性(A)就会降低,这也是为什么无法同时保证CAP同时成立的原因,只能实现CP或者AP中的一种,即“三选二”,甚至是“二选一”(C或A)。