说明:整个架构学习总结是建立在李运华老师的课程之上。
对于设计分布式系统,CAP理论是非常重要的,CAP定理又被称作布鲁尔定理(Eric Brewer),2000年的ACM PODC 上提出的猜想。
在一个分布式系统中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。
虽然CAP理论定义是三个要素中只能取两个,但放到分布式环境下来思考,我们会发现必须选择P(分区容忍)要素,因为网络本身无法做到100%可靠,所以分区是一个必然的现象。如果我们选择了CA放弃了P,那么 当发生分区现象时,为了保证C,系统需要禁止写入,当有写入请求时,系统返回错误 ,这又和A冲突,因为A要求返回正确的响应,所以分布式系统理论上不可能选择CA架构,只能选择CP 或 AP 架构。
如上图,为了保证一致性,当发生分区现象后,N1节点上的数据已经更新到y,但由于N1和N2之意的复制通道中断,数据y无法同步到N2,N2节点上的数据还是x,这时客户端C访问N2时,N2需要返回error,提示客户端C系统发生了错误。这种处理违背了可用性的要求。因此CAP三者只能满足CP
如上图,为了保证可用性,当发生分区时,N1节点上的数据已经更新到y,但由于N1和N2之间的复制通道中断,数据y无法同步到N2,N2节点上的数据还是x,这时客户端C访问N2时,N2将自己拥有的x返回给了C,而实际上当前最新的数据已经是Y了,这就不满足一致性要求。因此CAP三者只能满足AP。注意:这里的N2节点返回x,虽然不是一个“正确”的结果,但是一个“合理”的结果。x并不是一个错乱的值,只是不是最新的数据而已。
CAP 关注的粒度是数据,而不是整个系统。所以在CAP理论落实践时,我们需要将系统内的数据按不同的应用场景和要求进行分类,选择CP或AP,而不是直接限定整个系统所有数据都是同一策略。
CAP是忽略网络延迟的,实际情况下,从节点A复制数据到节点B,总是要花费一些时间的。这就意味着CAP理论中的C在实践中不可能完善实现的,复制过程中,节点A和节点B的数据并不一致。如果业务上要求必须一致性(如:账户余额的写入,库存的写入,)只能单节点写入。这并不意味着这类系统无法应用分布式架构。我们可以将用户区分,0-100写Node1,100-200写Node2节点服务,对于单个用户的读、写只能在某个节点上完成。这种方案的弊端就是一个Node服务出现问题,将有部分用户不可用。
正常运行情况下,不存在CP和AP的选择,可以同时满足CA。所以设计架构时要考虑分区发生时选择CP还是AP,也要考虑分区没有发生时如何保证CA(数据及时性高用消息队列,要求不高的用数据库同步)。
CAP理论告诉我们三者只能取两个,需要“牺牲”另一个,这里的“牺牲”只是说在分区发现的情况下是保证A还是C,但并不意味着什么都不做。并不是永远的放弃A或者C,我们可以在分区期间进行一些处理,分区故障解决后(CP写日志,恢复后同步日志。AP分所时间合并内容),系统能够重新达到AC的状态。