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 进入官网。