MSC分片策略的定制和管理
MSC分片策略的定制和管理
使用分片集群
分片策略:
Range
range,根据数据的key value键值,决定划分的分片范围。 在此策略中,具有连续切分键值的文档很有可能位于同一个chunk或shard中。 这允许在读取连续范围内的目标文档,可以进行高效查询。 但是,可能会由于分片选择不当,会降低I/O性能

如果未配置其他分片策略(比如 hash),Range就是默认的分片策略
来个示意图理解一下:

由于X的值总是在增加,因此上限为maxKey的chunk C接收所有写操作。也就是说,这种场景会把插入操作限制在包含此chunk的shard节点上,这样就增加了share节点的IO负担,降低了分布式写操作的优势
range 分片策略在使用chunk时,会随机选shard节点中其中一个节点的chunk使用,直到chunk使用完了,才会使用第二个shard节点的chunk存数据
Hash
hash分片使用单个字段的哈希索引作为分片键,从而可以跨分片群集对数据进行分区

hash分片以减少“目标操作”与“广播操作”为代价,在整个分片群集中提供了更均匀的数据分布。 hash之后,具有连续分片键值的文档在写入时,IO操作不太可能位于相同的chunk或shard上。mongos通过广播操作来定位范围查询,同时将具有相等匹配项的查询定向到单个分片
也来个示意图理解一下:

在X上使用哈希索引,插入操作会分布在不同chunk 上,因此可以在整个群集中高效地分布插入内容。
提醒:
MongoDB哈希索引在哈希之前会将浮点数截断为64位整数。
例如,hash索引将会将2.3、2.2和2.9的字段存储相同的值。 为防止冲突,请勿对不能可靠地转换为64位整数(然后再转换回浮点)的浮点数使用哈希索引。 MongoDB哈希索引不支持大于253的浮点值
关于 hash和range分片策略,官方文档说明:
https://docs.mongodb.com/v3.6/core/hashed-sharding/
RANGE分片配置及测试
激活数据库分片功能
mongo --port 38017 admin
admin> db.runCommand( { enablesharding : "数据库名称" } )
eg:
# 激活数据库的分片功能
admin> db.runCommand( { enablesharding : "test" } )
指定分片键对集合分片
### 对分片的表创建索引
use test
> db.vast.ensureIndex( { id: 1 } )
### 开启分片
use admin
> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
集合分片验证
use test
for(i=1;i<200000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
db.vast.stats()
分片结果测试
shard1:
mongo --port 38021
db.vast.count();
sh1:PRIMARY> db.vast.count();
0
sh1:PRIMARY>
shard2:
mongo --port 38024
db.vast.count();
sh2:PRIMARY> db.vast.count();
19999
sh2:PRIMARY>
Hash分片示例
对oldboy库下的vast大表进行hash
创建哈希索引
(1)对于oldboy库开启分片功能
mongo --port 38017 admin
use admin
db.runCommand( { enablesharding : "oldboy" } )
(2)对于oldboy库下的vast表建立hash索引
use oldboy
db.vast.ensureIndex( { id: "hashed" } )
(3)开启分片
sh.shardCollection( "database.collection", { <field> : "hashed" } )
use admin
sh.shardCollection( "oldboy.vast", { id: "hashed" } )
(4)录入10w行数据测试
use oldboy
for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
mongos> for(i=1;i<20000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
WriteResult({ "nInserted" : 1 })
mongos>
mongos>
mongos> db.vast.count()
19999
mongos>
(5)hash分片结果测试
mongo --port 38021
use oldboy
db.vast.count();
sh1:PRIMARY> use oldboy
switched to db oldboy
sh1:PRIMARY> db.vast.count();
10140
sh1:PRIMARY>
mongo --port 38024
use oldboy
db.vast.count();
sh2:PRIMARY> use oldboy
switched to db oldboy
sh2:PRIMARY> db.vast.count();
9859
sh2:PRIMARY>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律