博客 分布式应用程序协调服务 ZooKeeper 详解

分布式应用程序协调服务 ZooKeeper 详解

   数栈君   发表于 2023-10-12 11:47  220  0

ClickHouse需要依赖ZooKeeper使用,本文对ZooKeeper做简单介绍。

一、ZooKeeper定义

ZooKeeper译名为“动物园管理员”。各个子系统就好比动物园里的动物,为了使各个子系统能正常为用户提供统一的服务,必须需要一种机制来进行协调——这就是ZooKeeper。
ZooKeeper是一个开源的分布式协调服务。分布式应用程序可以基于 ZooKeeper实现如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列等功能。原本是Apache Hadoop的一个组件,现在被拆分为一个Hadoop的独立子项目,在HBase(Hadoop的另外一个被拆分出来的子项目,用于分布式环境下的超大数据量的DBMS)中也用到了ZooKeeper集群。设计目的是为了减轻分布式应用程序所承担的协调任务,通过选举算法和集群复制可以避免单点故障。

二、ZooKeeper特性

1 Zookeeper为一个leader,多个follower组成的集群
2 全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的
3 分布式读写,更新请求转发,由leader实施
4 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
5 数据更新原子性,一次数据更新要么成功,要么失败
6 实时性,在一定时间范围内,client能读到最新数据
三、ZooKeeper的配置文件

Zookeeper 配置并不多,每个节点的配置文件zoo.cfg都是一样的,只有myid文件不一样。myid的值必须是zoo.cfg中server.的数值。

tickTime=2000 基本时间单元,代表发送心跳的间隔时间,单位毫秒
initLimit=30000 tickTime的倍数,follower和leader之间的最长心跳时间
syncLimit=10 tickTime的倍数,leader和follower之间发送消息,请求和应答的最大时间
dataDir=/zookeeper/data 持久化数据目录
dataLogDir=/zookeeper/logs 日志目录,如果没设定,默认和dataDir相同
clientPort=2181 监听client连接的端口号
maxClientCnxns=2000 zookeeper最大连接
maxSessionTimeout=60000000 最大的会话超时时间
autopurge.snapRetainCount=10 保留snapshot的文件数目,默认3个
autopurge.purgeInterval=1 自动清理snapshot和事务日志,清理频率,单位是小时
globalOutstandingLimit=200 等待处理的最大请求数量,server端会拒绝client的请求,每一个client至少能有一个outstanding请求
preAllocSize=131072 日志文件大小kb,切换快照生成日志
snapCount=3000000 两次事务快照之间可执行事务的次数,默认的配置值为100000
leaderServes=yes leader是否接受client请求,默认为yes即leader可以接受client的连接,当节点数为>3时,建议关闭
standaloneEnabled=false 是否启用独立模式
server.1=IP01:2888:3888 服务编号,2888leader\follower传输信息端口,3888推举端口
server.2=IP02:2888:3888 服务编号,2888leader\follower传输信息端口,3888推举端口
server.3=IP03:2888:3888 服务编号,2888leader\follower传输信息端口,3888推举端口
server.4=IP04:2888:3888:observer 服务编号,observer可以认为是主的clone copy,不参与投票,缩短选举时间
server.5=IP05:2888:3888:observer 服务编号,observer可以认为是主的clone copy,不参与投票,缩短选举时间
四、ZooKeeper数据结构

ZooKeeper路径起始为 /,子节点必须是绝对路径,如同Unix系统中的文件路径



五、ZooKeeper节点数据结构属性

Zxid ZooKeeper状态的每一次改变,都对应着一个递增的Transaction id,该id称为zxid,全局唯一
Session 在client和server通信之前,首先需要建立连接,该连接称为session。连接建立后,如果发生连接超时、授权失败或者显式关闭连接,连接便处于CLOSED状态,此时session结束。
persistent persistent节点不和特定的session绑定,不会随着创建该节点的session的结束而消失,而是一直存在,除非该节点被显式删除。
ephemeral ephemeral节点是临时性的,如果创建该节点的session结束了,该节点就会被自动删除。使用-e参数指定创建ephemeral节点。
watch watch的意思是监听感兴趣的事件。在命令行中,以下几个命令可以指定是否监听相应的事件。
ticks 当在使用多机ZooKeeper服务时,服务器之间会使用ticks票据来定义事件(比如状态上传、会话超时、连接超时等等)的计时
[zk:localhost:2181(CONNECTED)5]stat /Apps/App1/SunApp1

cZxid = 0x700000005 节点创建时的zxid
ctime = Tue Oct 16 09:54:34 CST 2018 节点创建时的时间
mZxid = 0x700000005 节点最新一次更新发生时的zxid
mtime = Tue Oct 16 09:54:34 CST 2018

节点最新一次更新发生时的时间
pZxid = 0x735fb57ac 与该节点的子节点(或该节点)的最近一次创建或删除的时间戳对应
cversion = 2 子节点版本号
dataVersion = 0 节点数据的版本号
aclVersion = 0 节点ACL(授权信息)的版本号
ephemeralOwner = 0x0
如果该节点是临时节点,则值为该节点绑定的session id;

如果ephemeralOwner值为0,则该节点不是临时节点

dataLength = 0 节点数据的字节数
numChildren = 2 子节点个数
六、ZooKeeper集群

通常Zookeeper由2n+1台servers组成,每个server都知道彼此的存在。每个server都维护的内存状态镜像以及持久化存储的事务日志和快照。为了保证Leader选举能过得到多数的支持,所以ZooKeeper集群的数量一般为奇数。对于2n+1台server,只要有n+1台(大多数)server可用,整个系统保持可用。



