Zookeeper工作机制
Zookeeper从设计模式角度来理解:是一个基于观察者模式的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察着的注册,一旦这些数据的状态发生变化,Zookeeper讲讲负责通知已经在Zookeeper上注册的那些观察者作出响应的反应。
Zookeeper特点
- 一个领导者(Leader),多个跟随者(Follower)组成的集群
- 集群中只要有半数以上节点存活,Zookeeper集群就能够正常服务
- 全局数据一致,每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的
- 更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行
- 数据更新原子性,一次数据更新要么成功,要么失败
- 实时性,在一定时间范围内,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:
查看节点信息: ls /
查看详细节点信息: ls2 /
创建节点信息: create
获取节点信息get:
创建短暂节点create -e :
退出后再次连接查看短暂节点是否存在:
创建带序号的节点create -s :
如果与啊来没有序号节点,序号从0开始依次递增。如果原节点下已有2个节点,则在排序时从2开始。
修改节点值: set
节点参数变化监听: get path [watch]
打开另一个cli开始监听:
从原cli修改数据:
查看监听 cli:
再次修改:
此时监听不在有效:
监听路径变化:ls path [watch]
监听、修改、查看与监听值同理:
删除节点 delete:
递归删除节点 rmr :
节点不为空则使用delete删除,需要使用rmr进行递归删除