温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MongoDB分片怎么配置

发布时间:2026-07-15 19:04:28 来源:亿速云 阅读:83 作者:小樊 栏目:数据库

MongoDB 分片(Sharding) 是把数据分布到多台机器上的方式,用于 水平扩展。下面我按 生产级标准流程,从 概念 → 架构 → 配置步骤 → 示例 → 常见坑 给你讲一遍。


一、MongoDB 分片架构组成

一个完整的分片集群至少包含 3 类角色

角色 作用
Shard(分片) 真正存储数据的 MongoDB 实例(可以是副本集)
Config Server(配置服务器 存储集群元数据(分片信息、chunk 信息)
Mongos(路由) 应用连接的入口,负责路由请求

生产环境强烈建议:

  • Config Server:副本集(CSRS)
  • Shard:副本集(至少 3 节点)
  • Mongos:至少 2 个

二、分片整体结构示例

App
 |
Mongos1  Mongos2
 |        |
Config Server Replica Set
 |        |
Shard1   Shard2   Shard3
(副本集) (副本集) (副本集)

三、分片配置完整步骤(重点)

1️⃣ 准备服务器(示例)

假设 3 台机器:

机器 角色
node1 configsvr + shard1 + mongos
node2 shard2
node3 shard3

端口规划:

角色 端口
mongos 27017
configsvr 27019
shard 27018

2️⃣ 配置 Config Server(副本集)

① 启动配置服务器(每台)

mongod --configsvr --replSet configRS --port 27019 --dbpath /data/configdb

② 初始化 Config Replica Set

rs.initiate({
  _id: "configRS",
  configsvr: true,
  members: [
    { _id: 0, host: "node1:27019" },
    { _id: 1, host: "node2:27019" },
    { _id: 2, host: "node3:27019" }
  ]
})

3️⃣ 配置 Shard(副本集)

① 启动 shard 节点

mongod --shardsvr --replSet shard1 --port 27018 --dbpath /data/shard1

② 初始化 shard 副本集

rs.initiate({
  _id: "shard1",
  members: [
    { _id: 0, host: "node1:27018" },
    { _id: 1, host: "node2:27018" },
    { _id: 2, host: "node3:27018" }
  ]
})

⚠️ 每个 shard 都要单独做(shard2、shard3)


4️⃣ 启动 Mongos(路由)

mongos --configdb configRS/node1:27019,node2:27019,node3:27019 --port 27017

5️⃣ 添加 Shard 到集群

连接 mongos:

mongosh --port 27017

添加分片:

sh.addShard("shard1/node1:27018,node2:27018,node3:27018")
sh.addShard("shard2/node1:27018,node2:27018,node3:27018")
sh.addShard("shard3/node1:27018,node2:27018,node3:27018")

查看分片状态:

sh.status()

6️⃣ 启用数据库分片

sh.enableSharding("mydb")

7️⃣ 对集合进行分片(关键)

✅ 必须:创建索引

db.mycollection.createIndex({ user_id: 1 })

✅ 开启分片

sh.shardCollection("mydb.mycollection", { user_id: 1 })

四、分片策略选择(非常重要)

策略 适用场景
Hash 分片 数据分布均匀,写入多
Range 分片 范围查询多
Zone 分片 多机房、冷热数据

示例(Hash):

sh.shardCollection("mydb.logs", { _id: "hashed" })

五、常见错误 & 坑

直接对普通集合分片
✅ 必须先建索引

_id 做 range 分片
✅ 推荐 hashed

❌ 单节点做 shard
✅ 生产环境必须是副本集

❌ mongos 直连 shard
✅ 应用只连 mongos


六、最小可用分片集群(测试)

如果你只是 本地测试,可以:

  • 1 个 mongos
  • 1 个 configsvr
  • 2 个 shard(单节点)

我可以给你 单机 docker-compose本地脚本版


七、你可以继续问我

你可以直接说:

  • ✅「给我 Docker 分片示例
  • ✅「生产环境 最佳实践
  • ✅「分片后 查询慢怎么优化
  • ✅「已有副本集怎么 升级成分片

我可以直接给你 可复制配置

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI