本文面向数据库运维工程师和架构师,聚焦 KaiwuDB V3.2.x 双副本仲裁方案在生产环境中的部署与高可用验证。相比标准三副本,该方案通过 2 个数据副本 + 1 个仲裁副本的架构,在保障任意单点故障自动切换能力的同时,将时序数据存储成本降低约 33%。全文覆盖仲裁节点初始化、双副本策略启用、扩缩容操作及单节点故障场景演练,为 DBA 提供一份可直接复现的运维参考。
Table of Contents
- 一、从 DBA 视角看 KaiwuDB 双副本仲裁方案的设计取舍
- 二、部署前准备与环境规划
- 三、集群初始化与仲裁节点加入
- 四、双副本策略启用与验证
- 五、扩缩容与节点退役
- 六、单节点故障演练与 RPO 配置
- 七、监控指标与运维建议
- FAQ
- Q1:KaiwuDB 双副本仲裁方案相比标准三副本,在选型时的核心差异是什么?
- Q2:仲裁节点能否部署在异构或低配机器上,对生产环境有哪些要求?
- Q3:KaiwuDB 双副本集群在单节点故障时的自动切换机制是怎样的?
- Q5:双副本集群扩缩容时,数据节点和仲裁节点的退役条件有何不同?
- 结语
- 相关阅读:
一、从 DBA 视角看 KaiwuDB 双副本仲裁方案的设计取舍
1.1 高可用与成本的永恒博弈
数据库高可用(High Availability)是生产系统的基本要求。衡量高可用有两个核心指标:
-
RPO(Recovery Point Objective):能容忍丢失多少数据。
-
RTO(Recovery Time Objective):恢复需要多长时间。
当前分布式数据库的主流方案是多副本加分布式共识协议——通过 RAFT 或 Paxos 实现自动选主和故障转移。RAFT 的核心是"多数派"机制:三副本的多数派是两票,意味着三个节点里最多只能坏一个。但三副本的代价是三倍的存储开销。在时序数据占比极高的物联网与工业互联网场景中,标准三副本架构意味着存储成本随数据量线性膨胀至单节点的 3 倍。对于测点规模达到百万级、数据保留周期以年为单位的生产系统,这笔存储开销在选型阶段往往成为关键制约因素。
1.2 双副本仲裁:用"投票权"换"存储空间"
如果直接把三副本去掉一个副本变成双副本,任何一个节点故障都会导致剩余节点无法形成多数派(1/2),RAFT 无法正常运转。解决思路是在保留两个完整数据副本的基础上,引入一个不存储时序数据的"仲裁者"——只参与 RAFT 投票,不存储实际时序数据。这样一来,多数派还是两票:两个数据副本的票,或者一个数据副本加仲裁者的票。两台数据节点和一台仲裁节点中,任意一个故障,集群仍然能达成共识。这种方案在成本和可用性之间找到了一个折中点:存储开销从三倍降到两倍多一点(时序数据部分),同时保留了自动故障转移的能力。
KaiwuDB V3.2.x 引入的双副本仲裁方案,本质上是用 2 个数据副本 + 1 个仲裁副本 替代标准三副本。仲裁节点仅参与 Raft 共识投票,不承载时序业务数据,因此可部署在配置较低或异构硬件上。从 DBA 视角看,这是在成本与可靠性之间的一次精准权衡:没有牺牲单点故障的自动切换能力,却将时序数据的存储副本开销从 3 份压缩至 2 份。

1.3 2+1 架构的角色定义与约束
在深入部署步骤前,我们先厘清三个核心角色的职责边界:
| 概念 | 职责 | 能否成为 Leaseholder |
|---|---|---|
| 数据副本(Data Replica) | 存储实际时序业务数据,参与 Raft 选举 | 是 |
| 仲裁副本(Arbitration Replica) | 不存储时序业务数据,参与 Raft 共识和选举 | 否 |
| 仲裁节点(Arbiter Node) | 承载仲裁副本,存储关系数据和元数据,参与集群心跳 | — |
关键约束(选型时需要关注):
-
集群最小配置为 2 个数据节点 + 1 个仲裁节点,共 3 台机器。
-
每个时序数据分片的副本构成固定为 2 数据副本 + 1 仲裁副本,不允许通过
CONFIGURE ZONE USING num_replicas修改副本数量。 -
双副本策略仅支持通过
ALTER RANGE ts或ALTER DATABASE ...启用,不支持表级别设置,也不支持对已有表从三副本切换为双副本。 -
启用后不支持回退至三副本模式,生产环境启用前务必充分评估。
二、部署前准备与环境规划
2.1 节点规划与硬件选型建议
双副本集群的最小配置为 2 个数据节点 + 1 个仲裁节点。仲裁节点的硬件可以显著低于数据节点,这是双副本方案降本的核心,但仲裁节点仍需存储关系数据和元数据,并参与集群心跳,因此不能完全无盘部署。

