在 CentOS 上实现 MongoDB 高可用
一、总体架构与准备
- 生产环境首选 副本集(Replica Set) 实现自动故障转移与数据冗余,官方已不推荐旧版 Master-Slave;常见架构为 PSS(1 主 2 从) 或 PSA(1 主 1 从 1 仲裁)。若需横向扩展与更大容量,再在副本集之上构建 分片集群(Sharding)。为降低复杂度,建议先完成副本集,再按需扩展分片。基础准备包括:至少 3 台 CentOS 7/8 主机、时间同步(如 NTP)、关闭或放行防火墙(如 firewalld)、规划好 内网通信网段 与目录权限。
二、基于副本集的高可用部署步骤(CentOS 7/8)
- 安装 MongoDB(以 4.4/5.0/7.0 为例,三台均执行)
- 创建 YUM 源(示例为 5.0,其他版本替换版本号即可),安装组件:
- cat >/etc/yum.repos.d/mongodb-org-5.0.repo <<EOF
[mongodb-org-5.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/ppg/server-5.0.asc
EOF
- yum install -y mongodb-org
- 统一目录与权限
- mkdir -p /var/lib/mongo /var/log/mongodb
- chown -R mongod:mongod /var/lib/mongo /var/log/mongodb
- 生成并分发 KeyFile(副本集内部认证)
- openssl rand -base64 756 > /opt/mongodb/mongodb.key
- chmod 400 /opt/mongodb/mongodb.key
- chown mongod:mongod /opt/mongodb/mongodb.key
- 配置 /etc/mongod.conf(三台保持一致的 replicaSet 名称,示例为 rs0)
- systemLog:
- destination: file
- path: /var/log/mongodb/mongod.log
- logAppend: true
- storage:
- dbPath: /var/lib/mongo
- journal:
- processManagement:
- fork: true
- pidFilePath: /var/run/mongodb/mongod.pid
- net:
- port: 27017
- bindIp: 0.0.0.0
- replication:
- security:
- keyFile: /opt/mongodb/mongodb.key
- 启动与开机自启
- systemctl start mongod && systemctl enable mongod
- 初始化副本集(连接到任一节点执行)
- mongo --host <任一节点IP>:27017
- rs.initiate({
_id: “rs0”,
members: [
{ _id: 0, host: “<节点1IP>:27017” },
{ _id: 1, host: “<节点2IP>:27017” },
{ _id: 2, host: “<节点3IP>:27017” }
]
})
- 验证:rs.status() 查看成员角色与同步状态
- 防火墙放行(示例)
- firewall-cmd --zone=public --add-port=27017/tcp --permanent && firewall-cmd --reload
- 连接串示例(驱动/应用使用)
- mongodb://:27017,:27017,:27017/?replicaSet=rs0&readPreference=secondaryPreferred
三、故障转移与读写分离验证
- 故障转移:在 Primary 节点执行 systemctl stop mongod,约数十秒后查看 rs.status(),应出现新的 Primary;原主恢复后通常会以 Secondary 身份重新加入。
- 读写分离:默认所有写操作在 Primary;读请求可在连接串中设置 readPreference=secondaryPreferred 将读流量分担到从节点,提高读吞吐。
四、扩展为分片集群(数据量与并发更高时)
- 组件与端口规划
- Config Server 副本集:3 台,端口 27019,clusterRole: configsvr
- Shard 副本集:每个分片 3 台,端口 27018,clusterRole: shardsvr
- mongos 路由:2+ 台,端口 27017,configDB 指向 Config 副本集
- 启动与初始化
- 启动各组件(mongod 配置对应 clusterRole 与 replSet,mongos 指定 configDB)
- 在 mongos 上添加分片:sh.addShard(“shard1/:27018,:27018,:27018”)
- 启用数据库分片:sh.enableSharding(“mydb”)
- 对集合分片:sh.shardCollection(“mydb.mycol”, { “shardKey”: 1 })
- 验证:sh.status() 查看分片与分布状态。
五、生产注意事项与常见坑
- 仲裁节点(PSA)不存数据,仅参与投票;为可靠性,尽量让 投票成员数为奇数,且仲裁不要与数据节点同机部署。
- 安全:启用 KeyFile 或 x.509 内部认证;对外网仅暴露 mongos 或必要的副本集成员,并限制来源 IP。
- 网络与时钟:保证 低时延内网 与 时间同步(NTP),避免选举异常与 oplog 追不上。
- 容量与性能:合理设置 oplog 大小(默认较大,可按业务保留窗口调整),并为 WiredTiger 配置足够内存与存储。
- 连接与重试:应用使用 副本集连接串 并开启 自动重连 与 读写偏好;避免直连单点。
- 监控与备份:部署 监控告警(如 mongostat/mongotop、指标采集与可视化),并定期做 物理/逻辑备份(如 mongodump、快照)。