MSC分片策略的定制和管理

MSC分片策略的定制和管理

使用分片集群

分片策略:

Range

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

![](D:\data\Sync-data\simon\学习笔记\Mysql 笔记\MySql-DBA\Mongodb\NoSQL-Mongodb-08-MSC分片策略定制和管理.assets\Data-partitioning -with-chunks.png)

如果未配置其他分片策略(比如 hash),Range就是默认的分片策略

来个示意图理解一下:

![](D:\data\Sync-data\simon\学习笔记\Mysql 笔记\MySql-DBA\Mongodb\NoSQL-Mongodb-08-MSC分片策略定制和管理.assets\range分片策略示意.png)

由于X的值总是在增加,因此上限为maxKey的chunk C接收所有写操作。也就是说,这种场景会把插入操作限制在包含此chunk的shard节点上,这样就增加了share节点的IO负担,降低了分布式写操作的优势

range 分片策略在使用chunk时,会随机选shard节点中其中一个节点的chunk使用,直到chunk使用完了,才会使用第二个shard节点的chunk存数据

Hash

hash分片使用单个字段的哈希索引作为分片键,从而可以跨分片群集对数据进行分区

![](D:\data\Sync-data\simon\学习笔记\Mysql 笔记\MySql-DBA\Mongodb\NoSQL-Mongodb-08-MSC分片策略定制和管理.assets\Hashed Sharding.png)

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

也来个示意图理解一下:

![](D:\data\Sync-data\simon\学习笔记\Mysql 笔记\MySql-DBA\Mongodb\NoSQL-Mongodb-08-MSC分片策略定制和管理.assets\hash分片策略示意.png)

在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> 
posted @ 2022-05-19 23:59  oldSimon  阅读(79)  评论(0编辑  收藏  举报