2.2 基础环境配置
三节点要提前完成以下基础配置,任何一项缺失都可能导致后续 Raft 共识异常或集群脑裂:
-
时钟同步:所有节点启用 NTP,确保节点间时间误差不超过 500 ms。
-
SSH 免密登录:数据节点之间配置免密,便于批量运维。
-
防火墙放行:开放 26257(数据库服务端口)、8080(Web 端口)、27257(BRPC 端口)。
# 示例:配置主机名解析
sudo hostnamectl set-hostname node1 # 各节点分别设置
sudo vi /etc/hosts
192.168.3.10 node1
192.168.3.11 node2
192.168.3.12 node3
适用版本:KaiwuDB V3.2.x
注意事项:
--insecure仅用于测试环境,生产环境建议启用 TLS。
三、集群初始化与仲裁节点加入
3.1 数据节点初始化
在任意一台数据节点上执行集群初始化,随后启动首个数据节点:
# 在 node1 上执行
./kwbase init --insecure --host=192.168.3.10:26257
./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
启动第二个数据节点并加入集群:
# 在 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 级别报错。
3.2 仲裁节点启动与状态验证
仲裁节点的启动命令与普通数据节点几乎一致,仅需增加 --arbiter 参数:
# 在 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目录,用于存储关系数据和元数据。
连接任意节点验证集群成员状态:
-- 使用 psql 或 kwbase sql 连接
SHOW NODES;
预期结果:显示 3 个节点,其中仲裁节点的
membership字段为arbiter,数据节点为normal。
四、双副本策略启用与验证
双副本策略不是默认开启的,需要在集群初始化后手动启用。启用时集群中不能存在任何时序表,否则命令将失败。
4.1 全局/按库启用双副本
对集群内全部时序数据启用双副本:
-- 适用场景:新建集群,尚未创建时序表
ALTER RANGE ts CONFIGURE ZONE USING arbiter = true;
若仅对特定时序数据库启用:
-- 目标数据库中不能存在时序表
ALTER DATABASE <db_name> CONFIGURE ZONE USING arbiter = true;
预期效果:系统将时序数据分片自动分配为 2 个数据副本 + 1 个仲裁副本,并将 Leaseholder 迁移至数据节点。初始化完成后副本补足和 Leaseholder 迁移需要一定时间,期间首次建表的响应时间会略长于标准三副本集群。
4.2 副本分布验证
-- 查看时序分片的副本分布
SHOW RANGES FROM TABLE <ts_table>;
预期结果:每个分片包含 2 个数据副本和 1 个仲裁副本。
五、扩缩容与节点退役
每个数据分片的副本构成标准始终为 2 数据副本 + 1 仲裁副本,允许暂时缺少一个数据副本或仲裁副本,但不允许数据副本数量超过 2 个,也不允许仲裁副本数量超过 1 个。
5.1 新节点加入
新数据节点启动命令与普通节点一致:
./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
新仲裁节点需增加 --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
新节点加入后,系统可能触发副本自动均衡,将部分副本迁移至新节点。
5.2 节点退役的约束条件
# 退役指定节点,系统会将该节点上的副本迁移至其他节点
./kwbase node decommission <node_id> --insecure --host=<address>:26257
约束条件(运维时必须关注):
退役数据节点时,集群中必须至少有 3 个数据节点(即除目标节点外至少还有 2 个数据节点)。
退役仲裁节点时,集群中必须至少有 2 个仲裁节点。
如果没有加入同类型的新节点以替代故障节点,缩容操作将失败。
六、单节点故障演练与 RPO 配置
双副本方案通过 Raft 投票机制实现高可用,可容忍任意一个节点故障。
6.1 数据节点故障场景
场景:node1(数据节点)突然宕机。
预期行为:
-
剩余 1 个数据副本(node2)与仲裁副本(node3)组成 2/3 多数,达成 Raft 共识。
-
由剩余数据节点继续对外提供读写服务。
-
节点恢复后,自动重新加入集群并与 Leader 完成数据同步,读写服务不受影响。
验证命令:
-- 在 node2 上查询集群状态
SELECT * FROM kwdb_internal.kv_node_status;
-- 确认 node1 状态为 unavailable,但读写操作仍正常
6.2 仲裁节点故障场景
场景:node3(仲裁节点)突然宕机。
预期行为:
-
2 个数据副本自身即可达成 2/2 多数,集群读写服务不受影响。
-
仲裁节点恢复后,自动重新加入集群,恢复投票能力。
关键差异:仲裁节点故障对业务零影响,因为数据副本之间已能形成多数派。
6.3 多节点故障风险与 RPO 配置
当任意两个节点同时故障时(包括两个数据节点同时故障,或一个数据节点与仲裁节点同时故障),集群无法达成多数共识,写入操作将失败。待任意一个节点恢复后,集群恢复服务。
双副本方案默认采用弱一致性保证:数据写入 Leader 副本后即视为成功,Follower 数据副本可能存在短暂落后。可通过 ts.arbiter.rpo_max_duration 控制数据同步周期:
-- 设置最大允许丢失的数据时间范围为 60 秒
SET CLUSTER SETTING ts.arbiter.rpo_max_duration = '60s';
| 取值 | 说明 |
|---|---|
-1(默认) |
不进行 RPO 控制,数据节点之间无需周期性数据同步 |
| 大于 1s 的时间值 | 系统按设定周期在数据节点之间同步数据,强制同步期间阻塞写入 |
选型建议:开启 RPO 控制后,如果有数据节点故障,写入将持续阻塞,直至数据节点恢复或新数据节点加入且故障节点退役。对一致性要求极高的场景(如金融交易)建议开启;纯监控、IoT 场景保持默认即可。
七、监控指标与运维建议
执行以下命令查看集群节点状态,输出中 node_mode 列显示各节点角色:
./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** 字段取值说明**:
| 取值 | 含义 |
|---|---|
normal |
普通数据节点 |
arbiter |
仲裁节点 |
decommissioning |
正在退役 |
decommissioned |
已退役 |
在 KaiwuDB 内置监控平台的 debug/chart 页面,DBA 应重点关注以下指标:

