实践落地

KaiwuDB 在线扩容实战:加节点过程中数据重平衡,业务零中断怎么做到

原创zen322026-10-26
2

扩容窗口里,最容易确认的一件事是新节点是否出现在集群列表中。相比之下,数据重新分布时,应用请求有没有失败、延迟抖动持续了多久、什么时候才算扩容完成,往往更难回答。

多副本集群在线增加一个节点时,怎样把“业务无感”变成一组可验证的条件?扩容后系统会自动进行数据重分布以实现负载均衡。下面围绕这段重分布过程,设计一场能观察、能判断、能复盘的扩容演练。

一、先把“无中断”定义清楚

“零中断”不能只用“集群没停机”来定义。对业务来说,更实际的判断是:持续请求没有不可恢复的失败,短暂延迟变化没有突破服务 SLO,扩容前后的数据校验一致。

因此,演练开始前先选定一条真实业务路径作为探针。例如每秒读取一台设备最近一条测量值,并向测试设备写入一条带唯一 ID 的记录。探针应经过与线上相同的连接池、超时和重试逻辑;否则只测数据库端口通不通,不能代表应用真的可用。

扩容期间至少记录四类信号:

信号 为什么要看
请求成功率与错误类型 判断是否有超时、连接断开或写入失败
P95/P99 延迟 发现平均值掩盖的尾部抖动
新旧节点的 CPU、磁盘 I/O、网络 判断重分布是否与业务争抢资源
节点状态与集群告警 确认节点加入后是否稳定,是否有副本或网络异常

演练判据可以写成:扩容期间探针请求持续成功,P95/P99 不超过预设 SLO;若出现短时重试,业务没有重复副作用;扩容后读回写入记录并核对数据。假设业务 SLO 是 P95 小于 200 ms,就以 200 ms 作为硬边界,不要等看到图表后再解释结果。

二、把场景固定下来,估算观察窗口

为了让演练可复述,先固定一个参考场景:现有 3 个数据节点,增加 1 个节点;预计需要重新分布的数据约 1 TB;节点间为 10 GbE 网络;业务持续读写。

参数 参考场景
扩容前节点数 3
新增节点数 1
预计重分布数据量 约 1 TB
有效迁移带宽估算 60–140 MB/s
预计重分布窗口 约 2–5 小时
规划中的 P95 波动 暂按基线的 10%–30% 预留观察空间

窗口估算用的是有效迁移带宽,而不是网卡标称速度:

1 TB ÷ 140 MB/s ≈ 2 小时
1 TB ÷  60 MB/s ≈ 4.6 小时

因此,演练排期可以按 2–5 小时预留重分布观察时间。10 GbE 不代表数据库能以 10 Gb/s 搬数据;磁盘读写、CPU、网络竞争、业务流量和副本调度都会压低实际带宽。P95 上升 10%–30% 是本场景预留的观察空间,不是 KaiwuDB 的性能承诺。判断仍以探针数据和业务 SLO 为准。

固定这些条件还有一个好处:若窗口远超估算,排查可以集中在“实际迁移量是否高于 1 TB、有效带宽是否低于 60 MB/s、是否存在资源争用”,而不是笼统地说“扩容很慢”。

三、扩容前只做一件关键事:建立对照基线

扩容前先确认几个条件:待扩容节点尚未安装 KaiwuDB,目标集群处于运行状态,当前节点数没有达到许可证上限。使用安装程序时,执行节点还要能通过 SSH 登录新节点,并拥有安装目录写权限。安全部署时,新节点的安全模式必须与目标集群一致,并准备好所需证书。

准入条件确认后,还要有扩容前的对照数据。建议在操作前连续采集 15 分钟:

  • 探针请求成功率、P95/P99 延迟及错误码;
  • 各节点 CPU、磁盘 I/O、网络吞吐和可用空间;
  • 当前集群节点状态与告警。

把这些指标作为基线,扩容期间每分钟采样,操作完成后继续观察 15 分钟,区分短暂波动与持续退化。若扩容前集群已经有节点异常、磁盘空间紧张或业务延迟接近 SLO 上限,先恢复健康或另选变更窗口。

四、加入节点:入口可以不同,检查点不能少

安装程序交互方式和命令行方式都可以加入节点。对这场演练,入口不是重点:无论使用 GUI 还是 CLI,都要确认选择的是多副本集群,并将新节点的安全模式、服务端口、数据目录和集群地址配置正确。

