0%

Zookeeper

1. Zookeeper

1.1. 概述

为分布式应用提供协调服务。

从设计模式的角度,它是一个基于==观察者模式==设计的分布式服务管理框架,它负责存储和管理大家关心的数据,接受观察者的注册,一旦数据发生变化,Zookeeper将变化的信息通知给注册的观察者。

1.2. 特点

  1. Zookeeper: 一个leader和多个Follower,组成的集群
  2. 集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务
  3. 全局数据一致: 每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的
  4. 更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行
  5. 数据更新原子性,一次数据更新要么成功,要么失败
  6. 实时性:在一定时间范围内,client能读到最新数据

1.3. 数据结构

数据模型结构与Unix文件系统很类似,整体上可看做一棵树,每个节点称作一个ZNode。每个ZNode默认可存储1MB的数据,每个ZNode可以通过路径唯一标识。

1.4. 应用场景

  1. 统一命名服务
  2. 统一配置管理
  3. 统一集群管理
  4. 服务器节点动态上下线
  5. 软负载均衡

2. 内部原理

2.1. 选举机制

选举机制

目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:

  • 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking。
  • 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
  • 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
  • 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
  • 服务器5启动,后面的逻辑同服务器4成为小弟。

2.2. 节点类型

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

    1. 持久化目录节点:

      客户端与Zookeeper断开连接后,该节点依旧存在

    2. 持久化顺序编号目录节点:

      客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该接待名称进行顺序编号,例如“znode2_001”

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

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

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

    1. 临时目录节点:

      客户端与Zookeeper断开连接后,该节点被删除

    2. 临时顺序编号目录节点:

      客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该接待名称进行顺序编号

2.3. 监听器原理

2.4. 写数据流程