初始化复制集
副本集需要显式初始化:在其中一个节点的 mongosh 里执行 rs.initiate 并给出成员配置,各成员开始互相通信、选出主节点。最容易出问题的不是命令本身,而是配置里的主机名——它必须是所有成员都能解析并连通的地址;写 localhost 或容器内部名字,会在初始化后表现为部分成员始终异常。
基本信息
| 语法 | rs.initiate({ _id: "rs0", members: [ ... ] }) |
|---|---|
| 副本集名 | _id 必须与各节点启动参数 replSetName 一致 |
| 成员定义 | { _id: 0, host: "m1:27017" },_id 从 0 递增且唯一 |
| 前提条件 | 各节点 mongod 已按副本集模式启动,且尚未初始化过 |
| 查看状态 | rs.status() 看成员角色与健康,rs.conf() 看当前配置 |
| 后续扩缩容 | rs.add / rs.remove 增删成员,配置版本号随之递增 |
典型使用场景
- 三节点标准集群:两个可投票数据节点加一个优先级为 0 的成员
- 本地开发验证:单节点初始化成复制集,才能使用事务与变更流
- 异地容灾:成员分布在不同可用区,注意多数派位置决定写延迟
- 角色规划:隐藏成员承担备份读写,延迟成员用于误操作兜底
- 迁移重建:把老集群成员逐个替换为新实例
初始化示例
初始化示例
// 在其中一个节点执行;host 必须是全组都能解析并连通的地址
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "m1:27017" },
{ _id: 1, host: "m2:27017" },
{ _id: 2, host: "m3:27017", priority: 0, votes: 1 } // 优先级 0:不参与主节点选举
],
settings: { chainingAllowed: true }
})
// 查看成员角色、健康状态与复制延迟
rs.status().members.map(function (m) { return { name: m.name, state: m.stateStr, health: m.health } })
// 确认配置内容与版本号
rs.conf()成员字段读法
| 字段 | 含义 | 使用建议 |
|---|---|---|
| _id | 成员编号 | 必须唯一,从 0 递增 |
| host | 成员地址(主机名:端口) | 必须全组可解析;地址写错是最常见的初始化故障 |
| priority | 选举优先级 | 0 表示不会被选为主节点,适合备份与只读成员 |
| votes | 是否参与投票 | 投票成员总数与多数派判断相关,不宜随意改动 |
| hidden | 是否对客户端隐藏 | 隐藏成员不接收普通读取,常用于专用任务 |
| arbiterOnly | 是否为仲裁节点 | 只投票不存数据,适合预算受限的奇数节点方案 |
单节点也可以初始化成副本集(只列一个成员):这样本地就能使用事务与变更流,是开发环境验证相关功能的常用做法。
初始化后不要随手改成员地址:配置变更会写入配置版本并在成员间同步,地址错误时多数派一旦不稳定,集群会长时间没有主节点。