一、Zookeeper架构图
二、要素说明
- 色块1:zk集群中的follower服务节点,物理体现为一个java进程
- 色块2:zk集群中的leader服务节点,物理体现为一个java进程
- 色块3:连接zk服务的客户端,物理体现为一个进程
- 色块4:保存在zk服务进程中java堆内存的 数据
- 色块5:写操作日志,物理体现为一个文件
- 色块6:保存zk服务进程中数据的一个快照文件,在zk服务进程重启时通过读取这个文件还原之前的内存数据
三、要素之间关系说明
zk server 与客户端关系
- zk server 包括follower,leader,observer角色的server
- 客户端与zk server 之间使用NIO进行连接,zk server之间使用BIO进行连接
- 一个客户端只能连接一个zk server
- 客户重新连接另外一个zk server时 会注册原来的watch事件到新连接的zk server
- 每台机器只能跟zk server 建立60(数量可配置)个连接,如果超过了会被拒绝
- zk server默认的2181端口是用于客户端连接的端口,另外两个端口是用于数据同步与leader选举,那说明 zk server 之间有两个BIO连接
- 所有类型的zk server 都可以执行读操作,只有leader角色的zk server 支持写操作
- follower 和 observer 接收到客户端的写操作,会把写操作请求转发给leader
zk server 内部
- 每个zk server内部实现了预写日志系统(WAL)
- 当有数据写入时,先把数据写入到操作日志(上图色块5)里
- 然后把数据写入内存中(上图色块4)
- 定时把内存数据 保存到快照文件中(上图色块6)
- zk server重启时,先读取快照数据恢复内存数据,再从日志中恢复未被保存到快照文件的数据