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

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL
Redis
Etcd
上个小节我们完成了分片(Sharding)集群的部署,服务器总共启动了3个进程,涉及到3个端口,我们应该怎么连接呢?怎么确认这个集群是正常的呢?今天我们就来介绍他。
部署 MongoDB 分片集群后,需从集群拓扑、分片均衡、副本集状态、路由节点连通性 等维度验证集群健康状态,以下是系统化的验证步骤和命令:
所有验证操作需通过mongos(路由节点)执行(而非直接连分片或配置节点),确保路由层正常转发请求:
mongosh --host 192.168.31.211 --port 27017二、查看分片集群状态
严格来说,我们上个小节只是完成了部署,实际上他还形成分片集群,而且我们只添加了一个分片,所以下面的分片部分还是空的。
[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,需要和前面添加的分片集群名字对应。
[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 })
}
四、再次检查分片集群状态
这里就看到了我们分片,当然由于这里只有一个分片,所以写数据还是会写到这一个分片复制集里面。
[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: {}
}
]
五、向分片集群写入数据测试
// 切换到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的块实际上有点类似。
[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: []
}
}
}
]
七、查看分片状态
[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'
]
}这样我们的就真正完成了分片的集群的部署,后续只需要增加分片就可以无限对数据库进行扩容。