KaiwuDB 运维实战 03:双副本仲裁节点部署与高可用实践

本文面向数据库运维工程师和架构师,承接上篇对双副本仲裁方案的概念介绍,聚焦 KaiwuDB 双副本仲裁节点的实战部署与故障处理。内容基于 KaiwuDB V3.2.x,覆盖仲裁节点初始化、双副本策略启用、扩缩容操作及单节点故障场景演练。

文章目录

一、 KaiwuDB 双副本仲裁节点设计思路

1、 高可用不是"要不要",而是"怎么选"

数据库宕机是每个团队都不愿面对的场景。系统卡死、应用报错、客服电话被打爆------做后端或者 DBA 的人对此都不陌生。衡量高可用有两个核心指标:

  • RPO(Recovery Point Objective):能容忍丢失多少数据,RPO 为 0 意味着数据零丢失。

  • RTO(Recovery Time Objective):恢复需要多长时间,RTO 10 秒意味着故障后 10 秒内必须恢复服务。

不同场景对这两个指标的要求差异很大:金融交易必须 RPO 为 0,物联网传感器采集场景则可以容忍几秒的数据丢失。这也意味着高可用方案的选择必须回到业务场景本身。

2、分布式共识协议的"多数派"代价

当前分布式数据库的主流高可用方案是多副本加分布式共识协议------数据在多个节点保留多份副本,通过 RAFT 或 Paxos 等协议实现自动选主和故障转移。RAFT 协议的核心是"多数派"(quorum)机制:一个决策要生效,必须获得超过半数的节点同意。三副本的多数派是两票,意味着三个节点里最多只能坏一个------另外两个节点仍然能达成共识。如果同时坏掉两个节点,剩余节点只有一票,无法形成多数派,集群就会停摆。

三副本的好处显而易见:容错能力强、数据可靠性高、读写负载均匀分布。但代价也不小------三倍的存储开销。如果时序数据量很大,三副本意味着三倍的磁盘成本。而且实际生产中的服务器很少是同一批采购的,新旧机器混用是常态,三台机器里总有一台配置明显偏低。如果用这台旧机器跑完整数据副本,可能成为性能瓶颈;闲置不用,资源又浪费了。

3、 在成本与可靠性之间找平衡点

这就引出了一个问题:有没有办法在保留自动故障转移能力的前提下,适当降低存储成本?能不能少存一份数据,但通过其他方式弥补投票能力、让 RAFT 仍然能正常工作?如果直接把三副本去掉一个副本变成双副本,任何一个节点故障都会导致剩余节点无法形成多数派(1/2),RAFT 无法正常运转。所以简单去掉一个副本行不通。

KaiwuDB 的解决思路是在保留两个完整数据副本的基础上,引入一个不存储时序数据的"仲裁者"。这个角色只参与 RAFT 投票,不存储实际时序数据。这样一来,多数派还是两票------两个数据副本的票,或者一个数据副本加仲裁者的票。两台数据节点和一台仲裁节点,其中任意一个故障,集群仍然能达成共识。

这种方案在成本和可用性之间找到了一个折中点:存储开销从三倍降到两倍多一点(时序数据部分),同时保留了自动故障转移的能力。数据副本少了,写入的负载均衡能力会弱一些,极端情况下数据丢失的风险也比三副本略高。这不是一个"更好"的方案,而是一个在特定场景和约束下"更合适"方案。


二、KaiwuDB 双副本仲裁方案核心设计

在上一篇KaiwuDB 运维实战 02:多副本集群副本数量选型,副本越多性能越好吗?中,我们提到一个核心矛盾:中,我们提到一个核心矛盾:三副本虽然可靠,但存储成本是单节点的 3 倍,对于时序数据占比极高的物联网场景,这笔开销并不划算。 KaiwuDB V3.2.x 引入的双副本仲裁方案,本质上是用 2 个数据副本 + 1 个仲裁副本 替代标准三副本。仲裁节点只参与 Raft 共识投票,不存储时序业务数据,因此可以部署在配置较低或异构的机器上。

这里需要先明确三个核心概念:

概念 职责 能否成为 Leaseholder
数据副本(Data Replica) 存储实际时序业务数据,参与 Raft 选举
仲裁副本(Arbitration Replica) 不存储时序业务数据,参与 Raft 共识和选举
仲裁节点(Arbiter Node) 承载仲裁副本,存储关系数据和元数据,参与集群心跳 ---

