Ubuntu 22.04 上搭建 MongoDB 副本集必须通过 --replSet 参数或 /etc/mongod.conf 中 replication.replSetName 显式声明,禁用已弃用的 /etc/mongodb.conf;安装需添加官方仓库并使用 mongodb-org,版本 ≥6.0;单节点副本集需 rs.initiate() 指定唯一 rs0 名称,多节点须确保网络互通、bind_ip 包含实际IP、各节点 replSetName 完全一致,且初始化前所有 mongod 已按该配置启动。

Ubuntu 22.04 上搭建 MongoDB 副本集,**必须用 replica set 模式启动 mongod,不能靠修改 /etc/mongodb.conf 旧配置文件实现**——因为 MongoDB 4.4+ 已弃用该文件,改用 /etc/mongod.conf,且 replica set 必须在启动时通过 --replSet 参数或配置项声明,否则 rs.initiate() 会失败并报错 not master and slave 或 no replset config object retrieved。
确认 MongoDB 版本与配置文件路径
Ubuntu 22.04 默认源里没有 MongoDB,必须手动添加官方仓库。安装后实际生效的配置文件是 /etc/mongod.conf,不是旧版的 /etc/mongodb.conf(后者可能根本不存在或被忽略)。
- 运行
mongod --version确认版本 ≥ 6.0(推荐 7.0,对事务支持更稳定) - 检查配置文件是否存在:
sudo ls -l /etc/mongod.conf - 若用
apt install mongodb-org安装,/etc/mongod.conf默认已存在;若用 snap 或二进制包安装,需手动创建
配置单节点副本集(满足事务最低要求)
开发或测试环境常只需一个节点启用副本集——这是 MongoDB 启用事务的硬性前提。关键点:不能只改配置,还要确保端口、数据目录、replSet 名称三者一致且可写。
- 编辑
/etc/mongod.conf,在replication:下添加:replication: replSetName: "rs0"
- 确保
storage.dbPath目录存在且mongodb用户有读写权限:sudo mkdir -p /var/lib/mongodb && sudo chown -R mongodb:mongodb /var/lib/mongodb - 重启服务:
sudo systemctl restart mongod - 连接并初始化:
mongosh --eval "rs.initiate({ _id: 'rs0', members: [{ _id: 0, host: 'localhost:27017' }] })"
多节点副本集常见连通性错误
跨机器部署时,rs.add("node2:27017") 失败几乎全是网络或主机名问题,不是配置语法问题。
-
No route to host:目标节点防火墙未开放 27017 端口(sudo ufw allow 27017) -
connect ECONNREFUSED:目标 mongod 未运行,或启动时没加--replSet rs0,或 bind_ip 不含该网卡 IP -
getaddrinfo ENOTFOUND node2:DNS 解析失败,改用 IP 地址(如"192.168.1.12:27017"),或在各节点/etc/hosts中静态映射 - 所有节点的
replSetName必须完全一致(区分大小写),且初始化前每个 mongod 都已用该名称启动
验证副本集状态与避免后台阻塞操作
运行 rs.status() 后看到 "stateStr" : "PRIMARY" 才算成功;但真正容易被忽略的是后续操作风险——比如建索引不加 background: true 会导致整个副本集卡死。
-
rs.status()返回中检查members[n].stateStr和members[n].health(应为 1) - 任何大集合建索引必须加
{ background: true },否则主节点阻塞,从节点无法追同步,rs.printSecondaryReplicationInfo()会显示 lag 持续增长 - 不要在副本集初始化完成前执行写操作,否则可能触发
InterruptedAtShutdown错误
最常被跳过的一步是:所有节点 mongod 启动前,必须确保 replSetName 已写入配置且服务已 reload;哪怕只差一次 systemctl daemon-reload,rs.initiate() 就会静默失败,日志里只有一行 replSet can't find self in replset config。


















