1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了, 整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。 当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。 提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。 然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。 要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。 总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。 为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。
综上,CAP 理论实际上是要在可用性和一致性之间做权衡。 可用性和一致性往往是冲突的,很难使它们同时满足。在多个节点之间进行数据同步时, 为了保证一致性(CP),不能访问未同步完成的节点,也就失去了部分可用性; 为了保证可用性(AP),允许读取所有节点的数据,但是数据可能不一致。 通常采取的策略是保证可用性,牺牲部分一致性,只确保最终一致性。 当然,牺牲一致性,并不是完全不管数据的一致性,否则数据是混乱的,那么系统可用性再高分布式再好也没有了价值。 牺牲一致性,只是不再要求关系型数据库中的强一致性,而是只要系统能达到最终一致性即可,考虑到客户体验, 这个最终一致的时间窗口,要尽可能的对用户透明,也就是需要保障“用户感知到的一致性”。 通常是通过数据的多份异步复制来实现系统的高可用和数据的最终一致性的,“用户感知到的一致性”的时间窗口则取决于数据复制到一致状态的时间。
|