整体总共有如下几条关键约束:

  • 双副本策略要求集群中至少有 2 个数据节点和 1 个仲裁节点。

  • 每个数据分片的副本构成固定为 2 个数据副本 + 1 个仲裁副本,不允许通过 CONFIGURE ZONE USING num_replicas 修改副本数量。

  • 双副本策略只能通过 ALTER RANGE ts CONFIGURE ZONE USING arbiter = trueALTER DATABASE ... CONFIGURE ZONE USING arbiter = true 启用,不支持表级别设置,不支持对已有表从三副本切换为双副本。

  • 启用双副本后,不支持切换回三副本模式。


三、KaiwuDB 双副本仲裁节点部署

部署前准备

1、节点规划与硬件要求

双副本集群的最小配置为 2 个数据节点 + 1 个仲裁节点 ,共 3 台机器。

仲裁节点的硬件可以显著低于数据节点,这是双副本方案降本的核心。但仲裁节点仍需存储关系数据和元数据,并参与集群心跳,因此不能完全无盘部署。

2、环境配置

三节点需要提前完成以下基础配置:

  • 时钟同步:所有节点启用 NTP,确保节点间时间误差不超过 500 ms

  • SSH 免密登录:数据节点之间配置免密,便于批量运维

  • 防火墙放行:开放 26257(数据库服务端口)、8080(Web 端口)、27257(BRPC 端口)

Bash 复制代码
# 示例:配置主机名解析
sudo hostnamectl set-hostname node1  # 各节点分别设置
sudo vi /etc/hosts
192.168.3.10 node1
192.168.3.11 node2
192.168.3.12 node3

集群初始化与仲裁节点加入

1、初始化数据节点

在任意一台数据节点上执行集群初始化:

Bash 复制代码
# 适用版本:KaiwuDB V3.2.x
# 在 node1 上执行
./kwbase init --insecure --host=192.168.3.10:26257

初始化完成后,启动第一个数据节点:

Bash 复制代码
./kwbase start \
  --insecure \
  --store=/var/lib/kaiwudb \
  --listen-addr=192.168.3.10:26257 \
  --advertise-addr=192.168.3.10:26257 \
  --brpc-addr=:27257 \
  --http-addr=192.168.3.10:8080 \
  --background

启动第二个数据节点并加入集群:

Bash 复制代码
# 在 node2 上执行
./kwbase start \
  --insecure \
  --store=/var/lib/kaiwudb \
  --listen-addr=192.168.3.11:26257 \
  --advertise-addr=192.168.3.11:26257 \
  --brpc-addr=:27257 \
  --http-addr=192.168.3.11:8080 \
  --join=192.168.3.10:26257 \
  --background

预期输出: 控制台显示节点启动成功,日志中无 ERROR 级别报错。

2、加入仲裁节点

仲裁节点的启动命令与普通数据节点几乎一致,仅需增加 --arbiter 参数

Bash 复制代码
# 在 node3(仲裁节点)上执行
./kwbase start \
  --insecure \
  --store=/var/lib/kaiwudb \
  --arbiter \
  --listen-addr=192.168.3.12:26257 \
  --advertise-addr=192.168.3.12:26257 \
  --brpc-addr=:27257 \
  --http-addr=192.168.3.12:8080 \
  --join=192.168.3.10:26257 \
  --background

注意事项:

  • --arbiter 参数必须在启动时指定,无法对已有节点动态切换为仲裁节点

  • 仲裁节点仍需指定 --store 目录,用于存储关系数据和元数据

3、验证节点状态

连接任意节点,查看集群成员状态:

SQL 复制代码
-- 使用 psql 或 kwbase sql 连接
SHOW NODES;

预期结果应显示 3 个节点,其中仲裁节点的 membership 字段显示为 arbiter,数据节点显示为 normal


启用双副本策略

双副本策略不是默认开启的,需要在集群初始化后手动启用。启用时集群中不能存在任何时序表,否则命令将失败。

1、全局启用

对集群内全部时序数据启用双副本:

SQL 复制代码
-- 适用场景:新建集群,尚未创建时序表
ALTER RANGE ts CONFIGURE ZONE USING arbiter = true;

效果: 系统随后将时序数据分片自动分配为 2 个数据副本 + 1 个仲裁副本,并将 Leaseholder 迁移至数据节点。

