Zookeeper工作机制

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

Zookeeper特点

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

Zookeeper数据结构

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

Zookeeper应用场景

 (一).统一命名服务:在分布式环境下,经常需要对应服务进行统一命名,便于识别。

 (二). 统一配置管理 

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

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

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

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

可讲配置信息写入ZooKeeper上的一个Znode

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

 一旦Znode中的数据被修改,ZooKeeper将通知各个客户端服务器

(三).统一集群管理

可根据节点实时状态作出一些调整

可将节点信息写入ZooKeeper上的Znode

监听这个ZNode可获取它的实时状态变化

(四).服务器节点动态上下线:客户端能实时洞察到服务器上下线的变化

(五).软负载均衡:记录每台服务器的访问数,让访问数最少的服务器取处理最新的客户端请求

 

Zookeeper内部原理:

选举机制:

(1)半数机制:集群中半数以上的机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。

(2)Zookeeper虽然在配置文件中并没有制定Master和Slave。但是Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。

   (3)以一个简单的例子来说明整个选举的过程

  假设有五台服务器组成的Zookeeper集群,他们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。那么就是。5/2+1=3 这个节点当选leader

节点类型:

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

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

持久化目录节点

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

持久化顺序编号目录节点

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

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

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

临时目录节点

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

临时顺序编号目录节点

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

Zookeeper单机模式

version: '3.1'

services:
    zoo1:
        image: zookeeper:3.4.10
        restart: always
        hostname: zoo1
        ports:
            - 2181:2181
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS: server.1=zoo1:2888:3888

注:3.5和3.4的配置不同如果下载最新版本请查看官方文档并修改

启动:

docker-compose up -d

简单命令操作:

查看help:

zookeeper查看当前连接 zookeeper查看命令_zookeeper查看当前连接

 查看节点信息: ls /

 查看详细节点信息: ls2 /

zookeeper查看当前连接 zookeeper查看命令_服务器_02

创建节点信息: create

zookeeper查看当前连接 zookeeper查看命令_服务器_03

获取节点信息get:

zookeeper查看当前连接 zookeeper查看命令_zookeeper查看当前连接_04

创建短暂节点create -e  :

zookeeper查看当前连接 zookeeper查看命令_客户端_05

退出后再次连接查看短暂节点是否存在:

zookeeper查看当前连接 zookeeper查看命令_客户端_06

 创建带序号的节点create -s :

zookeeper查看当前连接 zookeeper查看命令_zookeeper查看当前连接_07

如果与啊来没有序号节点,序号从0开始依次递增。如果原节点下已有2个节点,则在排序时从2开始。

修改节点值: set

zookeeper查看当前连接 zookeeper查看命令_服务器_08

节点参数变化监听: get path [watch]

打开另一个cli开始监听:

zookeeper查看当前连接 zookeeper查看命令_服务器_09

从原cli修改数据:

zookeeper查看当前连接 zookeeper查看命令_服务器_10

查看监听 cli:

zookeeper查看当前连接 zookeeper查看命令_客户端_11

再次修改:

zookeeper查看当前连接 zookeeper查看命令_客户端_12

此时监听不在有效:

zookeeper查看当前连接 zookeeper查看命令_服务器_13

 监听路径变化:ls path [watch]

监听、修改、查看与监听值同理:

zookeeper查看当前连接 zookeeper查看命令_客户端_14

zookeeper查看当前连接 zookeeper查看命令_客户端_15

 删除节点 delete:

zookeeper查看当前连接 zookeeper查看命令_zookeeper查看当前连接_16

 递归删除节点 rmr :

zookeeper查看当前连接 zookeeper查看命令_客户端_17

 节点不为空则使用delete删除,需要使用rmr进行递归删除