Zookeeper
- 分布式应用的协调服务
设计目标
简单
- zk允许分布式进程通过共享命名空间相互协调
- 共享命名空间类似标准的文件系统
- 命名空间有数据寄存器组成(zk称作znodes),设计用于存储
- zk的数据存放在内存中,所以可以做到高吞吐量和低延迟
可复制
- zookeeper可悲复制到一组主机上作为一个整体,zk服务彼此之间知道各位的存在,共同维护了一个内存镜像,连同事务日志和快照集一起持久化存储。只要大多数服务可用,则zk服务可用
- zk客户端仅连接一个单独的zk服务端,如果断了将会连接其他服务端
有序
- zk为每个更新标记了序号,它反应了zk事务的顺序。并发操作可利用这个序号。
快速
- 读非常快
- 理想读写比 10 :1
数据模型与分层命名空间
节点与临时节点
- zk命名空间中每个节点都存有与子节点相关的数据
- 命名空间中znodes存储的数据是被原子性读写的,读获取znode相关全部数据,写操作覆盖全部数据
- 每个节点都有一个访问控制列表(ACL:Access Control List)来限制什么人干什么事
- 临时节点:存在时间和会话一致,会话创建时znode生效,会话结束znode被删除
znodes的数据结构
- 数据变更的版本号
- ACL变更
- 时间戳
有条件更新和监视
- zk支持watches的概念,客户端可设置一个watch
- znode改变是会触发或删除watch
- 当watch被触发时,客户端会受到一个说znode已改变的包
- 如果客户端和zk服务器之间的连接中断,客户端或收到一个本地通知
保障
zk设计上提供的一套保障
- Sequential Consistency(顺序一致性) - 按照客户端的发送顺序进行更新。
- Atomicity(原子性)- 更新或成功或失败。不会有中间态的部分结果。
- Single System Image(单一系统镜像) - 无论客户端或服务器,连接到服务端后都能看到同样的视图。
- Reliability(可靠性) - 一旦应用一个更新,它将留存到客户端覆盖本次更新为止。
- Timeliness(时效性) - 在一段时间内保证系统的客户端视图是最新的。
简单的API
zk设计上仅支持以下操作,确保简单性
- _ create _ :在树的某个位置创建一个节点
- _ delete _ :删除一个节点
- _ exists _ :测试某个位置的节点是否存在
- _ get data _ :从节点中获取数据
- _ set data _ :将数据写入节点中
- _ get children _ :获取子节点的列表
- _ sync _ :等待数据同步
实现
zookeeper组件
- 请求处理器
- 除了请求处理器,构成zookeeper服务的每个服务端的副本集都拷贝自它的每个组件
- 副本集数据库
- 一个内存数据库,包含了整个数据树
- 更新日志序列化后记录在磁盘用来恢复数据
- 原子性广播协议(ZAB)
安装
单机版
- 解压安装包
- 编辑zoo.cfg
- 启动服务端
- 客户端连接验证
集群版
- 通单机版,额外多配置几个参数
zoo.cfg配置参数
- tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
- initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒
- syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 52000=10秒
- dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
- clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
- server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
命令
- 启动服务端:
bin/zkServer.sh start - 启动客户端连接:
bin/zkCli.sh -server IP:PORT
文档信息
- 本文作者:Ling He
- 本文链接:https://GoggleHe.github.io/2024/02/29/Zookeeper/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)