温馨提示×

如何在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.myCollshardKey 分片):
      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 ManagerPrometheus + Grafana 搭建可视化监控与阈值告警;结合 mongostat/mongotop 与日志分析日常性能与健康状态。
  • 备份与恢复
    • 常规备份:mongodump/mongorestore(适合小中型数据或迁移)。
    • 生产热备:建议使用 Percona XtraBackup(支持在线物理备份,缩短恢复时间)。定期演练恢复流程并验证一致性。
  • 常见误区
    • mongos 置于单点:应部署多个 mongos 并接入负载均衡。
    • 以单节点副本集承载关键业务:至少 3 数据节点2 数据 + 1 仲裁
    • Keepalived/VIP 替代副本集选举:VIP 无法替代 MongoDB 的 自动故障转移 与数据一致性机制,仅可作为外部接入层的补充手段。

0