命令行场景中,通过启动新节点并指定数据目录、监听地址、HTTP 地址和已有节点列表加入集群。下面保留参数结构作为示意,证书和地址需要替换为实际值;TLS、TLCP 或非安全模式必须与现有集群匹配:

<kwbase_path>/kwbase start \
  --certs-dir=<cert_path> \
  --store=<data_dir> \
  --brpc-addr=:27257 \
  --listen-addr=<new_node_ip>:<kaiwudb_port> \
  --http-addr=<new_node_ip>:<rest_port> \
  --join=<node_address_list> \
  --background

安装完成后,先用 kw-status 检查节点是否加入;也可按安全模式使用 kwbase node status 查看节点状态。常见默认端口是 KaiwuDB 服务端口 26257、Admin UI 端口 8080、数据传输端口 27257,生产环境应以实际配置为准。

节点状态正常,只能说明新节点已加入并可被集群识别,不能证明数据重分布已经结束,也不能证明业务侧没有失败。从这一刻开始,演练的重心应转向监控和业务探针。

五、重分布期间,关注业务与资源的关联

多副本集群扩容后会自动进行数据重分布。迁移持续数小时并不等于业务中断,关键是线上请求受到什么影响,以及影响是否仍在 SLO 之内。

观察时把指标放在同一条时间线上:

时间       扩容操作/节点状态       重分布与资源       业务探针
T-15 min   集群稳定                资源基线           成功率、P95/P99 基线
T0         开始加入新节点          连接/启动           持续请求
T+...      新节点正常              观察磁盘、网络       观察错误与尾延迟
T+2~5 h    等待负载趋稳            节点负载逐步均衡     验证 SLO 与数据

如果 P95 上升同时伴随磁盘 I/O 或网络接近饱和,优先判断是否发生资源争用;如果探针出现连接错误但重试后成功,还要检查应用是否可能重复提交写入;如果新节点反复掉线,则先处理节点健康问题,不要继续叠加其他变更。

重分布期间应避免频繁执行 ALTER,以免延长数据重分布时间。集群设置中也提供了关闭自动重平衡考虑项的参数:

SET CLUSTER SETTING kv.allocator.ts_consider_rebalance.enabled = false;

这不是常规扩容步骤。除非有明确运维目的、理解设置影响并准备好恢复方案,否则应保持自动重分布。演练要观察系统如何完成均衡,不要为了让监控曲线好看而先关闭它。

六、什么时候可以说扩容完成

节点已加入只是过程事件。满足以下条件后,再结束变更窗口:

  1. 新节点在 kw-status 或状态检查中持续正常,没有反复加入或退出。
  2. 业务探针成功率符合预设目标,P95/P99 回到基线附近或处于业务 SLO 范围内。
  3. 连接错误、超时和重试没有持续增长;写入重试没有造成重复业务记录。
  4. 读取扩容前后的代表性数据,核对记录数、时间范围和关键聚合值。
  5. 节点资源和集群告警趋于稳定,重分布影响不再持续扩大。

若扩容目标是替换故障节点,旧节点退役要单独检查。双副本集群可以在新节点加入后进行副本平衡,再通过节点退役命令移除故障节点,并等待副本迁移完成。不要因为新节点出现在状态列表中就立刻退役旧节点;先确认副本补足和集群健康,再按目标版本的退役流程操作。

七、如果波动超出预期,先暂停而不是继续加操作

如果探针持续失败、延迟突破 SLO、磁盘或网络接近耗尽,先暂停后续变更,保留节点状态、业务指标和日志时间线。不要同时关闭自动重平衡、频繁修改表结构或继续加入更多节点,否则变量叠加后很难定位问题。

对于超过 5 小时仍未趋稳的参考场景,可以先核对三个量:实际待迁移数据量、有效迁移带宽、扩容期间的业务资源占用。若迁移量实际是 2 TB,按相同有效带宽估算窗口可能扩大到约 4–10 小时;若有效带宽只有 30 MB/s,单 TB 数据的传输下限就接近 9 小时,还未计入调度与业务竞争。此类估算用于决定是否继续等待或安排维护窗口,不能替代对集群状态和业务指标的判断。

结语:连续性要由业务探针证明

在线扩容不是新节点启动成功就结束。先记录业务基线,再加入节点,观察自动重分布对资源和请求的影响,最后确认数据完整、业务 SLO 恢复。

因此,“零中断”不能靠一条命令保证。持续请求成功率、尾延迟、错误与重试记录,以及扩容前后的数据校验,才是判断业务是否无感的依据。

-- 坚持原创,转载请注明出处 --

评论(0)

Me