开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2580人左右 1 + 2 + 3 + 4 +5 + 6 + 7+8)(1 2 3 4 5 6 已满,新人进7群接近300,开8群)
数据库 《三体》“二向箔” 思维限制 !8个公众号联合抽奖送书 建立数据库设计新思维
这里通知一下,送书的活动已经结束,昨日已经联系了三位中奖的同学,出版社的老师已经收到这三位同学的地址和电话,请注意这三位同学查收。
MongoDB 数据collection,(表)如果出现数据碎片该怎么办,在MongoDB中存在一个命令可以对表进行碎片整理,这个命令对文档docuemnt在collection中进行重新的组织和排序,使得数据在磁盘上的存储更加连续,
那么问题来了,我怎么判断MongoDB的表,collection存在碎片的问题。这里MongoDB并没有明确的信息直接告知你某个表存在磁盘碎片信息或者百分比之类的,但我们可以通过db.表名.stats() 中的block-manager 来进行判断。
方法1:blocks freed / blocks allocated > 50% 方法2:file bytes available for reuse / file size in bytes > 50%
blocks allocated 是指新分配的块数,blocks freed 是指释放的块数。释放的块表示那些已经不再被使用的数据空间。当blocks freed 越来越多说明有越来越多的数据块不被使用,而blocks allocated 还在持续的快速增长的情况下,说明释放的数据块并未直接被重用,而是继续的分配新的磁盘空间来进行新的数据的存储,所以这就值得惊醒了。
第二个方法是可以进行重用的磁盘空间和总体的磁盘空间的比值,一般可重用的磁盘空间特别大,说明这些都是碎片,且无法利用,同时当文件尺寸较大时这就证明磁盘碎片比较严重了。
我们下面做一个例子,这是一个collection,进行stats()后取的block-manager的信息,这个表非常小,部分情况展示的不是很明显。
"block-manager" : {
"allocations requiring file extension" : 8,
"blocks allocated" : 8,
"blocks freed" : 1,
"checkpoint size" : 4096,
"file allocation unit size" : 4096,
"file bytes available for reuse" : 16384,
"file magic number" : 120897,
"file major version number" : 1,
"file size in bytes" : 36864,
"minor version number" : 0
},
db.runCommand({compact:'cities',force:true})
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1639496884, 1),
"signature" : {
"hash" : BinData(0,"xiNUFIQ/RLMeBHYA3GP3XUHQ1Kk="),
"keyId" : NumberLong("7040270890788978692")
}
},
"operationTime" : Timestamp(1639496884, 1)
通过上面的compact 命令来对表进行操作,这里如果在主库进行操作则会必须用到force:true否则不予操作。大家可以观察,下面的图中,在进行命令后,file size in bytes 和 filebytes available for reuse 都变小了。
1 整体的文件尺寸变小了,释放了空间给系统
2 碎片变小了,整体文件变得更紧凑了
通过第一个命令可以达到我们的需求,但需要注意的是数据库的版本,如果你还使用MongoDB4.4以前的版本,那么这里非常不建议进行相关的工作,因为会锁表。
所以对数据库进行此项操作的最低版本是MongoDB 4.4
除此之外,相信网上还有一些知识说,可以使用这个命令,db.runCommand({repairDatabase:1}),说通过repairDatabase的命令可以直接修复数据库,且回收磁盘,重建数据文件。
但这些操作中没有说明,使用这个操作会Down机。具体请看下面的操作,在第二节点执行此命令,从库直接挂掉。且这个节点根本就没有压力,也没有数据量的情况下,这个命令都能让系统直接挂掉。所以网上的东西,不能轻易相信,需要进行尝试,尤其这样的命令,且不可在生产系统上进行操作。
repl:SECONDARY> rs.secondaryOk()
repl:SECONDARY>
repl:SECONDARY>
repl:SECONDARY> db.runCommand({repairDatabase:1})
2021-12-14T16:12:09.749-0500 I NETWORK [js] DBClientConnection failed to receive message from 192.168.198.100:27027 - HostUnreachable: Connection closed by peer
2021-12-14T16:12:09.750-0500 E QUERY [js] uncaught exception: Error: error doing query: failed: network error while attempting to run command 'repairDatabase' on host '192.168.198.100:27027' :
DB.prototype.runCommand@src/mongo/shell/db.js:169:19
@(shell):1:1
2021-12-14T16:12:09.752-0500 I NETWORK [js] trying reconnect to 192.168.198.100:27027 failed
2021-12-14T16:12:09.753-0500 I NETWORK [js] reconnect 192.168.198.100:27027 failed failed
2021-12-14T16:12:09.757-0500 I NETWORK [js] trying reconnect to 192.168.198.100:27027 failed
2021-12-14T16:12:09.757-0500 I NETWORK [js] reconnect 192.168.198.100:27027 failed failed
>
>
>
> exit
bye
2021-12-14T16:12:29.559-0500 I NETWORK [js] trying reconnect to 192.168.198.100:27027 failed
2021-12-14T16:12:29.559-0500 I NETWORK [js] reconnect 192.168.198.100:27027 failed failed
2021-12-14T16:12:29.559-0500 I QUERY [js] Failed to end session { id: UUID("14f45c1d-5c15-4620-bae4-2398fbee8eab") } due to SocketException: socket exception [CONNECT_ERROR] server [couldn't connect to server 192.168.198.100:27027, connection attempt failed: SocketException: Error connecting to 192.168.198.100:27027 :: caused by :: Connection refused]
最后有没有更狠的招数,当然有,比如你在系统中在加入一个节点,然后一个一个更换现有的节点,在数据重新再新节点初始化的过程中,相当于进行了碎片的整理,当然这个过程会比较麻烦且慢,但这也是一个安全的方案,具体的操作就不在这里进行赘述了。
MongoDB 相关文章
数据库 《三体》“二向箔” 思维限制 !8个公众号联合抽奖送书 建立数据库设计新思维
OceanBase 相关文章
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
PostgreSQL 相关文章
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
PolarDB 相关文章
PolarDB 并行黑科技--从百套MySQL撤下说起 (感谢8018个粉丝的支持)
PolarDB 杀疯了,Everywhere Everytime Everydatabase on Serverless
POLARDB 从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS
PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈
PolarDB 从节点Down机后,引起的主从节点强一致的争论
PolarDB serverless 真敢搞,你出圈了你知道吗!!!!
PolarDB VS PostgreSQL "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?
临时工访谈:PolarDB Serverless 发现“大”问题了 之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
POLARDB -- Ausitndatabases 历年的文章集合
PolarDB for PostgreSQL 有意思吗?有意思呀
MySQL相关文章
阿里云系列
阿里云数据库产品权限设计缺陷 ,六个场景诠释问题,你可以做的更好?
阿里云数据库--市场营销聊胜于无--3年的使用感受与反馈系列
阿里云数据库产品 对内对外一样的卷 --3年阿里云数据库的使用感受与反馈系列
阿里云数据库使用感受--客户服务问题深入剖析与什么是廉价客户 --3年的使用感受与反馈系列
阿里云数据库使用感受--操作界面有点眼花缭乱 --3年的使用感受与反馈系列