首页/数据/NoSQL 速查/rs.initiate 初始化复制集
MongoDB99 条

rs.initiate 初始化复制集

在单个节点上执行 rs.initiate 并在配置中列出全部成员:hostname 必须是各成员都能解析的地址;副本集名自定但要全组一致。

NoSQL 速查数据更新于 2026-10-13

初始化复制集

副本集需要显式初始化:在其中一个节点的 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是否为仲裁节点只投票不存数据,适合预算受限的奇数节点方案
单节点也可以初始化成副本集(只列一个成员):这样本地就能使用事务与变更流,是开发环境验证相关功能的常用做法。
初始化后不要随手改成员地址:配置变更会写入配置版本并在成员间同步,地址错误时多数派一旦不稳定,集群会长时间没有主节点。

易错点

  • host 写成 localhost 或容器内部名字:其他成员无法回连,rs.status 里长期显示异常,客户端选主也会失败
  • 副本集名与启动参数不一致:初始化直接失败或各成员各自为政,先核对 replSetName
  • 成员数量配置成偶数且没有仲裁:多数派判断更脆弱,维护期间更容易失去主节点
  • 在已初始化过的节点上重复执行初始化:命令会报错,正确做法是查看 rs.status 或用 rs.reconfig 调整

数据来源与参考

  • MongoDB Manual: rs.initiate()
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