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后,其他客户端就可以访问到此数据
posted @ 2022-03-31 21:29  RollBack2010  阅读(239)  评论(0编辑  收藏  举报