ZooKeeper 的主备切换(Failover)机制主要通过其分布式协调能力和临时节点(Ephemeral Nodes)特性实现。以下是详细的主备切换流程:
1. 主服务器注册临时节点
- 临时节点标识主服务器:
主服务器启动时会在ZooKeeper的特定路径(如/master)下创建一个临时节点(如/master/node1)。- 临时节点的特性:当主服务器与ZooKeeper的会话断开(如崩溃),该节点会被自动删除。
2. 备用服务器监听主节点状态
- 备用服务器的行为:
所有备用服务器会监听ZooKeeper的/master节点(通过exists或getData接口注册Watcher)。- 如果当前没有
/master节点,备用服务器会尝试创建临时节点,竞争成为新主(通过原子性创建,只有一个备用服务器会成功)。 - 如果主服务器已存在,备用服务器会持续监听该节点的删除事件。
- 如果当前没有
3. 主服务器崩溃触发Watcher
- 崩溃检测:
当主服务器崩溃(或网络分区),它与ZooKeeper的会话超时(默认sessionTimeout通常为2-20秒),临时节点/master/node1会被自动删除。 - 通知备用服务器:
ZooKeeper会触发所有备用服务器注册的Watcher,通知它们/master节点已删除。
4. 备服务器竞争新主
- 抢占式选举:
备服务器收到通知后,会立即尝试创建/master临时节点(如/master/node2)。- 由于ZooKeeper的原子性保证,只有一个备服务器会创建成功,成为新主。
- 其他备服务器继续监听
/master节点,进入待命状态。
5. 新主服务器接管服务
- 角色切换:
成功创建/master节点的备服务器会:- 加载主服务器的状态(如从共享存储或日志中恢复)。
- 通知其他服务(如通过ZooKeeper的另一个节点
/active/master更新信息)。 - 开始处理客户端请求。
关键机制
- 临时节点(Ephemeral Nodes):
- 主服务器的存活状态与临时节点绑定,崩溃时节点自动删除,无需人工干预。
- Watcher机制:
- 备服务器通过Watcher实时感知主节点变化,触发快速故障转移。
- 原子性创建:
- 多个备服务器竞争主节点时,ZooKeeper保证只有一个成功,避免脑裂。
- 会话超时(Session Timeout):
- 崩溃检测依赖于会话超时时间,需根据网络环境合理配置(太短会导致误判,太长会增加恢复时间)。
示例流程
1. 初始状态:
- ZooKeeper路径:/master (无节点)
- 服务器A启动,创建 /master/node1(成为主)。
- 服务器B、C启动,监听 /master。
2. 主服务器A崩溃:
- /master/node1 自动删除。
- ZooKeeper通知B、C。
3. 服务器B抢先创建 /master/node2(成为新主)。
- 服务器C继续监听。
优化实践
- 避免羊群效应:
所有备服务器同时竞争主节点可能引发负载,可通过优先级或顺序节点(Sequential Nodes)优化选举逻辑。 - 状态同步:
新主服务器需确保数据一致性(如通过共享存储或日志复制)。 - 客户端重定向:
客户端需监听/master节点变化,并在主切换后自动连接到新主。
通过上述机制,ZooKeeper能在秒级(取决于会话超时时间)内完成主备切换,实现高可用性。

2535

被折叠的 条评论
为什么被折叠?



