Zookeeper的一些入门实践和知识

znode分类

  1. 持久性的znode:创建之后即使发生Zookeeper集群宕机或者client宕机也不会丢失
  2. 临时性的znode:client宕机或者client在指定的timeout内没有给Zookeeper集群发送信息就会消失
    znode也可以为顺序性,每一个顺序性的znode关联一个唯一的单调递增整数作为znode名字后缀
  3. 持久顺序性znode
  4. 临时顺序性znode

使用zkCli实现一个简单的分布式锁

启动两个zookeeper的zkCli

  1. 第一个cli执行create -e /lock 表示创建一个临时节点
  2. 第二个cli执行create -e /lock,会显示:Node already exists: /lock
  3. 第二个cli执行stat -w /lock
  4. 第一个cli执行quit操作,这时候cli1对应的临时节点lock会消失
  5. 这时候第二个cli会接收到信息:WATCHER::WatchedEvent state:SyncConnected type:NodeDeleted path:/lock 监听到lock节点已经被释放
  6. 现在利用第二个cli执行create -e /lock就会显示执行成功了:Created /lock

使用zkCli实现Master-Worker协同

master-worker架构中有一个master负责监控worker的状态,并为worker分配任务

  • 在任何时刻,系统中最多只能有一个master,不可以出现两个master的情况,多个master共存会导致脑裂,所以可以采用上面的方法生成Worker

  • 系统中除了处于active状态的master还有一个backup master,如果active master失败了,backup master可以很快的进入active状态;

  • master实时监控worker的状态,能够及时收到worker成员变化的通知。

  • master在收到worker成员变化的时候,通常重新进行任务的重新分配

Zookeeper的一些入门实践和知识

使用zkCli实现master-worker

  1. master创建master节点 命令:create -e /master “localhost:3000” -e表示创建的是临时节点,master后面接着的是内容
    Zookeeper的一些入门实践和知识

  2. 让master节点对应的cli监听workers节点下的所有节点
    使用命令 ls -w /workers -w表示监听
    Zookeeper的一些入门实践和知识

我们执行命令这时候提示Node does not exists,这是因为我们的workers节点并没有建立

  1. 这时候需要建立一个wokers节点,这时候ls -w /workers 就能监听成功了
    Zookeeper的一些入门实践和知识

Zookeeper的一些入门实践和知识

  1. 这时候在workers下面建立一个w1子节点,会显示创建失败:Ephemerals cannot have children: /workers/w1
    这是因为临时节点不能有孩子节点
    Zookeeper的一些入门实践和知识
  2. 所以我们需要把临时节点删除,创建一个持久性节点
    这时我们在workers下面创建新的节点就成功了
    Zookeeper的一些入门实践和知识
    同时master节点也会监听到workers下的孩子节点发生了变化

Zookeeper的一些入门实践和知识
Zookeeper的一些入门实践和知识

  1. 我们现在再添加或者节点,master都能接收到更新信息

添加节点:
Zookeeper的一些入门实践和知识

一个客户端退出,对应的临时worker失效:

Zookeeper的一些入门实践和知识

zookeeper总体架构

Zookeeper客户端负责与Zookeeper集群进行交互。
Zookeeper集群有两种模式:standalone模式和quorum模式,处于standalone模式的集群有一个独立运行的Zookeeper节点。而处于quorum模式的Zookeeper集群包含多个Zookeeper节点

Session:

Zookeeper客户端负责与Zookeeper集群中的某个节点创建一个session,客户端可以主动关闭session。
如果Zookeeper节点没有在关联的timeout内接收到客户端信息,Zookeeper节点就会关闭session。
如果Zookeeper客户端发现连接的Zookeeper出错会自动和其他Zookeeper节点建立连接。

Zookeeper保证的数据一致性

  1. 使用全局可线性化写入:先到达leader的写请求先被处理,由leader决定写请求的执行顺序
  2. 客户端FIFO顺序:来自客户端的请求按照发送顺序执行