Zookeeper笔记
Zookeeper入门
1.Zookeeper是分布式的,为分布式框架提供协调服务的Apache项目
2.设计模式的角度来说采用了观察者模式设计的分布式服务管理框架,将业务功能注册到Zookeeper集群中,客户端通过Zookeeper集群来调用业务功能,监听业务功能的下线
3.特点:
1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群
??2)集群中只要有半数以上节点存货,Zookeeper集群就能正常服务,所以Zookeeper适合安装奇数台服务器==
3)全局数据一致,每个server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的
4)来自同一Client发送的请求,会按照其发送顺序依次执行
5)数据更新具有原子性,一次数据更新要么成功,要么全失败
6)实时性,在一定时间范围内,Client能读取到最新数据
4.数据结构
数据结构模型与Unix文件系统相似,类似于树形结构,每个节点称作一个ZNode,每个Znode默认能够存储1MB的数据,每个ZNode都可以通过其路径来唯一标识
5.安装ZooKeeper
1) 在虚拟机安装zookeeper 修改zookeeper配置文件 修改dataDir路径
2) 配置文件参数解读
1) tickTime = 2000 通信心跳时间 Zookeeper服务器与客户端心跳时间 单位毫秒
2) initLimit = 10 Leader-Follower初始通信时限 10个心跳时间 表示L和F初始连接时可容忍的最大心跳数
3) synLimit = 5 Leader-Follower同步通信时限 5个心跳时间 超过此时间会认为F已经死掉,会在服务器中删除F
4) dataDir = .... 保存zookeeper的数据路径
5) clentPort = 2181 客户端连接端口 通常不修改
6.配置集群方式启动Zookeeper
1) 分别在3台不同服务器中安装好Zookeeper
2) 修改每台服务器中dataDir的路径 存储为 zkData中
3) 在zkData文件夹中创建文件 在其中编写服务器的编号
4)在配置文件中 添加配置项:
server.A=B:C:D:
A:一个数字,表示服务器的编号
B:服务器的地址
C:服务器Follower与服务器Leader交换信息的端口
D:Leader挂机后,其他Follower服务器需要通过D端口 重新推举出新的Leader
举例: server.1=102.168.111.100:2888:3888
5)启动所有服务器中的Zookeeper服务 使用 zkServer.sh status 命令查看服务器状态
7.Zookeeper选举机制
第一次启动时:(5台服务器为例)
服务一启动,发起选举 投自己一票,此时服务器数量不够半数以上 选举无法完成,服务一状态保持为LOOKING
服务二启动,发起选举 投自己一票,与服务一交换选票信息,如果服务二的myid大于服务一的myid 则服务一的选票会投票
给服务二,此时服务一0票,服务二2票,此时服务器数量不够半数以上,无法完成选举 ,服务一二保持状态
为LOOKING
服务三启动,发起选举,投自己一票,与服务一、二交换选票讯息,此时服务三的myid大于服务二,所以服务三获取所有
选票,此时服务器数量达到半数以上,服务三的选票最多,则服务三当选为Leader, 其他服务状态改为
FOLLOWING,服务三状态改为LEADING
服务四启动:发起选举,投自己一票,交换选票信息,由于服务一二三的状态已经不是LOKKING ,所以不会更改选票信息
服务四为一票,服务三为三票,此时服务四服从多数,更改投票给服务三,更改状态为FOLLOWING
服务五启动,同服务四
非第一次启动:(5台服务器为例)
1)当Zookeeper集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举
服务器初始化启动
服务器于行期间无法和Leader保持连接
2)当一台机器及惹怒Leader选举流程时,当前集群也可能会处于以下两个状态
集群中本来就已经存在一个Leader
对于已经存在Leader的情况,机器试图选举Leader时会被告知当前服务器的Leader信息,仅需要和Leader机器建立连
接,状态同步即可
集群中确实不存在Leader
假设Zookeeper集群有5台服务器组成 SID分别为1,2,3,4,5,ZXID分别为8,8,8,7,7,并且此时SID为3的服务器时
Leader,某一时刻,3和5服务出现故障,因此重新开始进行Leader选择
SID为1,2,4的机器投票情况为
选举Leader规则: ① EPOCH打的直接当选,②EPOCH相同,事务ID大的当选,③事务ID相同,服务器ID大的当选
8.编写zookeeper服务启动关闭脚本
#!/bin/bash
case $1 in
"start") {
for i in 192.168.114.100 192.168.114.101 192.168.114.102
do
echo ---------- zookeeper $i 启动 ------------
ssh $i "/opt/module/apache-zookeeper-3.5.7-bin/bin/zkServer.sh start"
done
};;
"stop") {
for i in 192.168.114.100 192.168.114.101 192.168.114.102
do
echo ---------- zookeeper $i 停止 ------------
ssh $i "/opt/module/apache-zookeeper-3.5.7-bin/bin/zkServer.sh stop"
done
};;
"status") {
for i in 192.168.114.100 192.168.114.101 192.168.114.102
do
echo ---------- zookeeper $i 状态 ------------
ssh $i "/opt/module/apache-zookeeper-3.5.7-bin/bin/zkServer.sh status"
done
};;
esac
9.节点信息
1) czxid:创建节点的事务zxid
2) ctime:znode被创建的毫秒数(从1920年开始)
3)mzxid:znode最后更新的事务zxid
4)mtime:znode最后修改的毫秒数(从1920年开始)
5)pZxid:znode最后更新的子节点zxid
6) cversion:znode子节点变化号,znode子节点修改次数
7)dataversion:znode数据变化号
8)aclVersion:znode访问控制列表的变化号
9)ephemeralOwner:如果是临时节点,这个是znode拥有者的session id 如果不是临时节点是0
10)dataLength:znode的数据长度
11)numChildren:znode子节点数量
10.节点类型
1.持久化目录节点:客户端与Zookeeper断开连接后,该节点依旧存在
2.持久化顺序编号目录节点:客户端与Zookeeper断开连接后,该节点依旧存在,知识Zookeeper会自动给节点排序
3.临时目录节点:客户端与Zookeeper断开连接后,该节点被删除
4.临时顺序编号目录节点:客户端与Zookeeper断开连接后,该节点被删除。知识Zookeeper给该节点名称进行顺序编号
11.监听器原理
监听原理详情
1首先要有一个main()线程
2.在main线程中创建Zookeeper客户端,这时会创建了两个线程 一个负责网络连接通信(connect),一个负责监听(listener)
3.通过connect线程将注册的监听事件发送给Zookeeper
4.在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
5.Zookeeper监听到有数据与或路径变化,就会将这个消息发送给listener线程
6.listener线程内部调用process()方法
常见的监听:
1)监听节点数据的变化
2)监听子节点增减的变化
注意:
1)注册一次监听,只能被监听一次,监听后就无效了