在 CentOS 上搭建 MongoDB 集群的实操指南
一、方案选型与准备
- 常见两种形态:
- 副本集 Replica Set:提供高可用与自动故障转移,适合中小规模或需要高可用的单机替代场景。
- 分片集群 Sharded Cluster:由 mongos 路由、配置服务器副本集(CSRS) 和多个 分片副本集 组成,适合大数据量/高吞吐场景。
- 规划与要求:
- 使用 奇数个节点(如 3/5/7),便于选举与容错;生产环境建议 CSRS 至少 3 成员,每个分片也建议 3 成员副本集。
- 组件与端口建议:Config Server 27019、Shard 27018、mongos 27017。
- 强烈建议使用 DNS 主机名 而非 IP 进行配置;自 MongoDB 5.0 起仅配置 IP 的节点可能无法通过启动验证;从 MongoDB 8.0 起可使用 directShardOperations 角色执行直连分片维护操作(谨慎使用)。
- 网络与安全:集群各节点需互通,并配置防火墙放行相关端口;生产应启用身份验证与内部成员认证(如 x.509)。
二、安装 MongoDB(CentOS 7/8 通用)
- 以 MongoDB 6.0 为例(可按需替换为 7.0 等版本):
- 创建 YUM 源并安装:
- 创建文件 /etc/yum.repos.d/mongodb-org-6.0.repo,内容:
- [mongodb-org-6.0]
- name=MongoDB Repository
- baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
- gpgcheck=1
- enabled=1
- gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
- 安装与启动:
- sudo yum install -y mongodb-org
- sudo systemctl start mongod
- sudo systemctl enable mongod
- 目录与权限(默认 dbPath 为 /var/lib/mongo,日志 /var/log/mongodb/mongod.log):
- sudo chown -R mongod:mongod /var/lib/mongo /var/log/mongodb
- 防火墙放行(示例):
- sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent
- sudo firewall-cmd --zone=public --add-port=27018/tcp --permanent
- sudo firewall-cmd --zone=public --add-port=27019/tcp --permanent
- sudo firewall-cmd --reload
- 提示:若使用 SELinux,建议设置为 permissive 或按官方指南配置策略;生产环境不建议直接关闭。
三、部署副本集(高可用入门)
- 步骤概览:
- 在所有节点编辑 /etc/mongod.conf,加入副本集名称(如 rs0):
- 重启服务:sudo systemctl restart mongod
- 连接任一节点初始化副本集(使用主机名或 IP):
- mongo --host <node1_ip> --port 27017
- 在 mongo shell 中执行:
- 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() 应显示 PRIMARY/SECONDARY 状态。
- 说明:副本集提供 自动故障转移 与 数据冗余,写入仅在主节点,读可扩展到从节点。
四、部署分片集群(可横向扩展)
- 架构与端口:
- CSRS(3 节点):端口 27019
- 分片副本集(每分片 3 节点):端口 27018
- mongos(1 或多实例):端口 27017
- 配置步骤(示例命令与配置片段):
- 配置服务器副本集(CSRS):
- 配置 /etc/mongod.conf(每台 CSRS 节点):
- storage.dbPath: /var/lib/mongo/configdb
- systemLog: { destination: file, path: /var/log/mongodb/configdb.log, logAppend: true }
- net.bindIp: 0.0.0.0(或指定主机名/IP)
- replication.replSetName: “csrs”
- sharding.clusterRole: configsvr
- 启动:sudo systemctl start mongod
- 初始化(连接任一 CSRS 节点):
- mongo --host <cfg1_host>:27019
- rs.initiate({
_id: “csrs”,
configsvr: true,
members: [
{ _id: 0, host: “<cfg1_host>:27019” },
{ _id: 1, host: “<cfg2_host>:27019” },
{ _id: 2, host: “<cfg3_host>:27019” }
]
})
- 配置分片副本集(示例为两个分片 shard1、shard2,每分片 3 节点):
- 配置 /etc/mongod.conf(每台分片节点):
- storage.dbPath: /var/lib/mongo/shard1(或 shard2)
- systemLog: { destination: file, path: /var/log/mongodb/shard1.log, logAppend: true }
- net.bindIp: 0.0.0.0
- replication.replSetName: “shard1”(或 “shard2”)
- sharding.clusterRole: shardsvr
- 启动各分片节点后,分别连接并初始化副本集(rs.initiate),方法与 CSRS 类似。
- 启动 mongos(建议以 systemd 管理,示例命令):
- 配置 /etc/mongos.conf:
- sharding.configDB: “csrs/<cfg1_host>:27019,<cfg2_host>:27019,<cfg3_host>:27019”
- net.bindIp: 0.0.0.0
- net.port: 27017
- 启动:mongos --config /etc/mongos.conf
- 添加分片(连接 mongos):
- mongo --host <mongos_host>:27017
- sh.addShard(“shard1/<s1_host1>:27018,<s1_host2>:27018,<s1_host3>:27018”)
- sh.addShard(“shard2/<s2_host1>:27018,<s2_host2>:27018,<s2_host3>:27018”)
- 对数据库与集合启用分片(示例):
- sh.enableSharding(“mydb”)
- sh.shardCollection(“mydb.mycoll”, { “shardKey”: 1 })(请结合业务选择分片键)
- 验证:sh.status() 查看集群与分片状态。
五、验证与运维要点
- 健康检查与常用命令:
- 副本集:rs.status()、rs.conf()、rs.add()/rs.remove()
- 分片集群:sh.status()、sh.addShard()、sh.enableSharding()、sh.shardCollection()
- 安全与网络:
- 生产环境务必启用 身份验证 与 内部成员认证(如 x.509),并限制来源网段访问;使用 DNS 主机名 统一标识节点,避免 IP 变更带来维护成本。
- 建议开启 NTP 时间同步,避免选举与复制异常。
- 监控与工具:
- 使用 mongostat、mongotop 与日志排查性能与阻塞;可用 MongoDB Compass 进行可视化监控与分片管理。