温馨提示×

mongodb如何实现高可用centos

小樊
34
2025-12-11 12:52:30
栏目: 云计算

在 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:
        • enabled: true
    • processManagement:
      • fork: true
      • pidFilePath: /var/run/mongodb/mongod.pid
    • net:
      • port: 27017
      • bindIp: 0.0.0.0
    • replication:
      • replSetName: rs0
    • 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)不存数据,仅参与投票;为可靠性,尽量让 投票成员数为奇数,且仲裁不要与数据节点同机部署。
  • 安全:启用 KeyFilex.509 内部认证;对外网仅暴露 mongos 或必要的副本集成员,并限制来源 IP。
  • 网络与时钟:保证 低时延内网时间同步(NTP),避免选举异常与 oplog 追不上。
  • 容量与性能:合理设置 oplog 大小(默认较大,可按业务保留窗口调整),并为 WiredTiger 配置足够内存与存储。
  • 连接与重试:应用使用 副本集连接串 并开启 自动重连读写偏好;避免直连单点。
  • 监控与备份:部署 监控告警(如 mongostat/mongotop、指标采集与可视化),并定期做 物理/逻辑备份(如 mongodump、快照)。

0