一个庞然大物的生命
MongoDB将一个块标记为“jumbo”,当它增长超过配置的最大块大小。从MongoDB 6.0开始,这个值默认为128 MB(以前是64 MB)。
出现大块的最常见原因是自动分割进程找不到分割块的方法。例如,当块中的所有文档包含相同的分片键时,就会发生这种情况。
随着时间的推移,如果删除一些数据,可能会导致块“减重”。所以数据块可能会在某个点小于最大数据块大小。不幸的是,MongoDB在这种情况下不会自动删除jumbo标志。
问题是大块被平衡器进程忽略了。最终,分片上的数据可能会变得不平衡,一些分片比其他分片拥有更多的数据。而且,直到最近,成功分割块后,没有正确清除大块标志。
清除巨型旗
为了防止上面描述的情况,我们应该检查大块,并删除小于最大块大小的大块的大块标志。
我们的想法是浏览每一份文件config.chunks集合{jumbo:true}属性,并运行dataSize命令,查看实际块大小。如果实际大小低于最大值,则清除块上的jumbo标志。
下面的脚本可以在MongoDB 5.0(或更新版本)上使用,以查找特定命名空间中的所有此类块并打印命令以删除jumbo标志:
|
1
2
3.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29
30.
|
var
clearJumbo
=
函数
(
ns
)
{
var
db1
=
db
.getSiblingDB
(
ns
.split
(
“。”
)
[
0
]
)
db1
.getMongo
(
)
.setReadPref
(
“二级”
)
;
var
uuid
=
db1
.getCollectionInfos
(
{
名字
:
ns
.split
(
“。”
)
[
1
]
}
)
[
0
]
info
.uuid
var
块
=
db
.getSiblingDB
(
“配置”
)
.chunks
;
(
{
“uuid”
:
uuid
,
“巨型”
:
真正的
}
)
.sort
(
{
最小值
:
1
}
)
.noCursorTimeout
(
)
;
var
关键
=
db
.getSiblingDB
(
“配置”
)
.collections
.findOne
(
{
_id
:
ns
}
)
。key
;
var
totalChunks
=
0
;
var
totalJumbo
=
0
;
var
开始时间
=
新
日期
(
)
;
打印
(
开始时间
)
;
块
.forEach
(
函数
printChunkInfo
(
块
)
{
var
dataSizeResult
=
db1
.runCommand
(
{
datasize
:
ns
,
keyPattern
:
关键
,
最小值
:
块
.min
,
马克斯
:
块
.max
,
估计
:
真正的
}
)
;
如果
(
dataSizeResult
.size
<
134217728
)
{
var
dataSizeResult2
=
db1
.runCommand
(
{
datasize
:
ns
,
keyPattern
:
关键
,
最小值
:
块
.min
,
马克斯
:
块
.max
,
估计
:
假
}
)
;
如果
(
dataSizeResult2
.size
<
67108864
)
{
totalJumbo++;
打印
(
'db.getSiblingDB("admin").runCommand({clearJumboFlag: "'
+
ns
+
' ',边界:[{' ' '+
JSON
.stringify
(
块
.min
)
+
"}, {"
+
JSON
.stringify
(
块
.max
)
+
““}})”
)
;
}
}
totalChunks++;
}
)
var
endTime
=
新
日期
(
)
;
打印
(
“***********汇总块信息***********”
)
;
打印
(
“总大块:”+totalChunks
)
;
打印
(
“巨型旗帜全部移除:”+totalJumbo
)
;
打印
(
“总持续时间:”+(
(
endTime
-
开始时间
)/1000
)
+
“秒”
)
;
}
|
该脚本做了一些事情来减少开销并加快处理速度。首先,我们在次要成员上运行数据大小估计,以避免影响主成员。
在某些用例中,不同文档的文档大小差别很大。运行dataSize命令{估计:true}如果文档大小不统一,将计算一个错误的估计,因为它依赖于平均文档大小。
另一方面,跑步dataSize与{估计:true}因为所有的块在资源方面都是缓慢和昂贵的,所以我们可以设计一个折衷方案。
我们运行dataSize命令{估计:true}首先,这是快的。只有当估计的块大小小于最大块大小的两倍时,我们才能通过扫描块中的所有文档来计算实际块大小。
封闭的思想
我们已经看到了块如何静默地失去“jumbo”状态,以及这可能如何影响平衡过程。我们已经找到了一种检测和补救这种情况的方法。
与此相关的是,一个有趣的事实是块可以超过最大大小而不被标记为jumbo。
定期检查大块并在块实际上小于最大块大小时删除大块标志是一种很好的做法。
雷竞技下载官网Percona Distribution for MongoDB是一个免费的MongoDB数据库替代方案,为您提供一个单一的解决方案,它结合了来自开源社区的最好和最重要的企业组件,设计和测试可以一起工作。
今天就下载Mong雷竞技下载官网oDB的Percona发行版!






