配置 MongoDB 副本集仲裁节点需在启动 mongod 时指定与数据节点一致的 replSetName,并通过 rs.addArb() 命令加入复制集。该方案适合需要奇数投票节点但受成本限制无法增加数据节点的场景,注意 MongoDB 5.3 版本起默认禁用多个仲裁节点。
先说结论:仲裁节点仅参与选举投票不存储数据,配置核心是确保复制集名称一致且网络可达。
- 适合:主从架构需奇数投票权且希望节省存储资源的场景
- 先准备:独立服务器或虚拟机,安装与数据节点版本一致的 MongoDB
- 验收:使用 rs.status() 确认节点状态显示为 ARBITER
命令速用版
在已初始化的副本集主节点上执行以下命令添加仲裁:
rs.addArb('hostname:27017')启动仲裁节点实例时建议配置:
mongod `--config` /etc/mongod.conf `--noprealloc`为什么会这样
仲裁节点的设计目的是在不增加数据存储成本的前提下打破选举平局。副本集选举需要多数票(Majority),当数据节点为偶数(如一主一从)时,网络分区可能导致无法选出主节点,加入仲裁节点可构成奇数投票组(如 2 数据 +1 仲裁)。
仲裁节点不存储数据也不提供读写服务,仅维护副本集配置信息和参与投票,因此资源占用极低。从 MongoDB 5.3 版本开始,默认禁止部署多个仲裁节点,以防止配置滥用导致选举逻辑复杂化。
分步处理
第一步:准备配置文件。在仲裁节点服务器上创建 mongod.conf,确保 replication.replSetName 与现有副本集名称完全一致,例如 rs0。
第二步:启动仲裁实例。使用配置文件启动 mongod 进程,可添加 `--noprealloc` 参数减少预分配空间,因为仲裁节点不存储数据文件。
第三步:加入复制集。连接至副本集主节点,执行 rs.addArb('仲裁节点 IP: 端口') 命令。
第四步:检查状态。执行 rs.status() 查看 members 列表,确认新节点 stateStr 字段显示为 ARBITER。
怎么验证是否生效
在 MongoDB Shell 中运行 rs.status() 命令,返回结果中 members 数组应包含新节点,且该节点的 stateStr 值为 ARBITER,optDate 字段通常为空或极旧,因为不同步数据。
检查日志文件,仲裁节点启动日志中应显示 replica set name 匹配成功,且无数据目录初始化的大量日志。
常见坑
MongoDB 5.3 及以上版本默认不允许添加多个仲裁节点,若需部署多个仲裁,启动所有节点时必须添加参数 `--setParameter` 'allowMultipleArbiters=true',否则服务器将返回 Multiple arbiters are not allowed 错误。
仲裁节点不应与数据节点部署在同一台物理机上,否则机器故障会导致数据节点和投票节点同时丢失,失去高可用意义。
确保防火墙开放副本集通信端口,仲裁节点虽不存数据但仍需参与心跳和选举通信,网络不通会导致投票失败。
常见问题
仲裁节点能存储数据吗
不能,仲裁节点不存储任何业务数据,仅提供投票服务,因此不需要配置大容量磁盘。
可以在一个副本集中配置多个仲裁节点吗
MongoDB 5.3 版本前支持,5.3 及之后版本默认禁止,除非启动时显式开启 allowMultipleArbiters 参数。
仲裁节点挂了会影响读写吗
不影响当前读写,但会影响选举能力,若剩余存活节点数不足多数票,副本集将无法选举主节点导致服务不可用。
参考来源
- mongodb arbiter 节点 - 设置 MongoDB Arbiter 节点流程
- 副本集投票节点 - MongoDB 5.3 版本中的新增功能及多仲裁限制
- 将仲裁节点添加到自管理副本集 - 官方文档关于 PSA 架构及投票节点说明
- MongoDB 配置副本集 (含 Arbiter) - Linux 环境下集群模式配置