ZAB协议
崩溃恢复
-
所谓崩溃恢复,指的是当Zookeeper集群中leader产生宕机或者丢失的时候,整个集群不会停止服务而是会选举出一个新的leader继续对外提供服务
-
崩溃恢复,可以很好的避免集群中出现单点故障(因为一个节点故障而导致整个集群崩溃),实现集群的高可用
-
在Zookeeper集群中,当leader产生丢失的时候,Zookeeper集群会重新选举出一个新的leader,同时会给新leader产生一个编号(Epochid)。新leader产生编号之后,会将自己的Epochid发送给每一个follower。follower在接收到Epochid之后,会存放在本地文件
acceptedEpoch
中 -
事务id:在Zookeeper集群中,事务id由64位二进制数字(16位十六进制)组成,前32位表示的是Epochid,后32位表示实际的事务id。例如:
0x200000003
表示第二任leader执行的第3个写操作 -
每更换一个leader,都会产生一个新的log文件
其他
observer
-
observer(观察者)既不参与选举也参与原子广播,但是会监听选举和投票结果,根据结果执行对应的操作
-
在集群规模庞大或者网络不稳定的时候,选举或者原子广播的效率都会比较低,所以在实际过程中,会尽量减少参与选举或者原子广播的节点数量,因此在实际过程中,会将一个集群的90%~97%的节点设置为observer。例如,如果一个集群中有100台节点,那么此时observer的数量大约是89或者91台
-
在Zookeeper中,计算过半是计算的有决策权(选举/原子广播)的节点数量,observer没有决策权,所以不影响过半。例如:一个集群由21个节点组成,1个leader+6个follower+14个observer,即使observer全部宕机,Zookeeper集群也正常提供服务;即使observer全部存活,只要有4个follower宕机,那么Zookeeper集群也会停止服务
-
设置observer
# 先停掉当前节点上的Zookeeper zkServer.sh stop # 修改zoo.cfg文件 vim /opt/software/zookeeper-3.9.1/conf/zoo.cfg # 修改属性 pureType=observer server.1=10.16.2.191:2888:3888:observer # 启动这个节点的Zookeeper zkServer.sh start # 查看状态 zkServer.sh status
配置信息(zoo.cfg)
参数 | 默认值 | 解释 |
---|---|---|
clientPort | 2181 | 客户端的连接端口号 |
dataDir | /tmp/zookeeper | 数据目录,实际上是快照文件(snapshot.xxx)的存储目录 |
dataLogDir | 日志目录,实际上是log.xxx的存储路径。如果不指定,那么和dataDir的值一样 | |
tickTime | 2000 | 时间单元,默认单位是毫秒。在Zookeeper中,时间都是以这个时间单元来计算 |
initLimit | 10 | follower在加入Zookeeper集群之后,需要从leader处获取欠缺的事务并补齐,initLimit就是补齐时间:10*tickTime。即默认要求在20s内补齐事务,如果欠缺事务比较多,那么需要适当的调大这个值 |
syncLimit | 5 | 原子广播中的规定时间,即follower需要在5*tickTime给leader进行相应 |
minSessionTimeout maxSessionTimeout | 2*tickTime 20*tickTime | 最短会话超时时间以及最长会话超时时间。如果指定的会话超时时间小于了min或者大于了max,那么就按照min或者max执行 |
server.x=hostname:port1:port2 | 配置集群中的节点: 1. x是选举编号,即myid 2. hostname就是主机名或者IP 3. port1是原子广播的端口号 4. port2是选举的端口号 | |
jute.maxbuffer | 1M | 控制每一个节点能够携带的数据量 |
globalOutstandingLimit | 1000 | 最大请求堆积数。当请求过多导致leader暂时处理不了的时候,那么此时leader会先将这些请求放到队列中临时存储,这个过程就是请求堆积 |
preAllocSize | 64M | 预先开辟的磁盘空间,用于写入日志文件 |
leaderServers | yes | 是否允许leader节点对外接收请求 |
maxClientCnxns | 60 | 客户端最大连接数,就是每一个节点同时最多允许被多少个客户端连接 |
特性
-
过半性:过半选举(一个节点胜过一半及以上的节点才能成为leader),过半服务(集群中要存活一半及以上的节点才能提供服务),过半执行(请求需要一半及以上的follower同意才能执行)
-
数据一致性:从客户端角度而言,无论连接到哪一个节点上都能获取到相同的数据;从服务器角度而言,Zookeeper中每一个节点上存储的数据都一样
-
原子性:一个请求,要么所有节点都执行,要么所有节点都不执行
-
可靠性:Zookeeper集群不会因为一个节点宕机而导致整个集群停止服务
-
顺序性:所有节点执行请求的顺序是完全一致的 - 队列
-
实时性:在网络条件较好的情况下,可以实时监控Zookeeper的变化
集群操作
-
可以在一个节点上来查看其他节点的属性信息 - 集群操作
-
通过
nc
工具来实现的。nc
工具用于发送TCP请求,此时可以将需要执行的命令以TCP请求的方式发送到对应的节点上,等待对应节点响应结果即可 -
安装nc(netcat)
-
卸载nmap
rpm -qa | grep -i nmap | xargs rpm -ev --nodeps
-
进入软件安装目录,上传nc安装包
cd /opt/presoftware/ rz
-
安装
rpm -ivh nc-1.84-22.el6.x86_64.rpm
-
-
步骤
-
将Zookeeper先停掉
zkServer.sh stop
-
编辑文件
vim /opt/software/zookeeper-3.9.1/conf/zoo.cfg
在文件中添加
4lw.commands.whitelist=*
-
分发给其他的节点
scp /opt/software/zookeeper-3.9.1/conf/zoo.cfg root@10.16.2.194:/opt/software/zookeeper-3.9.1/conf/ scp /opt/software/zookeeper-3.9.1/conf/zoo.cfg root@10.16.2.193:/opt/software/zookeeper-3.9.1/conf/
-
启动Zookeeper
zkServer.sh start
-
-
常用命令
命令 解释 echo conf | nc 10.16.2.123 2181
查看10.16.2.123的配置信息 echo cons | nc 10.16.2.456 2181
查看10.16.2.456连接的客户端信息 echo crst | nc 10.16.2.258 2181
重置10.16.2.258的客户端连接 echo dump | nc 10.16.2.193 2181
获取当前集群的所有的会话信息,包含会话id,这些会话创建的临时节点数量等 echo envi | nc 10.16.2.193 2181
查看指定节点的环境信息 echo ruok | nc 10.16.2.193 2181
查看指定节点上的Zookeeper是否还存活。如果存活,则返回imok echo stat | nc 10.16.2.193 2181
查看指定节点的状态 echo srvr | nc 10.16.2.193 2181
查看指定节点的状态,不同于stat的地方在于,srvr不打印客户端信息