基础概念
- Zookeeper提供一个多层级的节点命名空间(节点称为znode)。与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。Zookeeper为了保证高吞吐和低延 迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper不能用于存放大量的数据,每个节点的存放数据上限为1M。
选举机制
Zookeeper的服务器三种角色:Leader,Follower,Observer
。Leader提供读和写,Follower提供读,参与过半投票,Observer只提供读,不参与投票,可以提高读性能。
ZXID,事务ID,用来唯一标识一次服务器状态的变更;myid,服务器SID,一个数字,通过配置文件配置,唯一。
- 每个服务器发送一个投票(SID,ZXID),其中sid是自己的myid,初始阶段都将自己投为Leader。
- 接收来自其他服务器的投票。首先判断投票有效性,包括验证是否是来自Looking状态的服务器。
- 优先检查ZXID,ZXID较大者优先为Leader,如果ZXID相同,检查SID,SID较大者优先为Leader。
- 每次投票后,服务器统计所有投票,判断是否有过半的机器收到相同的投票,如果某个投票达到一半的要求,则认为该投票提出者可以成为Leader。
- 一旦确定了Leader,每个服务器都更新自己的状态,Leader变更为Leading,Follower变更为Following。
源码
应用
- 命名服务。通过指定的名字来获取资源或者服务的地址,利用zk创建一个全局的路径,即是唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。
- 配置管理。分布式的部署在不同的机器上,将程序的配置信息放在zk的znode下,当有配置发生改变时,也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watcher通知给各个客户端,从而更改配置。
- 集群管理。是否有机器退出和加入、选举master。
工具包
CLI
ctime : 节点创建时间戳 , 将鼠标放到右侧的value上会提示成易读时间(yyyy-MM-dd HH:mm:ss SSS)
mtime : 节点最后一次被修改的时间戳, 将鼠标放到右侧的value上会提示成易读时间(yyyy-MM-dd HH:mm:ss SSS)
dataversion : 数据节点的版本号
cZxid : 节点被创建时的事务 ID
mZxid : 节点最后一次被修改时的事务 ID
dataLength : 数据长度
ephemeralOwner : 如果值为0表示永久节点 , 否则表示创建该临时节点时的 , 会话 sessionID
numChildren : 子节点数
aclversion : 节点ACL版本号
pZxid : 节点的子节点列表最后一次被修改时的事务 ID, 只有子节点列表变更才会更新 pZxid , 子节点内容变更不会更新
cversion : 子节点的版本号
常见问题
脑裂问题
https://juejin.im/post/6844903895387340813
好玩的
世界之大为何我们相遇,难道是缘分,难道是天意。--[我的歌声里]
相关介绍
参考
> 可在下面留言(需要有 GitHub 账号)