You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向现有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节点集群,但这并非合理的在线扩容方案。

错误操作步骤

  1. 配置并启动新节点CH6,使用包含4节点的<zookeeper>和<keeper_server>配置;
  2. 逐个停止、更新配置并启动follower节点CH4、CH5,使用新的4节点集群配置;
  3. 停止、更新配置并启动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协议逻辑完全不同,核心问题在于:

  1. 原有集群的Raft配置中没有CH6的节点信息,当CH6发起预投票请求时,leader(CH3)识别出这是未注册节点,直接拒绝请求(日志里的strong deny, non-existing node就是明确证据)。
  2. 先启动新节点再更新原有节点配置的顺序错误,此时原有集群的配置未同步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>

集群配置更新与节点启动

  1. 更新原有集群所有节点的静态配置:
    • 逐个在CH3、CH4、CH5上修改keeper.xml,将CH6的节点信息添加到<raft_configuration>中;
    • 注意:不要重启原有节点,先完成所有节点的配置更新。
  2. 通过动态命令添加新节点:
    在任意原有节点上用clickhouse-client执行以下命令,将新节点信息写入Raft集群的配置日志:
    SELECT keeper_add_server('6:CH6:9444');
    
    所有节点会自动同步这个配置变更。
  3. 启动新节点CH6:
    启动CH6的ClickHouse服务:
    sudo systemctl start clickhouse-server
    
    此时CH6会自动连接集群,同步日志和快照,完成加入流程。
  4. 验证集群状态:
    在任意节点上执行命令查看节点状态:
    SELECT * FROM system.zookeeper_servers;
    
    确认CH6状态为follower(后续可能竞选leader),所有节点状态正常。

注意事项

  • 必须通过keeper_add_server命令完成动态配置变更,不能直接修改静态配置后重启节点,这是CH Keeper Raft协议要求的配置变更方式;
  • 新增节点时,必须保证原有集群处于健康状态(有可用leader,所有节点在线);
  • 扩容多节点时,重复上述流程即可,建议每次添加一个节点。

内容的提问来源于stack exchange,提问作者Jae

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:17:27