如何向现有CH Keeper集群新增节点?操作失败求助
ClickHouse Keeper新增节点失败问题排查与解决
问题背景
现有3节点(CH3、CH4、CH5)CH Keeper集群正常运行,zk_followers设为2。参考普通ZooKeeper的节点加入步骤操作后,新节点CH6无法加入集群,核心报错:
2023.04.19 16:30:26.628691 [ 24960 ] {} <Error> RaftInstance: [PRE-VOTE DONE] this node has been removed, stepping down
临时解决方式是删除所有原有节点的/var/lib/clickhouse/coordination目录后重新部署4节点集群,但这并非合理的在线扩容方案。
错误操作步骤
- 配置并启动新节点CH6,使用包含4节点的
<zookeeper>和<keeper_server>配置; - 逐个停止、更新配置并启动follower节点CH4、CH5,使用新的4节点集群配置;
- 停止、更新配置并启动leader节点CH3,使用新的4节点集群配置。
关键日志信息
新节点CH6核心日志
2023.04.19 16:30:26.628691 [ 24960 ] {} <Error> RaftInstance: [PRE-VOTE DONE] this node has been removed, stepping down 2023.04.19 16:30:30.379911 [ 24959 ] {} <Information> RaftInstance: no hearing further news from leader, remove this server from cluster and step down
Leader节点CH3核心日志
2023.04.19 16:30:26.628692 [ 1602 ] {} <Information> RaftInstance: pre-vote decision: XX (strong deny, non-existing node)
错误原因分析
你照搬了普通ZooKeeper的节点扩容流程,但ClickHouse Keeper基于Raft协议实现,与原生ZooKeeper的ZAB协议逻辑完全不同,核心问题在于:
- 原有集群的Raft配置中没有CH6的节点信息,当CH6发起预投票请求时,leader(CH3)识别出这是未注册节点,直接拒绝请求(日志里的
strong deny, non-existing node就是明确证据)。 - 先启动新节点再更新原有节点配置的顺序错误,此时原有集群的配置未同步CH6信息,自然不会承认新节点的身份。
正确的CH Keeper新增节点步骤(适用于23.1.3版本)
前置准备
- 确保新节点CH6的系统环境、ClickHouse版本与原有集群完全一致;
- 提前在CH6上配置好
/etc/clickhouse-server/config.d/keeper.xml,但不要启动服务,配置需包含完整的4节点信息,示例片段:
<clickhouse> <keeper_server> <tcp_port>9444</tcp_port> <server_id>6</server_id> <log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path> <snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path> <coordination_settings> <operation_timeout_ms>10000</operation_timeout_ms> <session_timeout_ms>30000</session_timeout_ms> </coordination_settings> <raft_configuration> <server><id>3</id><hostname>CH3</hostname><port>9444</port></server> <server><id>4</id><hostname>CH4</hostname><port>9444</port></server> <server><id>5</id><hostname>CH5</hostname><port>9444</port></server> <server><id>6</id><hostname>CH6</hostname><port>9444</port></server> </raft_configuration> </keeper_server> </clickhouse>
集群配置更新与节点启动
- 更新原有集群所有节点的静态配置:
- 逐个在CH3、CH4、CH5上修改
keeper.xml,将CH6的节点信息添加到<raft_configuration>中; - 注意:不要重启原有节点,先完成所有节点的配置更新。
- 逐个在CH3、CH4、CH5上修改
- 通过动态命令添加新节点:
在任意原有节点上用clickhouse-client执行以下命令,将新节点信息写入Raft集群的配置日志:
所有节点会自动同步这个配置变更。SELECT keeper_add_server('6:CH6:9444'); - 启动新节点CH6:
启动CH6的ClickHouse服务:
此时CH6会自动连接集群,同步日志和快照,完成加入流程。sudo systemctl start clickhouse-server - 验证集群状态:
在任意节点上执行命令查看节点状态:
确认CH6状态为SELECT * FROM system.zookeeper_servers;follower(后续可能竞选leader),所有节点状态正常。
注意事项
- 必须通过
keeper_add_server命令完成动态配置变更,不能直接修改静态配置后重启节点,这是CH Keeper Raft协议要求的配置变更方式; - 新增节点时,必须保证原有集群处于健康状态(有可用leader,所有节点在线);
- 扩容多节点时,重复上述流程即可,建议每次添加一个节点。
内容的提问来源于stack exchange,提问作者Jae
相关产品推荐
相关产品推荐