领导者(leader),负责进行投票的发起和决议,更新系统状态。

学习者(learner),包括跟随者(follower)和观察者(observer)。

follower用于接受客户端请求并向客户端返回结果,在选主过程中参与投票

observer可以接受客户端请求,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度。

客户端(client),请求发起方,读请求直接由本地的复制数据库提供数据。

七、ZooKeeper Server主要组件



Request processor(请求处理器):包含多种接口。对每个请求,都是通过生产链的方式,一步步地进行处理。比如:

PreRequestProcessor一般是放在处理链的起始部分的,它对请求做一些预处理,如检查Session、检查要操作的节点及其父节点是否存在、检查客户端是否有权限等;

ProposalRequestProcessor用于向Follower发送Proposal,来完成ZAB算法;

SyncRequestProcessor用于将请求持久化到磁盘中;

Atomic Broadcast(ZAB协议):实现了主备模式下的系统架构,保持集群中各个副本之间的数据一致性。ZAB协议定义了选举(election)、发现(discovery)、同步(sync)、广播(Broadcast)四个阶段。

Replicated database(复制的数据库):是一个内存数据库,包含整个数据树。为了可恢复,更新会被log到磁盘,并且在更新这个内存数据库之前,先序列化到磁盘。

八、ZooKeeper 角色选举

上面我们知道zookeeper集群有三种角色:leader、follower、observer

一个zookeeper有三种状态:

looking:选举状态,当前没有leader;

leading:leader才有的状态;

following:follower才有的状态;

当集群新建,或者主机死机,或者主机与一半或以上的从机失去联系后,都会触发选择新的主机操作。有两种算法 fast paxos和 basic paxos,默认为 fast paxos。



observer角色不参与投票,可以缩短选举时间。

每次选举都要把选举轮数加一,类似于zxid里的epoch字段,防止不同轮次的选举互相干扰。

每个进入looking状态的节点,最开始投票给自己,然后把投票消息发给其它机器。内容为<第几轮投票,被投节点的zxid,被投节点的编号>。

其他looking状态的节点收到后,首先判断票是否有效,是否有效的方法为看票的投票轮数和本地记载的投票轮数是否相等:

4.1 如果比本地投票轮数的小,丢弃。

4.2 如果比本地投票轮数的大,证明自己投票过期了,清空本地投票信息,更新投票轮数和结果为收到的内容。通知其他所有节点新的投票方案。

4.3 如果和本地投票轮数相等,按照投票的优先级比较收到的选票和自己投出去的选票。

4.3.1 如果收到的优先级大,更新自己的投票为对方发过来投票方案,把投票发出去。

4.3.2 如果收到的优先级小,则忽略该投票。

4.3.3 如果收到的优先级相等,则更新对应节点的投票。

每收集到一个投票后,查看已经收到的投票结果记录列表,看是否有节点能够达到一半以上的投票数。如果有达到,则终止投票,宣布选举结束,更新自身状态。然后进行发现和同步阶段。 否则继续收集投票。

fast paxos和basic paxos区别
这里fast是主动推送出,只要结果有更新,就马上同步给其他节点。其他节点可能还没把自己的票通知给所有节点,就发现自己投的票优先级低,要更新投票,然后更新再重新通知给所有节点。
basic则要每一节点都询问完,才能知道新结果,然后再去问其他节点新的选举结果。
fast比basic快的地方,是一个节点不用和每个节点都交换投票信息后,才能知道自己的票是否要更新,可减少交互次数。

九、ZooKeeper命令

运行 ./zkCli.sh进入命令行工具

1、ls查看某个节点的子节点信息,绝对路径

[zk:localhost:2181(CONNECTED)1] ls /

2、create创建一个新的znode

[zk:localhos:2181(CONNECTED)2] create /Apps "data"

3、get获取znode信息

[zk:localhost:2181(CONNECTED)3] get /Apps

4、set更新znode内容

[zk:localhost:2181(CONNECTED)4] set /Apps "new"

5、stat获取znode信息,同get

[zk:localhost:2181(CONNECTED)5] stat /Apps

6、delete删除znode,子节点不被删除

[zk:localhost:2181(CONNECTED)6] delete /Apps

7、rmr删除znode及子节点

[zk:localhost:2181(CONNECTED)7] rmr /Apps

8、ls2是ls的增强版,比ls命令多输出本节点信息

[zk:localhost:2181(CONNECTED)8] ls2 /Apps

9、listquota命令用于显示配额

[zk:localhost:2181(CONNECTED)9] listquota /Apps

10、setquota命令用于设置节点个数以及数据长度的配额

[zk:localhost:2181(CONNECTED)10] setquota -n 2 /Apps

[zk:localhost:2181(CONNECTED)11] setquota -b 10 /Apps

11、delquota命令用于删除配额

[zk:localhost:2181(CONNECTED)12] delquota -n 2

12、redo用于再次执行某个命令,配合history使用

[zk:localhost:2181(CONNECTED)13] redo id

13、addauth命令用于节点认证

[zk:localhost:2181(CONNECTED)14] addauth digest username:password

14、setAcl命令用于设置节点Acl

[zk:localhost:2181(CONNECTED)15] setAcl world:anyone:cdrwa

15、获取节点的Acl

[zk:localhost:2181(CONNECTED)16] getAcl /Apps

16、sync命令用于强制同步

[zk:localhost:2181(CONNECTED)17] sync /Apps

17、printWatchers命令用于设置和显示监视状态

[zk:localhost:2181(CONNECTED)18] printwatches on

18、connect命令用于连接其他主机

[zk:localhost:2181(CONNECTED)19] connect host:port



免责申明:


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群