分布式概念基础
分布式CAP理论就好比分布式领域的牛顿定律,是分布式存储的理论基石。C:一致性,A:可用性,P:分区容错性。分布式系统往往需要部署在不同的服务器,也就存在网络断开的危险,这种网络断开即是网络分区。当网络分区发生时候,两个分布式节点无法正常通信,如果要保证数据一致性,则需要牺牲可用性来同步数据。若保证可用性,则需要牺牲一致性来确保分布式系统可用。所以,当网络分区发生时,一致性和可用性无法全部满足。如zookeeper基于CP,redis基于AP,eureka基于AP原则构建。
如何确保数据一致性?
zookeeper支持ZAB协议,主要作用:1.选举leader 2.同步节点直接的状态达到一致 3.广播消息
各个节点均保存一个事务队列,leader节点是收到请求保存下来,从节点事务队列是leader节点同步过来,所以leader节点事务队列最全,最新。各个节点均有可能成为leader节点,ZAB协议用一个整数表示任期,表示在系统运行过程中经历了多少次选举。用T代表事务,L代表事务队列,E代表任期
1.选举leader
a.各个从节点广播自己的最大的事务ID
b.获取其他节点发送的最大事务ID,选取最大事务ID所在的从节点,投票给该从节点
c.统计所有投票,投票数占一半以上的节点被选举为leader
2.同步数据
a.各个从节点向leader发送自己的任期E
b.leader比较任期,选择最大任期E,加1作为当前任期E,并将新的任期E广播给从节点
c.从节点接收并修改为leader节点同步的任期E,并返回给leader自己的最大的事务队列L
d.leader接收从节点同步的事务队列L,选择任期最大的事务队列L,如果多个队列任期数据相同,则选择事务编号最大的队列,将该队列作为leader队列,并广播给各个从节点
e.从节点以leader同步过来的事务队列,替换当前的事务队列,提交执行队列中的事务,至此各个节点数据达到一致,zookeeper正常运行
3.广播
a.leader节点接收到请求,将事务加入事务队列,并且将事务广播给各个从节点。
b.从节点接收事务并加入都事务队列,然后给leader发送准备提交请求。
c.leader接收到半数以上的准备提交请求后,提交事务同时向从节点 发送提交事务请求
d.从节点提交事务
如何确保数据消费顺序?
zookeeper各个节点均可接受请求,若当前节点非leader节点,把事务消息转发给leader节点,并保存事务ID,leader节点收到请求,把请求放在事务队列里面,并通过广播特性将事务同步给从节点,从节点比较事务ID和本身节点事务ID是否一致,若不一致,从节点退出,重新和leader同步。若一致,则响应给leader节点做准备提交commit请求,leader节点收到半数以上ack,则同步从节点提交commit请求。