Zookeeper数据同步

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 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 


555.jpg


可看到新增的节点已经为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数据同步


222.png


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

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
4月前
|
存储 数据库
zookeeper 集群环境搭建及集群选举及数据同步机制
zookeeper 集群环境搭建及集群选举及数据同步机制
74 2
|
算法
ZooKeeper-集群-ZAB协议与数据同步
前言 在前面两篇文章中,我们认识了什么是ZooKeeper,ZooKeeper有哪些功能,ZooKeeper集群,以及ZooKeeper集群中的选举机制。那么在ZooKeeper集群中,数据是如何在节点间同步的呢?数据同步过程中又会产生哪些问题又是如何解决的呢? 在下面这篇文章中,将为大家讲解
199 0
|
Apache 数据库
Apache ZooKeeper - ZooKeeper 集群中 Leader 与 Follower 的数据同步策略
Apache ZooKeeper - ZooKeeper 集群中 Leader 与 Follower 的数据同步策略
306 0
|
2月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
2月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
2月前
|
存储 负载均衡 Dubbo
分布式-Zookeeper(一)
分布式-Zookeeper(一)
|
4月前
|
监控 NoSQL Java
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
|
1月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
45 2
|
1月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
48 1
|
2月前
分布式-Zookeeper-数据订阅
分布式-Zookeeper-数据订阅
下一篇
无影云桌面