• 4.ZK集群搭建&选举机制&数据同步机制


    集群

    集群角色

    • Leader:处理集群的所有事务请求,集群中只有一个Leader
    • Follower:只能处理读请求,参与Leader选举
    • Observer:只能处理读请求,提升集群读的性能,不能参与Leader选举

    集群搭建

    停止单机zk

    创建四个文件夹(四个节点,实际应该是多台服务器)

    /usr/local/zookeeperDataDir/zk2181
    /usr/local/zookeeperDataDir/zk2182
    /usr/local/zookeeperDataDir/zk2183
    /usr/local/zookeeperDataDir/zk2184

    创建myid文件

    每个文件夹创建一个myid文件,里面只有一个数字,不可重复,要和下方server.*配置一致

    创建四个zoo.cfg

    在conf文件夹下创建 zoo2181.cfg zoo2182.cfg zoo2183.cfg zoo2184.cfg

    每个cfg配置内容

    公共配置

    tickTime=2000
    initLimit=10
    syncLimit=5
    extendedTypesEnabled=true
    server.0=192.168.0.104:2281:2381
    server.1=192.168.0.104:2282:2382
    server.2=192.168.0.104:2283:2383
    server.3=192.168.0.104:2284:2384:Observer
    

    不同配置

    dataDir=/usr/local/zookeeperDataDir/zk2181
    dataLogDir=/usr/local/zookeeperDataDir/zk2181/log
    clientPort=2181
    #修改dataDir和dataLogDirzk218*以及clientPort
    

    说明

    • 2181端口是给客户端使用的

    • server.myid=服务器ip:zk间数据通讯端口:选举端口:Observer (可选)

      Observer为观察者节点,可选配

    查看

    status查看每个节点的模式

    ./zkServer.sh status  ../conf/zoo218*.cfg
    #可知道哪些Leader、Follower、Observer 分别是哪些
    

    连接集群

    shell命令连接

    ./zkCli.sh -server 192.168.0.104:2181,192.168.0.104:2182,192.168.0.104:2183,192.168.0.104:2184
    

    选举策略

    myid:每个节点配置的唯一序号

    zXid:每个节点的事务id,每次进行增删改都会加

    集群初始化选举流程

    前提

    • 初始化选举,没有任何数据,zXid必然都是0;
    • zookeeper通过zoo.cfg文件中service.*配置数量来确定一共有几个参与投票节点(Observer节点除外)

    假设

    有三个节点 A,B,C ,对应三个myid为 1,2,3

    • A节点启动,发现在已经运行的zookeeper中myid自己最大,A投票给A
    • 判断当前自己的投票数是否过半(此时一共三个节点参与选举,A才得一票,未过半,继续)
    • B节点启动,发现已经运行的zookeeper中myid自己最大(B和A比较),B投票给B,并且A也投票给B
    • 判断当前自己的投票数是否过半(此时一共三个节点参与选举,B得两票,已过半,Leader已选出)
    • C节点启动,发现已经有Leader了,自己变为Follower

    Leader崩溃选举策略

    选举触发机制

    Leader定期通过socket向Follower发送ping命令(没有内容的socket),Follower会定期去socket中查询ping命令,如果Leader崩溃,Follower则无法检测到,此时Follower将由“Follower”->"Looking"状态,进行选举

    策略

    逻辑和初始化选举流程一致,只不过在对比时,多了一个比较zXid,zXid越大的,说明数据越完整

    zXid 最大的>myId最大的

    数据同步机制

    1. 客户端向节点写数据
    2. 如果客户端连接的是Follower节点,Follower会将数据转交给Leader去操作
    3. Leader把数据写到自己的数据文件中,并给自己返回一个ACK
    4. Leader把数据发送给Follower
    5. Follower将数据写到本地数据文件,并给Leader返回ACK
    6. Leader收到过半的Follower的ACK后,自己执行Commit,将数据文件中数据写入到内存,并向Follower广播发送Commit命令
    7. Follower收到后执行Commit,将数据文件中数据写入到内存
    8. Commit后,其他客户端就可以访问到此数据
  • 相关阅读:
    【YBTOJ】【Luogu P4398】[JSOI2008]Blue Mary的战役地图
    【YBTOJ】【Luogu P2601】[ZJOI2009]对称的正方形
    Hystrix超时设置无效及解决原因
    nginx的压缩
    使用nginx配置本地yum 源
    通过nginx制作类似阿里云镜像下载的网站
    nginx下配置显示网站图标
    nginx---自定义日志格式和json日志
    git clone error: RPC failed; result=35, HTTP code = 0 fatal: The remote end hung up unexpectedly
    nginx---缓存
  • 原文地址:https://www.cnblogs.com/rb2010/p/16084205.html
Copyright © 2020-2023  润新知