- 首页 >
- 问答 >
-
云计算 >
- 如何在Linux上实现MongoDB高可用性
如何在Linux上实现MongoDB高可用性
小樊
38
2025-12-26 07:51:56
在 Linux 上实现 MongoDB 高可用
一、总体架构选择
- 副本集 Replica Set:至少 3 个节点(建议为 3 数据节点;也可 2 数据 + 1 仲裁 Arbiter),提供自动故障转移与数据冗余,是 MongoDB 高可用的基础形态。
- 分片集群 Sharded Cluster:面向海量数据与高并发,由多个 分片(每个分片是副本集)、至少 3 个配置服务器副本集 与 mongos 路由 组成,实现水平扩展与高可用。
- 生产建议:优先使用副本集;当数据规模或并发达到瓶颈时再引入分片。以上两种形态均为官方推荐的高可用方案。
二、基于副本集的高可用部署步骤
- 准备与安装
- 在所有节点安装 MongoDB(如 CentOS 7+ 使用官方 YUM 源),创建数据与日志目录并校正权限:
sudo mkdir -p /var/lib/mongodb /var/log/mongodb
sudo chown -R mongodb:mongodb /var/lib/mongodb /var/log/mongodb
- 启动服务并设为开机自启:
sudo systemctl start mongod && sudo systemctl enable mongod
- 配置副本集
- 编辑配置文件 /etc/mongod.conf,启用副本集名称(三节点保持一致):
replication:
replSetName: “rs0”
- 重启使配置生效:sudo systemctl restart mongod
- 初始化副本集
- 连接任一节点:mongo --host <node1_ip> --port 27017
- 执行初始化(示例为三数据节点;如需仲裁,可将其中一个成员的 arbiterOnly: true):
rs.initiate({
_id: “rs0”,
members: [
{ _id: 0, host: “<node1_ip>:27017” },
{ _id: 1, host: “<node2_ip>:27017” },
{ _id: 2, host: “<node3_ip>:27017” }
]
})
- 验证与日常运维
- 查看状态:rs.status();查看配置:rs.conf()
- 读写分离:默认从节点不可读,可在会话中执行 rs.slaveOk() 或驱动开启读偏好;写操作仅在 PRIMARY 进行。
三、分片集群的高可用部署步骤
- 部署配置服务器副本集(CSRS)
- 启动 3 个配置服务器(示例端口 27019):
mongod --configsvr --replSet configReplSet --dbpath /data/configdb --port 27019
- 连接任一配置服务器并初始化:
mongo --host <cfg_ip> --port 27019
rs.initiate({
_id: “configReplSet”,
configsvr: true,
members: [
{ _id: 0, host: “:27019” },
{ _id: 1, host: “:27019” },
{ _id: 2, host: “:27019” }
]
})
- 部署分片(每个分片为副本集)
- 启动各分片的 mongod(示例端口 27018/27019/27020),并在各自副本集内执行 rs.initiate(…) 完成初始化(方法与“副本集部署”一致)。
- 部署 mongos 路由
- 启动 mongos(示例端口 27017):
mongos --configdb configReplSet/:27019,:27019,:27019 --port 27017
- 接入分片并启用分片
- 连接 mongos:mongo --host <mongos_ip> --port 27017
- 添加分片(以副本集方式添加):
sh.addShard(“shard1/<s1_host>:,<s2_host>:,<s3_host>:”)
sh.addShard(“shard2/<s1_host>:,<s2_host>:,<s3_host>:”)
- 对数据库与集合启用分片(示例对 myDB.myColl 按 shardKey 分片):
sh.enableSharding(“myDB”)
sh.shardCollection(“myDB.myColl”, { “shardKey”: 1 })
四、网络、安全与稳定性配置
- 网络与防火墙
- 开放必要端口(如 27017/27018/27019),并确保节点间互通;在 CentOS 可使用:
sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent && sudo firewall-cmd --reload
- 安全加固
- 启用身份验证:在 /etc/mongod.conf 中设置
security:
authorization: enabled
- 启用 TLS/SSL 加密传输,限制 bindIp 仅内网网段,创建最小权限的数据库用户与角色。
- 稳定性与性能
- 使用 WiredTiger 存储引擎,开启 journal;为高频查询建立合适索引;按需调整 WiredTiger 缓存;分析慢查询(如设置 db.setProfilingLevel(1, { slowms: 20 }))。
五、监控、备份与常见误区
- 监控与告警
- 使用 MongoDB Ops Manager 或 Prometheus + Grafana 搭建可视化监控与阈值告警;结合 mongostat/mongotop 与日志分析日常性能与健康状态。
- 备份与恢复
- 常规备份:mongodump/mongorestore(适合小中型数据或迁移)。
- 生产热备:建议使用 Percona XtraBackup(支持在线物理备份,缩短恢复时间)。定期演练恢复流程并验证一致性。
- 常见误区
- 将 mongos 置于单点:应部署多个 mongos 并接入负载均衡。
- 以单节点副本集承载关键业务:至少 3 数据节点 或 2 数据 + 1 仲裁。
- 用 Keepalived/VIP 替代副本集选举:VIP 无法替代 MongoDB 的 自动故障转移 与数据一致性机制,仅可作为外部接入层的补充手段。