Zookeeper数据同步

目录

一、Zookeeper中角色

二、Observer集群搭建配置

传统方式

Docker方式

三、ZAB协议

四、Zookeeper数据同步


​​​​​​​

一、Zookeeper中角色

zookeeper服务器集群存在三种节点型

Leader(领导者):各个节点之间的老大,是集群中的核心。没有leader集群将不能工作。所有的写请求最终都会转交给领导者Leader执行;与跟随者(Follower)和观察者(Observer)进行心跳连接;数据同步到Follower和Observer。

Follower(追随者):跟随者自己不会执行写的操作,而是会将写的操作转交给Leader执行。负责处理Leader发来的请求和数据,当Leader宕机之后,会进行投票和选举(从剩余的Follwer),从而选举新的Leader。

观察者(observer):Observer同Follwer一样,也不能执行写操作,他的功能跟Follwer差不多。observer为用于提高读取吞吐量,减少选举的时候而生,因此Observer不能参与投票和选举。

二、Observer集群搭建配置

在这个基础上修改搭建ZooKeeper3.7.0集群(传统方式&Docker方式)

传统方式

dataDir =/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
#ip对应的是你的ip
server.1=192.168.6.137:2888:3888
server.2=192.168.6.138:2888:3888
server.3=192.168.6.139:2888:3888
server.4=192.168.6.139:2888:3888:observer
server.5=192.168.6.139:2888:3888:observer

Docker方式

#节点1
docker run -d -p 2181:2181 --name zookeeper_node01 --privileged --restart always --network zoonet --ip 172.18.0.2 \
-v /data/zookeeper/cluster/zk1/data:/data \
-v /data/zookeeper/cluster/zk1/datalog:/datalog \
-v /data/zookeeper/cluster/zk1/logs:/logs \
-e ZOO_MY_ID=1 \
-e "ZOO_SERVERS=server.1=172.18.0.2:2888:3888;2181 server.2=172.18.0.3:2888:3888;2181 server.3=172.18.0.4:2888:3888;2181 server.4=172.18.0.5:2888:3888:observer;2181 server.5=172.18.0.6:2888:3888:observer;2181" zookeeper 
#节点2
docker run -d -p 2182:2181 --name zookeeper_node02 --privileged --restart always --network zoonet --ip 172.18.0.3 \
-v /data/zookeeper/cluster/zk2/data:/data \
-v /data/zookeeper/cluster/zk2/datalog:/datalog \
-v /data/zookeeper/cluster/zk2/logs:/logs \
-e ZOO_MY_ID=2 \
-e "ZOO_SERVERS=server.1=172.18.0.2:2888:3888;2181 server.2=172.18.0.3:2888:3888;2181 server.3=172.18.0.4:2888:3888;2181 server.4=172.18.0.5:2888:3888:observer;2181 server.5=172.18.0.6:2888:3888:observer;2181" zookeeper 

#节点3
docker run -d -p 2183:2181 --name zookeeper_node03 --privileged --restart always --network zoonet --ip 172.18.0.4 \
-v /data/zookeeper/cluster/zk3/data:/data \
-v /data/zookeeper/cluster/zk3/datalog:/datalog \
-v /data/zookeeper/cluster/zk3/logs:/logs \
-e ZOO_MY_ID=3 \
-e "ZOO_SERVERS=server.1=172.18.0.2:2888:3888;2181 server.2=172.18.0.3:2888:3888;2181 server.3=172.18.0.4:2888:3888;2181 server.4=172.18.0.5:2888:3888:observer;2181 server.5=172.18.0.6:2888:3888:observer;2181" zookeeper 
#节点4
docker run -d -p 2184:2181 --name zookeeper_node04 --privileged --restart always --network zoonet --ip 172.18.0.5 \
-v /data/zookeeper/cluster/zk4/data:/data \
-v /data/zookeeper/cluster/zk4/datalog:/datalog \
-v /data/zookeeper/cluster/zk4/logs:/logs \
-e ZOO_MY_ID=4 \
-e PEER_TYPE=observer \
-e "ZOO_SERVERS=server.1=172.18.0.2:2888:3888;2181 server.2=172.18.0.3:2888:3888;2181 server.3=172.18.0.4:2888:3888;2181 server.4=172.18.0.5:2888:3888:observer;2181 server.5=172.18.0.6:2888:3888:observer;2181" zookeeper 
#节点5
docker run -d -p 2185:2181 --name zookeeper_node05 --privileged --restart always --network zoonet --ip 172.18.0.6 \
-v /data/zookeeper/cluster/zk5/data:/data \
-v /data/zookeeper/cluster/zk5/datalog:/datalog \
-v /data/zookeeper/cluster/zk5/logs:/logs \
-e ZOO_MY_ID=5 \
-e PEER_TYPE=observer \
-e "ZOO_SERVERS=server.1=172.18.0.2:2888:3888;2181 server.2=172.18.0.3:2888:3888;2181 server.3=172.18.0.4:2888:3888;2181 server.4=172.18.0.5:2888:3888:observer;2181 server.5=172.18.0.6:2888:3888:observer;2181" zookeeper 

 可看到新增的节点已经为Observer角色了。

三、ZAB协议

Zookeeper Atomic Broadcast (ZAB) :ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为zookeeper原子消息广播协议的协议作为其数据一致性的核心算法。所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器称为Leader服务器,而余下的其他服务器则成为Follower服务器。Leader服务器负责将一个客户端事务请求转换成一个事务Proposal(提议),并将该Proposal分发给集群中所有的Follower服务器。之后Leader服务器需要等待所有Follower服务器的反馈,一旦超过半数的Follower服务器进行了正确反馈后,那么Leader就会再次向所有的Follower服务器分发Commit消息,要求其将前一个Proposal进行提交。

Zookeeper 的核心是原子广播机制,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模式和广播模式。

恢复模式
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数server 完成了和 leader 的状态同步以后,退出恢复模式进入广播模式。状态同步保证了 leader 和 server 具有相同的系统状态。

广播模式
一旦 leader 已经和多数的 follower 进行了状态同步后,它就可以开始广播消息了,即进入广播状态。这时候当一个 server 加入 ZooKeeper 服务中,它会在恢复模式下启动,自觉的发现 leader,并和 leader 进行状态同步。待到同步结束,它也退出恢复模式,进入广播模式。ZooKeeper 服务一直维持在 Broadcast 状态,直到 leader 崩溃了或者 leader 失去了大部分的 followers 支持。

四、Zookeeper数据同步

1、leader 接受到消息请求后,将消息赋予给一个全局唯一的64位自增id,叫:zxid。
2、leader 为每个follower 准备了一个FIFO队列(通过TCP协议来实现,以实现了全局有序这个特点)将带有zxid的消息作为一个提案(proposal)分发给所有的follower。
3、当follower接受到proposal,先把proposal写到磁盘,写入成功以后再向leader恢复一个ack
4、当leader 接受到合法数量(超过半数节点)的 ack,leader 就会向这些follower发送commit命令,同时会在本地执行该消息
5、当follower接受到消息的commit命令以后,就会提交该消息。

参考:https://blog.csdn.net/qq_39938758/article/details/105754198

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熟透的蜗牛

永远满怀热爱,永远热泪盈眶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值