参考蚂蚁课堂
1.Zookeeper不同节点的作用?
首先介绍一下zk集群中的leader节点和follower节点都是干啥的。每个follower节点都保存了leader节点的副本数据,全局保证了数据一致性,分布式读写分开,写的请求统一交给Leader实现,Follower或者是ObServer节点主要实现读的操作。如果你连接的是Follower节点或者ObServer节点然后你还要写的话,他会把这个写的请求转发给Leader节点,然后leader节点写完之后同步给Follower或ObServer节点。
2.ZAB原子广播协议
ZAB原子广播协议会保证各个节点的数据同步问题,ZAB采用两种模式第一种是恢复模式,第二种是广播模式。恢复模式就是当Leader宕机了再从剩下的Follower节点中选举出新的Leader。广播模式:解决每个节点的数据同步的问题。
当我们向zk集群中的leader发出一个事务请求的时候,我们的leader节点就会创建一个全局的zxid,即为事务id。这个zxid一定是唯一的,就算同一时刻有多个Follower向Leader节点发出写的请求,那么也不会造成线程不安全问题,因为他底层也有一个类似于synchronized的同步机制就算同时有多个写请求,他也会保证只生成唯一的全局zxid。
然后我们可以查看一下这个zxid,先连接一下zk客户端,./zkCli.sh -server 192.168.247.3:2181,然后通过ls /查看一下这台服务器上面有几个节点,然后get /节点名称即可查看节点的zxid
cZxid:数据节点创建时的事务ID
ctime:数据节点创建时的时间
mZxid:数据节点最后一次更新时的事务ID
mtime:数据节点最后一次更新的时间
pZxid:数据节点的子节点列表最后一次被修改(是子节点列表变更,而不是子节点内容)时的shiwuID
cversion:子节点的版本号
dataVersion:数据节点的版本号
aclVsersion:数据节点的ACL版本号
ephemeralOwner:如果节点时临时节点,则表示创建该节点的会话的SessionID;如果节点时持久节点,则该属性值为0
dataLength:数据内容的长度
numChildren:数据节点当前的子节点个数
至于说实现各个节点的同步问题,底层采用2PC两阶段提交协议
如图所示第一阶段Leader会带着zxid询问Follower是否允许同步数据,然后Follower会回复Leader一个ack,如果这个时候半数以上的Follower节点的回复都说可以的话那么Leader就会有第二阶段的提交,在第二阶段的过程中就会同步数据。
那么为什么我们写的请求必须统一交给leader,而不是follower节点实现呢?如果Follower也可以写的话,那么实现数据的同步将变得相当复杂,每个节点上都会产生新的数据。所以zookeeper是借鉴了分布式事务的2pc两阶段提交,选择了Leader作为中间的协调者从而更加方便的实现数据的同步。
3.zk选举底层实现原理
这个原理很简单,首先比较zxid,zxid大的被选为leader,如果zxid相同那么则会比较myid,谁大谁是leader。如果有过半机制已经选举出了leader,那么之后启动加入的节点不会加入选举。那么为什么zxid大的会被选举为leader,那我们要来看一下这个zxid的作用,当向leader节点发出一个写的请求的时候,leader上就会生成一个全局zxid,然后在同步数据的过程中第一阶段提交会带上zxid询问follower是不是可以同步数据,如果收到了确认回复那么在第二阶段提交的过程中会同步数据同时也会修改Follower的zxid。当有下一次写的请求leader还会生成一个新的比之前大的zxid,所以zxid代表了当前节点数据的更新情况,zxid越大说明数据越新,zxid默认为0。举个例子比如说在一个集群当中有一个leader和两个follower记为f1,f2,他们的myid分别为2,1,3现在leader收到了写的请求此时zxid变为1,然后开始数据同步此时f1同步成功,他的zxid为1,然后在对f2进行数据同步的时候,f2发生宕机,这时候数据没有被同步,所以zxid仍为0,然后leader宕机,f2重启的情况下,虽然f2的myid要大于f1,但是由于f1的zxid大于f2的zxid,说明f1的数据是最新的所以f1会被选举为leader。
4.分布式情况下网络抖动脑裂概念
如图所示原来的集群有一个leader节点,有4个follower节点,由于网络原因后两个follower无法和原来的leader节点通信,皇上不管我们了,直接斩木为旗,揭竿而起,自立为王,自行选举一个新的leader和朝廷分庭抗礼。这种现象成为脑裂。
5.分布式的基本理论CAP
- C:在分布式系统中的所有数据备份,在同一时刻必须要一致。
- A:在集群中部分节点宕机之后,仍然能够保证服务可用。
- P:分区容错 在分布式系统中网络分区存在的脑裂问题,部分Server与集群其他节点失去联系,无法组成一个群体。
我们在平时尽可能保证CP和AP,不能同时保证CA因为我们的服务器节点宕机之后,很难保证同一时刻同步问题。