3.1 选举机制
1. 半数机制,集群中半数以上的机器存活,集群可用。所以 zookeeper 适合奇数台服务器。
2. Zookeeper 虽然在配置文件中没有指定 master 和 slave 。但是 Zookeeper 工作时,是有一个节点为 leader,其他则为 follower,leader 是通过内部选举机制临时产生的。
3. 以一个简单的例子来说明:
假设有5台机器,分别A,B,C,D,E。 注:zookeeper启动的时候,会读集群的配置Ip。
- A启动,当前没有leader,给自己投票,其他机器没有启动,收不到反馈信息,处于LOOKING
- B启动,当前没有leader,给自己投票,B发消息给其他机器,A接受到了来自B的投票,B比自己服务号大,接受投票,支持B当选,B接收到A 小于或等于自己的投票,支持A投自己。所以2:1,但是没有超过一半;following状态
- C启动,当前没有leader,给自己投票,广播给A和B,A和B收到比自己大的服务号,支持C当选并且A清空支持B的投票,此时比分为A:B:C=1:1:3,超过一半,C胜出,成为LEADER,状态为leading
- D启动,已经有leader了,同步leader状态,不参与投票,observing状态
3.2 节点的类型
持久(presistent):客户端和服务器端断开后,创建的节点不删除。
- 持久化目录节点,客户端与 Zookeeper 断开连接后,改目录依旧存在。
- 持久化顺序编号目录节点,客户端与 zookeeper 断开连接后,该节点依旧存在,只是 Zookeeper 给该节点进行顺序编号。
说明:创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。
注意:在分布式系统中,顺序号可以被用于为所有事件在全局中排序,这样客户端可以通过顺序号推断事件的顺序。
短暂(ephemeral):客户端和服务器端断开后,创建的节点自己删除。
- 客户端和服务器端断开后,该节点被删除。
- 客户端与 zookeeper 断开连接后,该节点被删除,只是 Zookeeper 给该节点进行顺序编号。
3.3 shell 命令操作
1. 查看 znode 所包含内容
ls /
2. 查看 znode 所包含内容,详细信息
ls2 /
3. 创建节点,获取节点数据
create /sanguo "luoguanzhong"
get /sanguo
4. 创建短暂节点
create -e /sanguo/weiguo "caocao"
5. 创建带编号的节点
create -s /sanguo/qunguo "diaochan"
6. 修改节点的值
set /sanguo/shuguo "liushan"
7. 监听数据变化
get /sanguo watch
8. 监听路径的变化
ls /sanguo/wuguo watch
9. 删除节点
delete /sanguo/qunguo0000000002
10 递归删除
rmr /sanguo
11. 查看节点的详细信息
stat /
cZxid:创建节点的事务id
ctime:znode节点的创建时间
mZxid:最后更新的事务id
mtime:znode节点最后修改时间
pZxid:最后更新子节点的zxid
cversion:znode子节点变化号,znode子节点的修改次数
dataVersion:数据变化号
aclVersion:访问控制列表的变化号
ephemeralOwner:如果是临时节点,这个是 znode 拥有者的 session id,如果不是临时节点则为0
dataLength:znode 的数据长度
numChildren:znode 子节点的数量
3.4 监听原理
1. 首先由一个 main() 线程
2. 在 main 线程中创建 Zookeeper 客户端,这时候会创建两个线程,一个负责网络通信连接(connect),一个负责监听(listener)
3. 通过 connect 线程将注册的监听事件发送给 Zookeeper
4. 在 Zookeeper 的注册监听器列表中将注册的事件添加的监听列表中
5. Zookeeper 监听到有数据或路径的变化,就会讲数据发送到 listener 线程
6. listener 线程内部调用 process() 方法