温馨提示×

Debian如何配置MongoDB分片

小樊
50
2026-07-18 09:58:48
栏目: 云计算

在 Debian 上配置 MongoDB 分片(Sharded Cluster),通常包括 Config Server、Shard(副本集)和 Mongos 路由 三部分。下面以 MongoDB 6.x / 7.x(官方 APT 仓库) 为例,给你一套可实际操作的完整流程


一、环境规划(示例)

假设 3 台服务器(也可单机多端口测试):

角色 主机 端口
Config Server 192.168.1.10 27019
Shard1(副本集) 192.168.1.11 27018
Shard2(副本集) 192.168.1.12 27018
Mongos 192.168.1.10 27017

✅ 生产环境建议:

  • Config Server 至少 3 台
  • 每个 Shard 至少 3 节点副本集
  • Mongos 可部署多个

二、安装 MongoDB(所有节点)

1️⃣ 导入 MongoDB 官方 GPG 密钥

curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

2️⃣ 添加 APT 源(Debian 12 Bookworm 示例)

echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] \
https://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

3️⃣ 安装 MongoDB

sudo apt update
sudo apt install -y mongodb-org

三、配置 Config Server(配置服务器副本集)

1️⃣ 修改配置文件 /etc/mongod.conf

storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true

net:
  port: 27019
  bindIp: 0.0.0.0

replication:
  replSetName: cfgrs

sharding:
  clusterRole: configsvr

2️⃣ 启动服务

sudo systemctl restart mongod
sudo systemctl enable mongod

3️⃣ 初始化 Config Server 副本集

mongosh --port 27019
rs.initiate({
  _id: "cfgrs",
  configsvr: true,
  members: [
    { _id: 0, host: "192.168.1.10:27019" }
  ]
})

四、配置 Shard(副本集)

1️⃣ 修改 shard 节点配置 /etc/mongod.conf

storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log

net:
  port: 27018
  bindIp: 0.0.0.0

replication:
  replSetName: shard1

sharding:
  clusterRole: shardsvr

2️⃣ 启动并初始化副本集

mongosh --port 27018
rs.initiate({
  _id: "shard1",
  members: [
    { _id: 0, host: "192.168.1.11:27018" }
  ]
})

多个 shard 时重复此步骤(shard2、shard3…)


五、配置 Mongos(路由服务)

1️⃣ 新建 mongos 配置文件 /etc/mongos.conf

systemLog:
  destination: file
  path: /var/log/mongodb/mongos.log
  logAppend: true

net:
  port: 27017
  bindIp: 0.0.0.0

sharding:
  configDB: cfgrs/192.168.1.10:27019

2️⃣ 启动 mongos

mongos -f /etc/mongos.conf

六、将 Shard 加入集群

mongosh --port 27017
sh.addShard("shard1/192.168.1.11:27018")
sh.addShard("shard2/192.168.1.12:27018")

查看分片状态:

sh.status()

七、启用数据库和集合分片

1️⃣ 启用数据库分片

sh.enableSharding("testdb")

2️⃣ 对集合进行分片

sh.shardCollection("testdb.users", { user_id: 1 })

✅ 推荐分片键:

  • 基数大
  • 单调递增(避免热点)
  • 常用于查询条件

八、常见维护命令

sh.status()
db.printShardingStatus()
sh.getBalancerState()
sh.isBalancerRunning()

九、常见问题

❌ 无法加入 shard

  • 防火墙未放行端口
  • 副本集名称不一致
  • bindIp 限制

❌ shard 状态为 RECOVERING

  • 时间不同步(务必 NTP)
  • oplog 太小

十、生产建议

✅ 使用 副本集
✅ 至少 3 个 config server
✅ 合理选择 Shard Key
✅ 监控 balancer 性能
✅ 不要对 _id 盲目分片


如果你需要:

  • 单机多端口模拟分片
  • Docker / Kubernetes 部署
  • MongoDB 5/6/7 版本差异
  • 分片键设计建议

告诉我你的实际环境,我可以直接给你定制方案。

0