ZooKeeper 集群支持动态添加机器,但这并非一个“完全在线、无感”的操作,需要人工介入和滚动重启,并且有重要的注意事项。
下面详细解释如何操作、其背后的原理以及最佳实践。
动态添加节点的原理与前提
ZooKeeper 集群的成员关系是静态配置的。每个节点在启动时,都需要知道整个集群的所有成员信息。
这个配置保存在每个节点的 zoo.cfg 文件中,格式如下:
properties
# 在所有节点的 zoo.cfg 中都必须有完整的服务器列表
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
2888 端口用于 Follower 与 Leader 之间的数据同步和通信。
3888 端口专用于 Leader 选举。
核心原理:当一个新节点试图加入集群时,它必须被现有集群的多数派所知晓和认可。
如果新节点的 ID 没有出现在现有节点的配置文件中,现有节点会拒绝它的连接请求。
因此,“动态添加”的本质是:分步更新所有节点(包括新节点)的配置文件,然后通过滚动重启的方式,让新的集群配置生效。
动态添加节点的详细步骤
假设我们有一个原始的 3 节点集群(server.1, server.2, server.3),现在要添加 server.4。
1. 前期准备与新节点配置
安装 ZooKeeper:在新机器上安装相同版本的 ZooKeeper 软件。
准备数据目录:创建 dataDir 指定的目录,并在其中创建 myid 文件,内容为 4。
准备初始配置:为新节点准备一个 zoo.cfg 文件,其中包含完整的、新的集群信息:
properties
# server.4 的 zoo.cfg (初始配置)
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888 # 包含自己
注意:此时先不要启动 server.4。
2. 滚动更新现有集群的配置
这是最关键的一步。你需要按顺序逐个节点地进行以下操作:
关闭 其中一个现有节点(例如 server.1)。
更新该节点的 zoo.cfg,添加新节点的配置:
properties
# 更新后 server.1 的 zoo.cfg
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888 # 新增行
启动 server.1。
等待 server.1 完全重新加入集群并同步数据。
对 server.2 和 server.3 重复步骤 1-4。
为什么必须滚动重启?
这样可以保证在任一时刻,集群中都有超过半数的节点在线并使用相同的配置。
对于一个 3 节点集群,多数派是 2。如果你一次关闭 2 个节点,集群将停止服务。
3. 启动新节点并验证
当所有现有节点的配置都已更新并重启完毕后,最后启动新节点 server.4。
server.4 会与集群建立连接,并开始同步数据。Leader 会将所有数据快照和事务日志发送给 server.4。
使用 echo stat | nc localhost 2181 查看所有节点的状态,确认 server.4 已经成功作为 Follower 或 Observer 加入集群。
重要考虑与最佳实践
1. 集群节点数量与容错能力
从 3 节点扩容到 4 节点:
3 节点集群:容忍 1 个节点故障。
4 节点集群:容忍 1 个节点故障(因为需要 3 票才能形成多数派)。
结论:从 3 扩到 4,你的容错能力没有变化,但写性能会下降(因为需要更多的节点确认)。这通常是一个不推荐的扩容方案。
从 3 节点扩容到 5 节点:
5 节点集群:容忍 2 个节点故障。
结论:这是一个推荐的方案,因为它实实在在地提升了集群的可用性。
规则:始终保持集群节点数为奇数(3, 5, 7...)。
2. 添加 Observer 节点
如果你只是想扩展集群的读性能,而不是写容错能力,那么添加 Observer 节点是更简单、更推荐的方式。
优势:
Observer 不参与投票,因此增加 Observer 不会影响写性能。
配置更简单:只需要在新节点的配置中将自己标识为 Observer,并在现有节点的配置中注明新节点是 Observer 即可,通常不需要重启整个现有集群。
配置示例:
在新节点 server.4 的 zoo.cfg 中:peerType=observer
在所有节点的 zoo.cfg 中,将新节点标记为 Observer:
properties
server.4=node4:2888:3888:observer
3. 数据同步压力
当新节点加入时,Leader 需要将全量数据同步给它。如果数据集很大,这个过程会:
占用大量的网络带宽。
增加 Leader 的负载,可能轻微影响集群性能。
建议在业务低峰期进行操作。
总结
特性 描述
是否支持 |支持,但非完全自动
操作类型 |配置更新 + 滚动重启
核心原则 |保证任何时候都有多数派节点在线并使用一致的配置
推荐步骤 |1. 准备新节点
2. 滚动更新并重启所有现有节点
3. 最后启动新节点
最佳实践 |始终保持奇数个投票节点(Follower)
优先考虑添加 Observer 来扩展读能力
在业务低峰期操作,注意大数据集同步的影响
zookeeper集群是否支持动态添加机器
最新推荐文章于 2025-11-23 22:37:35 发布
721

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



