Zookeeper数据写入流程图
二、要素说明
- 色块1:zk集群中的follower服务节点,物理体现为一个java进程
- 色块2:zk集群中的leader服务节点,物理体现为一个java进程
- 色块3:连接zk服务的客户端,物理体现为一个进程
- 色块4:保存在zk服务进程中java堆内存的 数据
- 色块5:写操作日志,物理体现为一个文件
- 色块6:保存zk服务进程中数据的一个快照文件,在zk服务进程重启时通过读取这个文件还原之前的内存数据
- 箭头7:leader的客户端 或者是 follower 转发他们客户端的写请求
- 箭头8:leader向所有follower提交 提议
- 箭头9:各个follower向leader提交 提议已完成
- 箭头0:leader向所有follower提交commit请求
三、Zookeeper数据写入流程
二阶段过半写机制
客户端提交阶段(上图箭头7)
- 客户端提交写请求到zk server,如果zk server是follower或observer,它们会把写请求转发给leader。如果zk server是leader ,leader会直接处理写请求。
Leader提议阶段(上图箭头8)
- Leader 向所有follower和自己发起propose(提议)请求。
提议确认阶段(上图箭头9)
- 所有follower和leader处理propose(提议)请求,把提议写入日志里,并向leader发送propose ack请求,表示已完成propose(提议)请求处理,此时数据对客户端来说还不可见。
数据生效阶段(上图箭头0)
- leader 收到超过半数(包括自己)propose ack请求,就会向所有follower和自己发送commit请求
- follower 收到commit请求会把数据写入内存,此时数据就对客户端就可见了