注意: 初始化完成后副本补足和 Leaseholder 迁移需要一定时间,期间首次建表的响应时间会略长于标准三副本集群。

2、按数据库启用

如果只想对特定时序数据库启用双副本:

SQL 复制代码
-- 目标数据库中不能存在时序表
ALTER DATABASE <db_name> CONFIGURE ZONE USING arbiter = true;

验证是否生效:

SQL 复制代码
-- 查看时序分片的副本分布
SHOW RANGES FROM TABLE <ts_table>;

预期结果应显示每个分片包含 2 个数据副本和 1 个仲裁副本。


扩缩容操作

双副本集群支持通过扩缩容处理节点故障或调整集群规模。每个数据分片的副本构成标准始终为 2 数据副本 + 1 仲裁副本,允许暂时缺少一个数据副本或仲裁副本,但不允许数据副本数量超过 2 个,也不允许仲裁副本数量超过 1 个。

1、加入新数据节点

Bash 复制代码
# 新数据节点启动命令与普通节点一致
./kwbase start \
  --insecure \
  --store=/data_new \
  --listen-addr=<new_node_address>:26257 \
  --advertise-addr=<new_node_address>:26257 \
  --brpc-addr=:27257 \
  --http-addr=<new_node_address>:8080 \
  --join=<existing_node_address>:26257 \
  --background

新节点加入后,系统可能触发副本自动均衡,将部分副本迁移至新节点。

2、加入新仲裁节点

Bash 复制代码
# 新仲裁节点需增加 --arbiter 参数
./kwbase start \
  --insecure \
  --store=/data_new \
  --arbiter \
  --listen-addr=<new_node_address>:26257 \
  --advertise-addr=<new_node_address>:26257 \
  --brpc-addr=:27257 \
  --http-addr=<new_node_address>:8080 \
  --join=<existing_node_address>:26257 \
  --background

3、退役故障节点

加入新节点后,可执行退役操作移除故障节点,退役操作会将故障节点上的副本迁移至新节点,等待命令执行完成后,所有副本已在新节点上补全。也可以不立即执行退役,等待故障节点被系统判定为死亡后,系统会自动在其他节点上补足副本。

Bash 复制代码
# 退役指定节点,系统会将该节点上的副本迁移至其他节点
./kwbase node decommission <node_id> --insecure --host=<address>:26257

约束条件:

  • 退役数据节点时,集群中必须至少有 3 个数据节点(即除目标节点外至少还有 2 个数据节点)

  • 退役仲裁节点时,集群中必须至少有 2 个仲裁节点

  • 如果没有加入同类型的新节点以替代故障节点,缩容操作将失败


故障演练:单节点故障

双副本方案通过 Raft 投票机制实现高可用,可容忍任意一个节点故障

1、数据节点故障

场景: node1(数据节点)突然宕机。

预期行为:

  • 剩余 1 个数据副本(node2)与仲裁副本(node3)组成 2/3 多数,达成 Raft 共识

  • 由剩余数据节点继续对外提供读写服务

  • 节点恢复后,自动重新加入集群并与 Leader 完成数据同步,读写服务不受影响

验证命令:

SQL 复制代码
-- 在 node2 上查询集群状态
SELECT * FROM kwdb_internal.kv_node_status;
-- 确认 node1 状态为 unavailable,但读写操作仍正常

2、仲裁节点故障

场景: node3(仲裁节点)突然宕机。

预期行为:

  • 2 个数据副本自身即可达成 2/2 多数,集群读写服务不受影响

  • 仲裁节点恢复后,自动重新加入集群,恢复投票能力

关键差异: 仲裁节点故障对业务零影响,因为数据副本之间已能形成多数派。

3、多节点故障风险提示

当任意两个节点同时故障时(包括两个数据节点同时故障,或一个数据节点与仲裁节点同时故障),集群无法达成多数共识,写入操作将失败。待任意一个节点恢复后,集群恢复服务。


监控与 RPO 配置

1、RPO 配置

双副本方案采用弱一致性保证:数据写入 Leader 副本后即视为成功,Follower 数据副本可能存在短暂落后。可通过 ts.arbiter.rpo_max_duration 控制数据同步周期。ts.arbiter.rpo_max_duration 用于控制双副本模式下数据节点间数据同步的时间周期,即最大允许丢失的数据时间范围。仅在启用双副本模式时生效。