FAQ
Q1:KaiwuDB 双副本仲裁方案相比标准三副本,在选型时的核心差异是什么?
核心差异在于成本与故障容忍度的权衡。三副本可容忍任意一个节点故障,甚至在部分场景下可容忍两个节点故障;双副本仲裁方案可容忍任意单点故障,但任意两个节点同时故障时写入将失败。作为补偿,双副本方案将时序数据存储成本从 3 倍降至 2 倍,仲裁节点可部署于低配或异构硬件。对于时序数据体量大、能接受双节点极端故障场景下写入中断的业务,双副本方案是更具成本效益的选择。
Q2:仲裁节点能否部署在异构或低配机器上,对生产环境有哪些要求?
可以。仲裁节点不存储时序业务数据,仅参与 Raft 共识投票,因此可部署在配置较低或与数据节点存在硬件差异的机器上。但仲裁节点仍需存储关系数据和元数据,并参与集群心跳,不能完全无盘部署。生产环境中建议为仲裁节点预留足够的元数据存储空间,并确保其与数据节点之间的网络延迟稳定。
Q3:KaiwuDB 双副本集群在单节点故障时的自动切换机制是怎样的?
基于 Raft 共识算法。当数据节点故障时,剩余 1 个数据副本 + 1 个仲裁副本可组成 2/3 多数派,继续对外提供读写服务;当仲裁节点故障时,2 个数据副本自身即可达成 2/2 多数派,业务零感知。故障节点恢复后自动重新加入集群并完成数据同步,无需人工干预。
Q4:启用双副本策略后,RPO 配置应如何根据业务场景选择?
默认值为 -1,即不进行 RPO 控制,数据写入 Leader 后即视为成功,Follower 可能存在短暂落后,适用于对延迟敏感、可接受少量数据丢失的监控和 IoT 场景。若设置为大于 1s 的时间值(如 60s),系统将按周期强制数据节点间同步,同步期间阻塞写入,适用于对一致性要求高的场景。开启 RPO 后若数据节点故障,写入将持续阻塞直至恢复,选型时需评估业务对写入可用性的容忍度。
Q5:双副本集群扩缩容时,数据节点和仲裁节点的退役条件有何不同?
退役数据节点时,集群中必须至少保留 3 个数据节点(除目标节点外至少还有 2 个);退役仲裁节点时,必须至少保留 2 个仲裁节点。这是因为系统需要确保副本迁移后有足够的同类型节点承载 2 数据副本 + 1 仲裁副本的标准构成。缩容前务必先加入同类型新节点,否则退役操作将失败。
结语
KaiwuDB V3.2.x 双副本仲裁方案为时序数据场景提供了一条在成本与可靠性之间精准平衡的路径:没有牺牲单点故障的自动切换能力,却将存储开销显著压缩。对于正在评估国产数据库选型、面临海量时序数据存储成本压力的 DBA 和架构师而言,2+1 架构值得纳入技术方案对比清单。
关于 KaiwuDB 在国产数据库选型与高可用架构设计中的实践,你还有哪些想深入了解的?欢迎在评论区交流。




