MongoDB副本集是一组维护相同数据集的mongod实例,其中只有一个节点作为主节点接收写请求,其余从节点通过拉取主节点的操作日志实现数据同步。当主节点不可用时,副本集会基于Raft-like的选举协议从从节点中推选出新主节点,从而保障服务持续可用。理解这一机制是正确搭建集群的前提。

一、环境规划与节点准备
在搭建副本集之前,需要先确定节点数量与网络规划。官方建议采用奇数个投票节点(如3、5、7个),这样在出现网络分区时可以避免选举平票。如果是资源有限的测试环境,也可以使用一个主节点、一个从节点加一个仲裁节点(arbiter)的组合,仲裁节点只参与投票不存储数据。
假设我们在同一台机器上用不同端口模拟三个节点,规划如下:主节点端口27017,从节点27018,仲裁节点27019。为每个节点创建独立的数据目录和日志文件,避免文件冲突。同时所有节点必须使用相同大版本的MongoDB二进制,否则可能因为特性差异导致同步异常。
# 创建数据目录 mkdir -p /data/rs1 /data/rs2 /data/rs3 # 创建日志目录 mkdir -p /var/log/mongodb # 启动三个实例(测试用,未开启认证) mongod --port 27017 --dbpath /data/rs1 --logpath /var/log/mongodb/rs1.log --replSet rs0 --fork mongod --port 27018 --dbpath /data/rs2 --logpath /var/log/mongodb/rs2.log --replSet rs0 --fork mongod --port 27019 --dbpath /data/rs3 --logpath /var/log/mongodb/rs3.log --replSet rs0 --fork
二、编写配置文件与统一副本集名称
使用命令行参数可以快速验证流程,但在生产环境更推荐通过配置文件管理。关键配置项是replication.replSetName,所有成员必须填写相同的副本集名称,以及net.port和storage.dbPath等基础项。这样当节点启动时,mongod进程就知道自身属于哪个逻辑集群。
下面给出一个节点配置文件示例,其他节点只需修改端口与路径即可。注意如果开启权限认证,还需配置security.keyFile,该文件内容要求所有节点完全一致且权限为600,否则节点间无法互信。
# /etc/mongod_rs1.conf systemLog: destination: file path: /var/log/mongodb/rs1.log storage: dbPath: /data/rs1 net: port: 27017 bindIp: 127.0.0.1 replication: replSetName: rs0 # 若启用认证,取消下一行注释并生成keyFile # security: # keyFile: /data/keyfile
三、初始化副本集
当所有节点都以相同的replSetName启动后,它们还处于孤立状态,需要通过rs.initiate()命令把配置推送给其中一个节点,再由该节点将配置广播给其余成员。初始化时只需连接到任一节点执行即可,通常选计划中的主节点。
在mongo shell中执行以下命令,_members_数组中的host必须能被其他节点解析,如果是本机模拟就写127.0.0.1:端口。仲裁节点需将arbiterOnly设为true。执行成功后副本集会进入选举流程,几秒内就能看到成员角色分配结果。
// 连接到27017节点
mongo --port 27017
// 初始化副本集配置
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "127.0.0.1:27017" },
{ _id: 1, host: "127.0.0.1:27018" },
{ _id: 2, host: "127.0.0.1:27019", arbiterOnly: true }
]
})
四、状态检查与常见故障排查
初始化完成后,使用rs.status()查看每个成员的stateStr。正常情况应看到一个PRIMARY和两个SECONDARY或ARBITER。如果某个节点长时间停留在STARTUP2状态,通常是因为数据同步缓慢或节点间网络不通。此时可检查防火墙、bindIp设置以及oplog大小是否合理。
另一个常见问题是节点显示_NOT_REACHABLE_,这往往由hostname解析失败引起。可以在所有节点的/etc/hosts中显式绑定IP与名称,或者在配置时使用纯IP地址。对于开启了keyFile却权限不对的节点,日志里会报认证错误,用chmod 600 keyfile修正后重启即可恢复。
// 查看副本集状态
rs.status()
// 查看配置
rs.conf()
// 动态添加新节点示例
rs.add("127.0.0.1:27020")
五、验证高可用与读写分离
搭建完毕后,可以手动停掉主节点进程,观察从节点是否能在数秒内选举出新主。读写方面,默认从节点不可读,需要在从节点执行rs.secondaryOk()才能分担读压力。写操作始终走主节点,这是副本集保证一致性的基础。
应用层连接时应使用副本集连接串,例如mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/?replicaSet=rs0,驱动会自动发现主节点并在故障转移后重连。这样整套MongoDB副本集就具备了基本的生产可用能力。
MongoDB副本集replica_set修改时间:2026-08-11 02:33:33