Zookeeper

1. Zookeeper的工作机制

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。


2. Zookeeper的特点

  1. Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
  2. 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
  3. 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
  4. 更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行
  5. 数据更新原子性,一次数据更新要么成功,要么失败。
  6. 实时性,在一定时间范围内,Client能读到最新数据。

3. 统一命名服务

在分布式环境下,经常需要对应用 / 服务进行统一命名,便于识别。
例如:IP不容易记住,而域名容易记住


4. 统一配置管理

  1. 分布式环境下,配置文件同步非常常见

    (1)一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。

    (2)对配置文件修改后,希望能够快速同步到各个节点上。

  2. 配置管理可交由Zookeeper实现

    (1)可将配置信息写入Zookeeper上的一个Znode

    (2)各个客户端服务器监听这个Znode

    (3)一旦Znode中的数据被修改,Zookeeper将通知各个客户端服务器。


5. 软负载均衡(最少连接least Connections负载均衡算法)

在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。


6. Zookeeper选举机制

  1. 服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING
  2. 服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING
  3. 服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3.此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
  4. 服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING
  5. 服务器5启动,同4一样当小弟。

7. 节点类型

持久(Persistent):客户端和服务端断开连接后,创建的节点不删除

短暂(Ephemeral):客户端和服务端断开连接后,创建的节点自己删除

(1)持久化目录节点
(2)持久化顺序编号目录节点
(3)临时目录节点
(4)临时顺序编号目录节点

说明:创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。

注意:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。


8. 监听器原理

  1. 监听原理

    • 首先要有一个main()线程
    • 在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)
    • 通过connect线程将注册的监听事件发送给Zookeeper
    • 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
    • Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程
    • listener线程内部调用了process()方法
  2. 常见的监听

    1)监听节点数据的变化

    get path [watch]

    2)监听子节点增减的变化

    ls path [watch]

posted @ 2022-01-24 10:41  ArosyCat  阅读(9)  评论(0编辑  收藏  举报