MongoDB副本集搭建:从零配置三节点高可用集群

MongoDB副本集搭建的核心目标,是让多个MongoDB实例自动同步数据,当主节点故障时能自动切换到备用节点,从而保证数据库持续可用。
本文以三节点副本集为例,在Linux环境下从零开始操作,假设你已具备基本的Linux命令和MongoDB安装经验。

适用环境与前置检查

在开始搭建前,请确认以下条件:

  • 三台Linux服务器(或虚拟机),建议Ubuntu 20.04/CentOS 7及以上,本文命令以Ubuntu为例。
  • 每台服务器已安装MongoDB,版本建议4.4以上。可用 mongod --version 验证。
  • 服务器之间网络互通,建议关闭防火墙或放行27017端口。
  • 准备好主机名和IP对应关系,例如:
  • 节点1:192.168.1.101 mongo1
  • 节点2:192.168.1.102 mongo2
  • 节点3:192.168.1.103 mongo3

注意:副本集要求奇数个投票节点,三节点是最小生产推荐配置。

配置keyfile安全认证

副本集内部通信需要认证,先生成keyfile文件。

  1. 在每台服务器上创建目录并生成密钥:
sudo mkdir -p /var/lib/mongo-keyfile
openssl rand -base64 756 | sudo tee /var/lib/mongo-keyfile/mongo.key
sudo chmod 400 /var/lib/mongo-keyfile/mongo.key
sudo chown mongodb:mongodb /var/lib/mongo-keyfile/mongo.key
  1. 将同一个keyfile复制到所有节点,确保内容完全一致。

修改MongoDB配置文件

编辑每台服务器的 /etc/mongod.conf,重点修改以下部分:

storage:
  dbPath: /var/lib/mongodb

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true

net:
  port: 27017
  bindIp: 0.0.0.0

security:
  keyFile: /var/lib/mongo-keyfile/mongo.key

replication:
  replSetName: rs0

关键点:replSetName 三台必须相同,本文用 rs0。

保存后重启MongoDB服务:

sudo systemctl restart mongod
sudo systemctl status mongod

初始化副本集

登录任意一个节点(如节点1)的mongo shell:

mongosh --port 27017

执行初始化命令,注意使用各节点实际IP:

rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "192.168.1.101:27017" },
    { _id: 1, host: "192.168.1.102:27017" },
    { _id: 2, host: "192.168.1.103:27017" }
  ]
})

看到 { ok: 1 } 表示初始化成功。
稍等几秒,执行 rs.status() 查看状态,当 stateStr 显示 PRIMARY、SECONDARY 时说明集群正常。

验证与常见避坑

验证方法:

  • 在主节点执行 rs.status(),确认所有成员健康。
  • 连接主节点写入数据:use testdb; db.test.insertOne({name:"demo"})。
  • 切换到从节点,执行 rs.slaveOk()(旧版)或 db.getMongo().setReadPref('secondary'),然后查询数据是否同步。

常见报错与处理:

  • replSetInitiate quorum check failed:通常是节点间网络不通或主机名解析失败,检查防火墙和hosts文件。
  • Unauthorized:keyfile权限不对或内容不一致,确保所有节点keyfile相同且权限为400。
  • 节点一直处于 STARTUP2:查看日志 /var/log/mongodb/mongod.log,常见原因是时间不同步或版本差异。

避坑提醒:

  • 不要在生产环境使用 bindIp: 127.0.0.1,否则其他节点无法连接。
  • 副本集搭建后,不要随意修改 _id,否则需要重新初始化。
  • 如果使用云服务器,安全组需放行27017端口。

日常维护与扩展建议

副本集搭建完成后,建议定期检查 rs.status() 和日志。
如需增加节点,使用 rs.add("新节点IP:27017");
移除节点用 rs.remove()。
注意,新增节点会自动同步数据,但数据量大时耗时较长。

最后提醒:本文步骤在测试环境验证通过,生产环境请根据实际网络和版本调整。
如果你在MongoDB副本集搭建过程中遇到异常,优先查看日志和网络连通性,多数问题可快速定位。

分享到:
上一篇
Redis哨兵模式配置:主从切换与故障验证实操
下一篇
PostgreSQL性能优化:从慢查询定位到配置调优的完整实操
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意