首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MongoDB-分片(Sharding)集群配置

MongoDB-分片(Sharding)集群配置

作者头像
运维小路
发布2026-01-26 12:51:50
发布2026-01-26 12:51:50
880
举报
文章被收录于专栏:运维小路运维小路

作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL

PostgreSQL

MongoDB(本章节)

Redis

Etcd

上个小节我们完成了分片(Sharding)集群的部署,服务器总共启动了3个进程,涉及到3个端口,我们应该怎么连接呢?怎么确认这个集群是正常的呢?今天我们就来介绍他。

部署 MongoDB 分片集群后,需从集群拓扑、分片均衡、副本集状态、路由节点连通性 等维度验证集群健康状态,以下是系统化的验证步骤和命令:

一、基础前提:连接分片集群

所有验证操作需通过mongos(路由节点)执行(而非直接连分片或配置节点),确保路由层正常转发请求:

代码语言:javascript
复制
mongosh --host 192.168.31.211 --port 27017

二、查看分片集群状态

严格来说,我们上个小节只是完成了部署,实际上他还形成分片集群,而且我们只添加了一个分片,所以下面的分片部分还是空的。

代码语言:javascript
复制
[direct: mongos] test> sh.status()
shardingVersion
{ _id: 1, clusterId: ObjectId("69495c344f2b01bafc73e84d") }
---
shards
[]
---
active mongoses
[]
---
autosplit
{ 'Currently enabled': 'yes' }
---
balancer
{ 'Currently enabled': 'yes', 'Currently running': 'no' }
---
databases
[
  {
    database: { _id: 'config', primary: 'config', partitioned: true },
    collections: {}
  }
]

三、添加分片集群

这里的需要注意ip前面的分片名字:shard,需要和前面添加的分片集群名字对应。

代码语言:javascript
复制
[direct: mongos] test> sh.addShard("shard/192.168.31.211:27018,192.168.31.212:27018,192.168.31.213:27018")
{
  shardAdded: 'shard',
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1766504553, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
      keyId: Long("0")
    }
  },
  operationTime: Timestamp({ t: 1766504553, i: 1 })
}

四、再次检查分片集群状态

这里就看到了我们分片,当然由于这里只有一个分片,所以写数据还是会写到这一个分片复制集里面。

代码语言:javascript
复制
[direct: mongos] test> sh.status()
shardingVersion
{ _id: 1, clusterId: ObjectId("69495c344f2b01bafc73e84d") }
---
shards
[
  {
    _id: 'shard',
    host: 'shard/192.168.31.211:27018,192.168.31.212:27018,192.168.31.213:27018',
    state: 1,
    topologyTime: Timestamp({ t: 1766504552, i: 2 })
  }
]
---
active mongoses
[ { '7.0.25': 1 } ]
---
autosplit
{ 'Currently enabled': 'yes' }
---
balancer
{ 'Currently enabled': 'yes', 'Currently running': 'no' }
---
databases
[
  {
    database: { _id: 'config', primary: 'config', partitioned: true },
    collections: {}
  }
]

五、向分片集群写入数据测试

代码语言:javascript
复制
// 切换到test数据库(或者新建一个数据库)
use test

// 启用数据库分片,一个数据库只要执行一次即可,重复执行无影响 
sh.enableSharding("test")

// 创建一个集合,并创建分片键索引
db.myCollection.createIndex({ _id: "hashed" })

// 对集合进行分片
sh.shardCollection("test.myCollection", { _id: "hashed" })

// 插入一些数据
for (let i = 0; i < 1000; i++) {
    db.myCollection.insert({ _id: i, data: "sample data " + i })
}

// 检查分片状态
sh.status()

// 查看数据分布
db.myCollection.getShardDistribution()

六、再次检查分片集群状态

这里我们可以看到我们数据已经写入成功,目前写入的数据分为了2个chunk,这个chunk和我们前面讲的hdfs的块实际上有点类似。

代码语言:javascript
复制
[direct: mongos] test> sh.status()
// 中间省略部分信息 

databases
[
  {
    database: { _id: 'config', primary: 'config', partitioned: true },
    collections: {
      'config.system.sessions': {
        shardKey: { _id: 1 },
        unique: false,
        balancing: true,
        chunkMetadata: [ { shard: 'shard', nChunks: 1 } ],
        chunks: [
          { min: { _id: MinKey() }, max: { _id: MaxKey() }, 'on shard': 'shard', 'last modified': Timestamp({ t: 1, i: 0 }) }
        ],
        tags: []
      }
    }
  },
  {
    database: {
      _id: 'test',
      primary: 'shard',
      partitioned: false,
      version: {
        uuid: new UUID("c96d2d14-ab51-4bff-9274-cf52cefa3a5e"),
        timestamp: Timestamp({ t: 1766505193, i: 1 }),
        lastMod: 1
      }
    },
    collections: {
      'test.myCollection': {
        shardKey: { _id: 'hashed' },
        unique: false,
        balancing: true,
        chunkMetadata: [ { shard: 'shard', nChunks: 2 } ],
        chunks: [
          { min: { _id: MinKey() }, max: { _id: Long("0") }, 'on shard': 'shard', 'last modified': Timestamp({ t: 1, i: 0 }) },
          { min: { _id: Long("0") }, max: { _id: MaxKey() }, 'on shard': 'shard', 'last modified': Timestamp({ t: 1, i: 1 }) }
        ],
        tags: []
      }
    }
  }
]

七、查看分片状态

代码语言:javascript
复制
[direct: mongos] test> db.myCollection.getShardDistribution()
Shard shard at shard/192.168.31.211:27018,192.168.31.212:27018,192.168.31.213:27018
{
  data: '38KiB',
  docs: 1000,
  chunks: 2,
  'estimated data per chunk': '19KiB',
  'estimated docs per chunk': 500
}
---
Totals
{
  data: '38KiB',
  docs: 1000,
  chunks: 2,
  'Shard shard': [
    '100 % data',
    '100 % docs in cluster',
    '39B avg obj size on shard'
  ]
}

这样我们的就真正完成了分片的集群的部署,后续只需要增加分片就可以无限对数据库进行扩容。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB(本章节)
    • 一、基础前提:连接分片集群
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档