以下举例三台集群的模型图:
image.pngzookeeper的从节点能写数据吗?
当写数据的请求到达从节点的时候,请求会被转发到leader节点,由leader节点将数据同步到其他follower节点。所有的写操作有leader发起。
leader如何同步数据到follower节点?
类似2PC(两阶段提交,需要等到所有节点返回ack),实际是ZAB协议的过半机制:
1、leader发起写事务给各个从节点,如上图的propose。
2、从节点收到写事务后,会对leader有一个应答ack。
3、leader收到半数以上的ack后(过半协议),发起事务提交commit。
主节点挂了,投票选举原理
当leader挂了,集群需要从其他的从节点选出一个新的leader。
在选举的过程中,有两个主要的信息:
1)myid:当前节点的id
2)zxid:当前事务的id
当选举发生时,需要去比较这两个信息的大小,选举的比较会发生很多轮,最终获胜的会被选举为leader。
通过一下场景模拟zk选举的过程:
如开篇图有三个节点,假设左侧节点的myid为1,leader的myid为2,右侧节点的myid为3。
当数据正在同步时发生了主节点宕机,这时候选举开始,可能存在以下情况:
左侧从节点可能存在的信息(myid,zxid)为:(1,101);
右侧从节点可能存在的信息为:(3,102);
这时候以上两个节点需要进行比较:
第一轮投票,所有的节点会优先投给自己,这时候投票比例是1:1,则需要对这两个节点的事务id进行pk比较,右侧节点的事务id大于左侧节点(事务id越大则表示数据越新,则丢失数据越少),左侧节点pk失败了,进行下一轮投票。
第二轮投票开始,由于左侧节点上一轮pk失败,所以此次也投票给了右侧节点,此时右侧获得两票,超过了半数,所以右侧节点成为新节点。
当事务id相同时,则比较myid,当myid越大,则权重越大。
ZAB协议
1)leader选举原理(myid,zxid)
2)集群消息广播(类似2PC-两阶段提交,无需全部节点ack,过半即发起commit)
脑裂,为什么集群通常要奇数部署?
脑裂:当集群分布在不同机房时,机房间可能出现网络断开,这时候内部的节点是可以通信的,会导致每个机房内都选举出一个leader,导致脑裂。网络恢复后,就会有两个leader,数据如何合并,会导致问题。
奇数部署:过半机制
Quorums(ˈkwôrəm 法定人数) ,比如3个节点的集群,Quorums = 2, 也就是说集群可以容忍1个节点失效,这时候还能选举出1个lead,集群还可用。比如4个节点的集群,它的Quorums = 3,Quorums要超过3,相当于集群的容忍度还是1,如果2个节点失效,那么整个集群还是无效的
网友评论