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

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


一、为什么需要副本集?

自动同步

主库挂了

客户端

主库 PRIMARY

从库 SECONDARY

自动选举 - 从库变主库

副本集解决的核心问题

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

二、环境准备

角色 部署方式 IP 端口 MongoDB 版本
Primary 物理机 192.168.1.100 27017 3.6
Secondary Docker 192.168.1.101 27017(映射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"
);

七、总结

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

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