@[TOC]
ZooKeeper
作用
- ZooKeeper在大数据组件中起着重要的==协调作用==,帮助实现==高可用性和一致性==。
- 通常用于监控主备节点,实现高可用;也用于同步数据。
举例
1.在Hadoop YARN中,实现了ResourceManager的HA。当主ResourceManager节点故障时,ZooKeeper会帮助切换到备用的ResourceManager节点。
2.在HBase中,实现了RegionServer的HA。当一个HBase RegionServer节点失效时,ZooKeeper帮助重新分配这个节点的负载给其他可用的节点。
3.在Spark中,实现了Master的HA。如果当前的Master节点失效,ZooKeeper会通知备用Master节点接管。
设计原理
- 文件系统(存储和管理数据)+通知机制(当观察者观察的Znode[Zookeeper DataNode]的数据状态发生变化之后,ZooKeeper通知在Zookeeper上注册的观察者(客户端)做出相应的反应)
- 观察者模式
- 当被观察者状态发生改变时,它会通知所有的观察者对象,使他们能够及时做出响应。
Znodes的状态变化
- 创建Znode:服务器启动时去ZooKeeper注册信息
- 删除Znode:服务器下线时去ZooKeeper注销信息
- 更新Znode数据:服务的配置信息发生变化,去更新ZooKeeper中相关的Znode的数据。
- 子节点变化:如果一个Znode有子节点,这些子节点的添加或删除也会被视为父ZNode的状态变化。
具体步骤ZooKeeper原理
- 注册观察
- 服务器启动时在ZooKeeper集群中通过创建或更新Znodes来完成注册信息
- 客户端获取当前服务器列表,并注册监听。
- 事件触发
- 如果服务器发生事件,在集群中的Znodes发生相应的状态变化(如数据更新、节点删除、子节点变化)。ZooKeeper集群将检测到这些变化。
- 通知观察者
- ZooKeeper会向所有对该znode注册了观察的客户端发送通知。这些通知是一次性的,也就是说,一旦发送了通知,相应的观察就被移除了。
- 如果客户端需要继续监视该znode的后续变化,它必须再次注册观察。
- 客户端响应
- 收到通知后,客户端进行操作(如读取更新后的数据,调整其内部状态)。
- 收到通知后,客户端进行操作(如读取更新后的数据,调整其内部状态)。
ZooKeeper数据结构(了解)
- 树结构
- ZooKeeper
- config 存储集群的动态配置
- quota 实现节点的配额管理
- ZooKeeper
ZooKeeper CLI
zkCli.sh
:进入ZooKeeperls path
:查看路径对应znode下的所有子节点get path
:获取节点的值
ZooKeeper 端口号
- 客户端连接端口(Client Port):默认为==2181==,用于客户端与zookeeper服务器进行通信。
- 服务器之间通信端口(Peer Port)):默认为==2888==,用于zookeeper服务器之间进行数据同步和选举。
- 选举通信端口(Leader Election Port)):默认为==3888==,用于zookeeper服务器之间进行选举。
Zookeeper角色
ZooKeeper选举机制
半数机制
- 集群中半数以上机器存活,集群可用
- ZooKeeper工作时,有一个节点为Leader,其他为Follower,Leader是通过内部选举机制临时产生的
- Leader选举是保证分布式数据一致性的关键所在
- 单一写入点。
- 更新状态,确保数据全局一致性。
- Leader失联时进行新的Leader选举。
leader选举触发时机
- 服务器初始化启动(没有Leader)
- 服务器运行期间无法和Leader保持连接(Leader故障)
补充
- 通常ZooKeeper的机器数是奇数。
- 后加的机器一定不会是Leader。
- 每一次进行状态更新,zxid递增,对于具有相同zxid的机器,myid越大的机器会成为Leader。