zookeeper集群原理简介

作者: 我犟不过你 | 来源:发表于2020-11-13 09:16 被阅读0次

    以下举例三台集群的模型图:

    image.png

    zookeeper的从节点能写数据吗?

    当写数据的请求到达从节点的时候,请求会被转发到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个节点失效,那么整个集群还是无效的

    相关文章

      网友评论

        本文标题:zookeeper集群原理简介

        本文链接:https://www.haomeiwen.com/subject/qhupbktx.html