运维,数据库··约 6 分钟读完

MongoDB 副本集从零搭建到生产可用

本文详细介绍了如何在生产环境中搭建MongoDB副本集,实现高可用性数据库架构。文章包含七个部分:首先说明了副本集解决的核心问题(自动故障转移、数据冗余和读写分离);然后详细描述了环境准备(物理机主库+Docker从库的配置)、部署步骤(包括keyfile生成和副本集初始化)、用户认证设置;接着通过测试验证了高可用功能;最后给出了应用连接方式和注意事项总结。整个流程涵盖了从零搭建到生产可用的完整操作指南,特别强调版本统一、安全认证和自动故障转移等关键点。
数据库mongodb

MongoDB 副本集从零搭建到生产可用

两台服务器:一台物理机跑主库,一台 Docker 跑从库,实现数据库高可用


一、为什么需要副本集?

graph LR A[客户端] --> B[主库 PRIMARY] B -->|自动同步| C[从库 SECONDARY] B --x|主库挂了| D[自动选举 - 从库变主库]

副本集解决的核心问题

  • 主库宕机 → 从库自动顶上(无需人工干预)
  • 数据冗余 → 主库磁盘坏了,从库还有数据
  • 读写分离 → 主库写,从库读,分担压力

二、环境准备

角色部署方式IP端口MongoDB 版本
Primary物理机192.168.1.100270173.6
SecondaryDocker192.168.1.10127017(映射8017)3.6

主库配置(物理机)

mongod.conf

net: port: 27017 bindIp: 0.0.0.0 replication: replSetName: rs0 security: keyFile: /data/mongodb.key storage: dbPath: /data/mongo/db

生成 Keyfile(节点间认证用)

# 在主库生成 openssl rand -base64 756 > /data/mongodb.key chmod 400 /data/mongodb.key chown 999:999 /data/mongodb.key # 复制到从库 scp /data/mongodb.key root@192.168.1.101:/data/mongodb.key

三、部署步骤

主库初始化

# 启动 MongoDB mongod -f /etc/mongod.conf # 初始化副本集 mongo 127.0.0.1:27017/admin --eval ' rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "192.168.1.100:27017" }] }) '

从库部署(Docker)

# 启动容器 docker run -d --name mongo_node1 --restart always \ -p 8017:27017 \ -v /data/mongo/sec:/data/db \ -v /data/mongodb.key:/data/mongodb.key:ro \ mongo:3.6.23 \ mongod --replSet rs0 --bind_ip_all --keyFile /data/mongodb.key # 加入副本集(在主库执行) mongo 127.0.0.1:27017/admin --eval 'rs.add("192.168.1.101:8017")'

验证

rs.status() // 应看到: // PRIMARY health: 1 stateStr: "PRIMARY" // SECONDARY health: 1 stateStr: "SECONDARY"

四、创建用户与开启认证

# 创建管理员 mongo 127.0.0.1:27017/admin --eval ' db.createUser({ user: "admin", pwd: "123456", roles: [{ role: "root", db: "admin" }] }) '

之后连接必须带用户名密码:

mongo 192.168.1.100:27017/admin -u admin -p 123456

五、测试高可用

# 在主库写入测试数据 mongo 192.168.1.100:27017/test -u admin -p 123456 \ --eval 'db.test.insert({msg: "副本集测试"})' # 模拟主库故障 systemctl stop mongod # 等待几秒,查看从库状态 docker exec mongo_node1 mongo --eval 'rs.status()' # 从库自动变成 PRIMARY # 恢复主库后,它会作为从库重新加入 systemctl start mongod

六、应用连接

// Node.js const uri = 'mongodb://admin:密码@192.168.1.100:27017,192.168.1.101:8017/mydb?replicaSet=rs0'; // Java MongoClientURI uri = new MongoClientURI( "mongodb://admin:密码@192.168.1.100:27017,192.168.1.101:8017/mydb?replicaSet=rs0" );

七、总结

✅ 主从自动同步 ✅ 主库挂了自动切换 ✅ 节点间加密通信 ✅ 客户端认证保护 ❌ 注意版本统一(主从必须兼容)