副本集概念与搭建
约 695 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › MongoDB › 副本集与分片(在新窗口打开) › 副本集概念与搭建
什么是副本集
副本集(Replica Set)是一组维护相同数据集的 mongod 实例,提供高可用和数据冗余。
节点角色
| 节点 | 默认角色 | 说明 |
|---|---|---|
| Primary | 读写 | 唯一可写的节点(默认) |
| Secondary | 只读 | 从 Primary 同步数据 |
| Arbiter | 不存数据 | 仅参与选举投票 |
| Hidden | 不可见 | 隐藏节点,专用于报表/备份 |
| Delayed | 延迟同步 | 用于误操作恢复 |
搭建副本集
1. 启动节点
# 启动三个节点(生产环境至少 3 个)
mongod --replSet rs0 --port 27017 --dbpath /data/rs0-1 --bind_ip localhost
mongod --replSet rs0 --port 27018 --dbpath /data/rs0-2 --bind_ip localhost
mongod --replSet rs0 --port 27019 --dbpath /data/rs0-3 --bind_ip localhost2. 初始化
// 连接任意节点,初始化
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "localhost:27017" },
{ _id: 1, host: "localhost:27018" },
{ _id: 2, host: "localhost:27019" }
]
})
// 查看副本集状态
rs.status()
// 查看当前配置
rs.conf()3. 添加/删除节点
// 添加节点
rs.add("localhost:27020")
rs.addArb("localhost:27021") // 添加仲裁节点
// 删除节点
rs.remove("localhost:27020")
// 配置节点优先级(优先级高的节点更容易被选为 Primary)
cfg = rs.conf()
cfg.members[0].priority = 2 // 最高
cfg.members[1].priority = 1
cfg.members[2].priority = 0 // 永远不会成为 Primary
rs.reconfig(cfg)故障转移
// 模拟 Primary 故障
// 停止 Primary 节点
// 集群自动选举产生新的 Primary
// 查看当前 Primary
rs.isMaster()
// 手动降级(让当前 Primary 变为 Secondary)
rs.stepDown(60) // 60 秒内不能成为 Primary读写分离
// 默认:所有读写走 Primary
// 在连接字符串中设置 Read Preference
// mongodb://host1:27017,host2:27018,host3:27019/?replicaSet=rs0&readPreference=secondary
// 在 mongosh 中
db.getMongo().setReadPref("secondary")
// Read Preference 选项
// primary: 默认,全读 Primary
// primaryPreferred: 优先读 Primary,不可用时读 Secondary
// secondary: 全读 Secondary
// secondaryPreferred: 优先读 Secondary,不可用时读 Primary
// nearest: 读最近的节点oplog
oplog(操作日志)是副本集复制的核心,存储在 local.oplog.rs:
// 查看 oplog 状态
use local
db.oplog.rs.find().sort({ $natural: -1 }).limit(1).pretty()
// 查看 oplog 大小
db.oplog.rs.stats().maxSize
// 查看延迟
rs.printSlaveReplicationInfo()小结
- 副本集至少 3 个节点(或 2 个 + 1 个 Arbiter)保证高可用。
- Primary 负责读写,Secondary 同步 oplog。
- 故障时自动选举新的 Primary(由大多数节点决定)。
- 读写分离:设置
readPreference将读请求路由到 Secondary。 - oplog 是复制的基础,大小有限——延迟太大会导致 Secondary 落后。
