ZooKeeper写数据流程
-
初始化连接:
- 客户端初始化与 ZooKeeper 集群的连接,连接可以是 TCP 连接或者基于 UDP 的通信。客户端可以连接到集群中的任何一个节点。
-
查找 Leader:
- 当客户端发送写请求时,如果连接的节点不是 Leader,该节点会返回 Leader 的信息给客户端,并告诉客户端重新连接到 Leader。
-
发送写请求给 Leader:
- 客户端将写请求发送给 Leader 节点。写请求包含了要写入的数据以及目标节点的路径。
-
Leader 接收请求:
- Leader 节点接收到客户端的写请求后,将请求放入待处理队列中,开始处理请求。
-
数据处理与提交:
- Leader 节点在内存中处理写请求,然后将写操作写入其事务日志(transaction log)中。一旦写入事务日志并被大多数节点(包括 Leader 自身)确认接收,写操作就会被提交。
-
数据复制:
- Leader 节点将写操作广播给其他节点(Followers)。Followers 在接收到写操作后,会执行相同的写操作,并将结果反馈给 Leader。
-
确认写入:
- 一旦 Leader 收到大多数节点的确认信息,它将向客户端发送写操作成功的响应。此时客户端可以确认数据已经成功写入 ZooKeeper。
-
Watcher 通知:
- 如果客户端在写入节点时设置了 Watcher,一旦节点的状态发生变化,ZooKeeper 将会通知客户端。
-
持久化:
- Leader 节点会定期将内存中的数据以及事务日志持久化到磁盘上,以确保数据的持久性和一致性。这样即使节点崩溃,数据也不会丢失。
-
完成写操作:
- 一旦写操作被持久化到磁盘上,它就被认为是完成的,Leader 将允许其他读写操作继续进行。