找出mongodb的jumbo块并进行分裂

https://www.cnblogs.com/abclife/p/15968628.html

根据这篇文档中的脚本,在我们自己的环境中跑了下,第一次跑的结果如下:

运行完上面跑出的split脚本后,还是存在jumbo块,第二次跑出的结果:

从上面结果可以看出,chunks的数量增加了,但jumbo chunks的数量没有减少很多。

也和阿里云后台沟通,jumbo chunk不能分裂的原因:

因为大部分jumbo chunk是相同shard key组成的,所以无法继续分割。

不知道有没有通过这种方法分割成功的案例。

具体运行脚本如下:

1、使用以下脚本找出未被检测到的Jumbo块,并生成相关命令:

var allChunkInfo = ``function``(ns){

``var chunks = db.getSiblingDB(``"config"``).chunks.find({``"ns" : ns}).sort({``min``:1}).noCursorTimeout(); //this will ``return all chunks ``for the ns ordered ``by min

``var totalChunks = 0;

``var totalJumbo = 0;

``var totalSize = 0;

``var totalEmpty = 0;

``chunks.forEach(

``function printChunkInfo(chunk) {

``var db1 = db.getSiblingDB(chunk.ns.split(``"."``)[0]) // get the ``database we will be running the command against later

``var ``key = db.getSiblingDB(``"config"``).collections.findOne({_id:chunk.ns}).``key``; // will need this ``for the dataSize call

``// dataSize ``returns the info we need ``on the data, but using the estimate ``option to use counts ``is less intensive

``var dataSizeResult = db1.runCommand({datasize:chunk.ns, keyPattern:``key``, ``min``:chunk.``min``, ``max``:chunk.``max``, estimate:``false``});

``if(dataSizeResult.``size > 67108864) {

``totalJumbo++;

``print(``'sh.splitFind("' + chunk.ns.toString() + ``'", ' + JSON.stringify(chunk.``min``) + ``')' + ``' // '``+ chunk.shard + ``' ' + Math.round(dataSizeResult.``size``/1024/1024) + ``' MB ' + dataSizeResult.numObjects );

``}

``totalSize += dataSizeResult.``size``;

``totalChunks++;

``if (dataSizeResult.``size == 0) { totalEmpty++ }; //``count empty chunks ``for summary

``}

``)

``print(``"***********Summary Chunk Information***********"``);

``print(``"Total Chunks: "``+totalChunks);

``print(``"Total Jumbo Chunks: "``+totalJumbo);

``print(``"Average Chunk Size (Mbytes): "``+(totalSize/totalChunks/1024/1024));

``print(``"Empty Chunks: "``+totalEmpty);

``print(``"Average Chunk Size (non-empty): "``+(totalSize/(totalChunks-totalEmpty)/1024/1024));

}

2、脚本必须通过mongos router进行调用:

mongos> allChunkInfo(``"db.test_col"``)

3、 生成如下结果

sh.splitFind(``"db.test_col"``, {``"_id"``:``"jhxT2neuI5fB4o4KBIASK1"``}) // shard-1 222 MB 7970

sh.splitFind(``"db.test_col"``, {``"_id"``:``"zrAESqSZjnpnMI23oh5JZD"``}) // shard-2 226 MB 7988

sh.splitFind(``"db.test_col"``, {``"_id"``:``"SgkCkfSDrY789e9nD4crk9"``}) // shard-1 218 MB 7986

sh.splitFind(``"db.test_col"``, {``"_id"``:``"X5MKEH4j32OhmAhY7LGPMm"``}) // shard-1 238 MB 8338

...

***********Summary Chunk Information***********

Total Chunks: 5047

Total Jumbo Chunks: 120

Average Chunk ``Size (Mbytes): 19.29779934868946

Empty Chunks: 1107

Average Chunk ``Size (non-empty): 24.719795257064895

4、运行上一步骤的split命令

备注:阿里云分片集群介绍

什么是MongoDB分片集群_云数据库 MongoDB 版(MongoDB)-阿里云帮助中心

相关推荐
广州智造3 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥6 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸7 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1238 小时前
Redis解析
数据库·redis·缓存
数据库幼崽8 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd8 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou9 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh9 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵10 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多11 小时前
Linux——mysql主从复制与读写分离
数据库·mysql