节点间地分区故障是必然发生地,也就是说分区容错性§是必须保证的前提。
所以要么选择一致性,组成AP。
要么选择可用性,保证服务可用。
CP含义:
一定会读到最新地数据,不会读到旧数据。但如果因为消息丢失、延迟过高发生了网络分区,那么此时,当集群节点接收到来自客户端地请求时,为了不破坏一致性,可能会因为无法相应最新数据,而返回出错信息。
cp模型适合要求acid场景,比如银行转账。
AP含义:
系统将始终处理客户端地查询,返回特定信息,如果发生了网络分区,一些节点将无法返回最新地特定信息,它们将返回自己当前相对新地信息。
注意,在不存在网络分区地时候,也就是不需要P时,C和A能够同时保证。(网络分区是指因为网络故障导致网络不连通,不同节点分布在不同的子网络中,各个子网络内网络正常。其实,你可以这么理解,节点之间的网络通讯出现了消息丢失、高延迟的问题。)
ap模型适合只要求base的场景,比如网页cdn场景。
常用数据库的CAP模型
CA 模型,在分布式系统中不存在。因为舍弃 P,意味着舍弃分布式系统,就比如单机版关系型数据库 MySQL,如果 MySQL 要考虑主备或集群部署时,它必须考虑 P
CP 模型,采用 CP 模型的分布式系统,舍弃了可用性,一定会读到最新数据,不会读到旧数据。一旦因为消息丢失、延迟过高发生了网络分区,就影响用户的体验和业务的可用性(比如基于 Raft 的强一致性系统,此时可能无法执行读操作和写操作)。典型的应用是 Etcd,Consul 和 Hbase。
AP 模型,采用 AP 模型的分布式系统,舍弃了一致性,实现了服务的高可用。用户访问系统的时候,都能得到响应数据,不会出现响应错误,但会读到旧数据。典型应用就比如 Cassandra 和 DynamoDB。
总结
一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。