如下图,节点2是leader
- 客户端向节点1发起一个写请求,客户端和节点1建一个session
- 节点1将写请求转发给节点2
- 节点2向所有节点发起propose
- 其他节点收到propose后,返回给节点2一个accept消息
- 节点2收到大多数节点的accept消息后,向所有节点发送commit消息。
-
节点1收到commit消息后,响应客户端写请求成功
Observer
Observer不参加ZooKeeper的事务提交和选举。
与其他节点的唯一交互是接收来自leader的inform消息,更新自己本地存储。
Observer作用
- 提升读性能
-
实现跨数据中心的部署
比如:
我们需要部署北京和香港两地都可以使用的 ZooKeeper服务。我们要求北京和香港的客户端请求的延迟都低。因此,我们在北京换个香港都部署ZooKeeper节点。
我们假设leader节点在北京。如果不使用observer,那么每个来自香港的写请求要涉及leader和每个香港follower节点之间的propose、ack、和commit三个跨区域消息。
解决方案就是把香港的节点都设成observer。上面提到的propose、ack和commit消息都变成inform一个跨区消息。
网友评论