SQL 复制代码
-- 设置最大允许丢失的数据时间范围为 60 秒
SET CLUSTER SETTING ts.arbiter.rpo_max_duration = '60s';
取值 说明
-1(默认) 不进行 RPO 控制,数据节点之间无需周期性数据同步
大于 1s 的时间值 系统按设定周期在数据节点之间同步数据,强制同步期间阻塞写入

注意: 开启 RPO 控制后,如果有数据节点故障,写入将持续阻塞,直至数据节点恢复或新数据节点加入且故障节点退役。

2、查看节点状态

执行以下命令查看集群节点状态,输出中 node_mode 列显示各节点角色:

SQL 复制代码
./kwbase node status --insecure --host=<address>:26257

-- 输出示例
id |      address      |   sql_address     |  build  |         started_at          |         updated_at          |   locality    | is_available | is_live | node_mode
-----+-------------------+-------------------+---------+-----------------------------+-----------------------------+---------------+--------------+---------+-----------
1 | node_a:26257      | node_a:26257      | V3.2.0  | 2026-03-02 09:24:56.827856  | 2026-03-02 09:25:01.343206  | region=NODE1  | true         | true    | normal
2 | node_b:26257      | node_b:26257      | V3.2.0  | 2026-03-02 09:24:58.012345  | 2026-03-02 09:25:02.234567  | region=NODE2  | true         | true    | normal
3 | node_c:26257      | node_c:26257      | V3.2.0  | 2026-03-02 09:25:00.543210  | 2026-03-02 09:25:03.654321  | region=NODE3  | true         | true    | arbiter

node_mode 字段取值说明:

3、关键监控指标

在 KaiwuDB 内置监控平台的 debug/chart 页面,关注以下指标:


常见问题 FAQ

Q1:KaiwuDB 仲裁节点可以部署在配置很低的机器上吗?

可以。仲裁节点不存储时序业务数据,仅参与 Raft 共识投票,因此可部署在配置较低或与数据节点存在硬件差异的机器上。但仲裁节点仍需存储关系数据和元数据,并参与集群心跳,不能完全无盘部署。

Q2:KaiwuDB 启用双副本策略后,还能切换回三副本吗?

不能。双副本策略启用后不支持切换回三副本模式,也不支持对已有表从三副本切换为双副本。建议在启用前充分评估业务场景对数据一致性和可用性的要求。

Q3:KaiwuDB 双副本方案能容忍几个节点同时故障?

可容忍任意一个节点故障。当任意两个节点同时故障时,集群无法达成多数共识,写入操作将失败。

Q4:KaiwuDB 双副本方案的 RPO 是多少?

默认不限制(-1)。可通过 ts.arbiter.rpo_max_duration 配置数据同步周期,控制最大数据丢失量。开启后若数据节点故障,写入将持续阻塞。


双副本仲裁方案是 KaiwuDB V3.2.x 在成本与可靠性之间给出的一个双赢答案:没有牺牲高可用能力------任意单点故障仍能自动切换------却将时序数据的存储成本显著压缩。对于时序数据体量庞大、但对极端场景下多节点同时故障容忍度较低的业务,这是一个值得很多企业认真评估的方案选项。

你在生产环境中使用过双副本仲裁方案吗?遇到过哪些坑?欢迎在评论区分享你的经验。


相关推荐

相关推荐
Zhang~Ling1 小时前
Linux多线程互斥锁:从现象到原理解析
linux·运维·网络
三言老师10 小时前
K8s集群运行时自动化运维全覆盖落地实操(下)
linux·运维·服务器·网络
躺不平的理查德13 小时前
嵌入式 Linux 系统移植与 SD 卡量产镜像制作
linux·运维·服务器
一直走下去-明14 小时前
centos7无法安装tcpreplay
linux·运维
IT大白鼠14 小时前
n8n工作流自动化平台技术架构与应用价值评估
运维·架构·自动化·n8n
anxiao_m14 小时前
园区数字孪生怎么搭建?主流方案与服务商深度对比
大数据·运维·人工智能
时空无限14 小时前
ubuntu dpkg -l 输出第一列解释
linux·运维·ubuntu
Splashtop高性能远程控制软件15 小时前
AI 落地的连接基建评估:消费品行业远程连接方案的四个技术维度(性能 / 精度 / 安全 / 统一管理)
运维·人工智能·安全·远程工作·splashtop
ITyunwei098716 小时前
技术管理者视角:AI 重构 ITSM 的四个工程化落点
运维·人工智能