MongoDB 副本集配置教程

MongoDB 副本集(Replica Set)是 MongoDB 原生的高可用方案,通过在多个节点之间同步数据实现故障自动切换和数据冗余。副本集由一个主节点(Primary)和多个从节点(Secondary)组成,主节点处理所有写操作,从节点实时同步数据并可以分担读请求。本文将在搬瓦工 VPS 上搭建一个三节点的 MongoDB 副本集。

一、环境准备

  • 节点 1:192.168.1.10(初始主节点)
  • 节点 2:192.168.1.20
  • 节点 3:192.168.1.30
  • 系统:Ubuntu 22.04,MongoDB 7.0

在三台服务器上安装 MongoDB 7.0:

# 导入 GPG 密钥
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg

# 添加仓库
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-7.0.list

# 安装
apt update
apt install mongodb-org -y
systemctl start mongod
systemctl enable mongod

二、生成认证密钥文件

副本集节点之间通过密钥文件进行内部认证。在任意一台服务器上生成密钥,然后复制到所有节点:

# 生成密钥
openssl rand -base64 756 > /etc/mongodb-keyfile
chmod 400 /etc/mongodb-keyfile
chown mongodb:mongodb /etc/mongodb-keyfile

# 复制到其他节点
scp /etc/mongodb-keyfile root@192.168.1.20:/etc/mongodb-keyfile
scp /etc/mongodb-keyfile root@192.168.1.30:/etc/mongodb-keyfile

# 在其他节点上设置权限
ssh root@192.168.1.20 "chmod 400 /etc/mongodb-keyfile && chown mongodb:mongodb /etc/mongodb-keyfile"
ssh root@192.168.1.30 "chmod 400 /etc/mongodb-keyfile && chown mongodb:mongodb /etc/mongodb-keyfile"

三、配置 MongoDB 实例

编辑三台服务器上的 /etc/mongod.conf,核心配置如下:

# 网络配置
net:
  port: 27017
  bindIp: 0.0.0.0

# 副本集配置
replication:
  replSetName: "rs0"

# 安全配置
security:
  authorization: enabled
  keyFile: /etc/mongodb-keyfile

# 存储配置
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 0.5

在搬瓦工 VPS 上建议将 WiredTiger 缓存设为物理内存的 50% 左右,避免内存不足。

# 三台服务器都重启 MongoDB
systemctl restart mongod

四、初始化副本集

连接到节点 1,执行副本集初始化:

mongosh --host 192.168.1.10
rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "192.168.1.10:27017", priority: 2 },
    { _id: 1, host: "192.168.1.20:27017", priority: 1 },
    { _id: 2, host: "192.168.1.30:27017", priority: 1 }
  ]
})

priority 值越高越优先成为主节点。设为 0 表示该节点永远不会成为主节点。

4.1 创建管理员账号

use admin
db.createUser({
  user: "admin",
  pwd: "AdminPass123!",
  roles: [
    { role: "root", db: "admin" }
  ]
})

// 创建应用程序账号
use myapp
db.createUser({
  user: "appuser",
  pwd: "AppPass123!",
  roles: [
    { role: "readWrite", db: "myapp" }
  ]
})

4.2 检查副本集状态

rs.status()

关注每个成员的 stateStr 字段:PRIMARY 表示主节点,SECONDARY 表示从节点,所有节点都应处于健康状态。

// 简洁的状态查看
rs.status().members.forEach(function(m) {
    print(m.name + " : " + m.stateStr + " (health: " + m.health + ")");
})

五、读写分离配置

默认情况下从节点不接受读请求,需要设置读偏好(Read Preference):

// 在 mongosh 中设置从节点可读
db.getMongo().setReadPref("secondaryPreferred")

// 读偏好选项:
// primary            - 只从主节点读(默认)
// primaryPreferred   - 优先主节点,不可用时读从节点
// secondary          - 只从从节点读
// secondaryPreferred - 优先从节点,不可用时读主节点
// nearest            - 从延迟最低的节点读

在应用程序连接字符串中设置读偏好:

mongodb://appuser:AppPass123!@192.168.1.10:27017,192.168.1.20:27017,192.168.1.30:27017/myapp?replicaSet=rs0&readPreference=secondaryPreferred

六、故障切换测试

// 查看当前主节点
rs.isMaster().primary

// 手动触发主节点降级
rs.stepDown(60)

// 强制指定节点成为主节点(调整优先级)
cfg = rs.conf()
cfg.members[1].priority = 3
rs.reconfig(cfg)

也可以通过停止主节点的 MongoDB 服务来测试自动故障切换:

# 在主节点上停止服务
systemctl stop mongod

# 等待 10-30 秒,在其他节点查看新主节点
mongosh --host 192.168.1.20 -u admin -p AdminPass123! --authenticationDatabase admin --eval "rs.status().members.forEach(function(m){print(m.name+' : '+m.stateStr)})"

七、副本集成员管理

// 添加新成员
rs.add("192.168.1.40:27017")

// 添加仲裁节点(不存数据,仅参与投票)
rs.addArb("192.168.1.50:27017")

// 移除成员
rs.remove("192.168.1.40:27017")

// 查看副本集配置
rs.conf()

// 修改成员配置
cfg = rs.conf()
cfg.members[2].hidden = true     // 隐藏节点
cfg.members[2].priority = 0      // 不参与选举
cfg.members[2].votes = 0         // 不参与投票
rs.reconfig(cfg)

八、监控与运维

8.1 监控复制延迟

// 查看复制状态
rs.printReplicationInfo()    // 主节点 oplog 信息
rs.printSecondaryReplicationInfo()  // 从节点同步状态

// 查看 oplog 大小
use local
db.oplog.rs.stats().maxSize / 1024 / 1024  // MB

8.2 备份策略

# 使用 mongodump 从从节点备份(不影响主节点)
mongodump --host 192.168.1.20 --port 27017 -u admin -p AdminPass123! --authenticationDatabase admin --oplog --out /data/backups/$(date +%Y%m%d)

# 恢复备份
mongorestore --host 192.168.1.10 --port 27017 -u admin -p AdminPass123! --authenticationDatabase admin --oplogReplay /data/backups/20260328

8.3 防火墙配置

# 允许副本集成员之间通信
ufw allow from 192.168.1.0/24 to any port 27017

九、常见问题

  • 选举失败:确保多数节点可用(3 节点至少需要 2 个)。检查网络连通性和密钥文件一致性。
  • 从节点数据落后:检查 oplog 大小是否足够,网络带宽是否充足。
  • 内存不足:调整 WiredTiger cacheSizeGB,搬瓦工 1GB 内存方案建议设为 0.25GB。
  • 写入关注(Write Concern):生产环境建议使用 w: "majority" 确保数据写入多数节点后才确认。

总结

MongoDB 副本集是生产环境的标准部署方式,提供了自动故障切换和数据冗余保护。通过合理配置读偏好和写入关注,可以在可用性和一致性之间找到最佳平衡。如果数据量进一步增长,可以参考 MongoDB 分片集群 实现水平扩展。选购搬瓦工 VPS 请查看 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣,通过 bwh81.net 进入官网。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。