选举机制
1)半数机制:集群中半数以上机器存活,集群可用,所以zookeeper
适合奇数台服务器
2)Zookeeper
虽然在配置文件中并没有指定Master
和Slave
,但是ZK
工作时,是有一个节点为Leader
,其他则为Follower
,Leader
是通过内部选举机制临时产生的。
3)集群中的机器启动后先投自己一票,之后开启投票机制,每台机器都会给ID
最大的机器投一票,最终票数最多的成为Leader
,由于集群启动及网络延时,会造成第一台机器投票时后边会有机器处于启动中,所以成为Leader
的机器时随机的。
节点类型
- 持久型(
Persistent
):客户端和服务器端断开连接后,创建的节点不删除- 持久化目录节点:客户端与
ZK
断开连接后,该节点依旧存在 - 持久化顺序编号目录节点:客户端与
ZK
断开连接后,该节点依旧存在,只是ZK
给该节点名称顺序编号。
- 持久化目录节点:客户端与
- 短暂型(
Ephemeral
):客户端和服务器端断开连接后,创建的节点自己删除- 临时目录节点:客户端与
ZK
断开连接后,该节点被删除 - 临时顺序编号目录节点:客户端与
ZK
断开连接后,该节点被删除,ZK
给该节点名称进行顺序编号。
- 临时目录节点:客户端与
说明:创建znode
时设置顺序标识,znode
名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。
Stat结构体
czxid
:创建节点的事务zxid
,每次修改ZK状态都会收到一个zxid
形式的时间戳,也就是ZK
事务ID
,事务ID
时ZK中所有修改总的次序,每个修改都有唯一的zxid
,如果zxid1
小于zxid2
,那么zxid1
在zxid2
之前发生。ctime
:znode
被创建的毫秒数mzxid
:znode
最后更新的事务zxid
mtime
:znode
最后修改的毫秒数pZxid
:znode
最后更新的子节点zxid
cversion
:znode
子节点变化号,zonde
子节点修改次数dataversion
:znode
数据变化号acIVersion
:znode
访问控制列表的变化号ephemeralOwner
:如果是临时节点,这个是znode
拥有者的seesion id
,如果不是临时节点则是0
dataLength
:znode
的数据长度numChildren
:znode
子节点数量
监听器原理
1)创建一个主线程main()
2)在main
线程中创建ZK客户端,这时就会创建两个线程,一个负责网络连接通信(connet
),一个负责监听(listener
)。
3)通过connet
线程将注册的监听事件发送给ZK
4)在ZK
的注册监听器列表中将注册的监听事件添加到列表中
5)ZK
监听到有数据或路径变化,就会将消息发送给listener
线程
6)listener
线程内部调用process()
方法处理
常见的监听:
-
监听节点数据的变化:
get path[watch]
-
监听子节点增减的变化
ls path[watch]
写数据流程
1)客户端向集群写数据,发送一个写请求
2)集群中server1
接收到写请求,判断server1
是不是Leader
,如果不是他会进一步的把请求转发给Leader
3)Leader
收到写请求,广播给集群中的所有server
,各个server
同步开始写数据,写成功后通知Leader
4)当Leader
收到大多数server
数据写成功后,那么说明数据写入成功。Leader
就会告知server1
写请求成功
5)server1
收到通知就会告知客户端数据写入成功,这时整个写操作成