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文件。
- 在每台服务器上创建目录并生成密钥:
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
- 将同一个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副本集搭建过程中遇到异常,优先查看日志和网络连通性,多数问题可快速定位。