Zookeeper
分布式协调框架
场景
- 数据发布/订阅(配置中心)
- 树形结构且节点可存储数据,天然配置中心。
- 关注节点以接收通知,然后可以动态获取配置信息
- 命名服务 / 负载均衡
- 生成全局唯一ID
- 分布式协调/通知
- 心跳检测
- A服务创建临时节点,A关闭后临时节点即断掉
- B服务查看有多少临时节点,即知道有多少服务活着
- 集群管理
- Master选举
- 选举时,各备选机器创建一个相同临时的znode
- 谁创建成功,谁成为master
- 失败的,关注该节点
- 若master挂掉,其余节点能够立刻感知,从而重新选举
- 分布式锁和分布式队列
- 排它锁
- 临时znode,满足只有一个事务可以获得锁,释放后能通知的功能
- 共享锁
- 创建临时有序znode,value标记为 写、读
- 获取读锁:若比当前节点序号小的都是读锁,则认为获取成功
- 获取写锁:若自己就是最小节点,则认为获取成功
- 否则注册监听事件
- 排它锁
保证的特性
- 顺序一致性
- 同一客户端发起的请求,会按顺序应用到服务器
- 原子性
- 事务结果在所有机器上一样
- 单一视图
- 客户端连接任意服务器,看到的结果一样
- 可靠性
- 持久化
- 实时性
- 在一定的时候内,能看到最新的数据
集群角色
- Leader
- Follower
- Observer
- 默认无该角色
- 可提供读,不提供写
- 不参与写的过半写成功策略
- 不参与 Leader 选举
- 作用:在不影响写的性能下,增加读性能
数据
[zk: localhost:2181(CONNECTED) 23] get /yarn-leader-election/appcluster-yarn/ActiveBreadCrumb
appcluster-yarnrm1
cZxid = 0x1b00133dc0 //Created ZXID,表示该ZNode被创建时的事务ID
ctime = Tue Jan 03 15:44:42 CST 2017 //Created Time,表示该ZNode被创建的时间
mZxid = 0x1d00000063 //Modified ZXID,表示该ZNode最后一次被更新时的事务ID
mtime = Fri Jan 06 08:44:25 CST 2017 //Modified Time,表示该节点最后一次被更新的时间
pZxid = 0x1b00133dc0 //表示该节点的子节点列表最后一次被修改时的事务ID。注意,只有子节点列表变更了才会变更pZxid,子节点内容变更不会影响pZxid。
cversion = 0 //子节点的版本号
dataVersion = 11 //数据节点的版本号
aclVersion = 0 //ACL版本号
ephemeralOwner = 0x0 //创建该节点的会话的seddionID。如果该节点是持久节点,那么这个属性值为0。
dataLength = 22 //数据内容的长度
numChildren = 0 //子节点的个数
其它概念
Watcher
Watcher(事件监听器),是ZooKeeper中一个很重要的特性。
ZooKeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去。
该机制是ZooKeeper实现分布式协调服务的重要特性。
事务
能改变zookeeper服务器状态的称为事务,如节点创建、删除、更新等。事务号为zxid
ACL
access control Lists 控制权限
- CREATE: 创建子节点的权限。
- READ: 获取节点数据和子节点列表的权限。
- WRITE:更新节点数据的权限。
- DELETE: 删除子节点的权限。
- ADMIN: 设置节点ACL的权限。
ZAB协议
所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为Leader服务器,而剩下的其他服务器则成为Follower服务器。
Leader服务器负责将一个客户端事务请求转换成一个事务Proposal(提案)并将该Proposal分发给集群中所有的Follower服务器。
之后Leader服务器需要等待所有Follower服务器的反馈,一旦超过半数的Follower服务器进行了正确的反馈后,
Leader就会再次向所有的Follower服务器分发Commit消息,要求对刚才的Proposal进行提交。
读写过程
写Leader
- 客户端向Leader发起写请求
- Leader发送提案给所有Follower并等待ACK
- 过半Follower回复ACK,Leader自己也有一票ACK,向所有Follower、Observer发送commit
- 返回结果给客户端
写Follower、Observer
- 转发给Leader
- 同写Leader
读
- 直接从本地内存读取后返回
选举过程
两种模式
恢复模式
服务启动或Leader挂掉后,进入恢复模式。
Leader选举完成,且大部分节点完成状态同步后,退出恢复模式
广播模式
正常维持在广播状态
新节点加入时,会在恢复模式下启动,以完成状态同步
面试问题
如何保证事务的顺序一致性
通过事务号zxid,
- 高32位:世代号,每次出现新Leader即加1
- 低32位:每次新事务加1
部署模式
- 单机
- 集群
- 伪集群(单机多实例)
发布于 2020/08/22
浏览
次