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最大的
数据同步机制
- 客户端向节点写数据
- 如果客户端连接的是Follower节点,Follower会将数据转交给Leader去操作
- Leader把数据写到自己的数据文件中,并给自己返回一个ACK
- Leader把数据发送给Follower
- Follower将数据写到本地数据文件,并给Leader返回ACK
- Leader收到过半的Follower的ACK后,自己执行Commit,将数据文件中数据写入到内存,并向Follower广播发送Commit命令
- Follower收到后执行Commit,将数据文件中数据写入到内存
- Commit后,其他客户端就可以访问到此数据