带着问题看 MongoDB——collStats 和 dbStats 命令中的各种 size 怎么理解

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: MongoDB 底层使用了 WiredTiger 存储引擎,WT 使用的块分配策略会产生磁盘碎片,通过理解collStats 和 dbStats 命令中的各种 size,最后我们看下真正的磁盘碎片率怎么计算,是否需要做 compact。

dbStats

  • dataSize,未压缩数据的大小的,数据的逻辑大小,删除文档会变化,为各 collection stats.size 的累加
  • storageSize,block manger实际分配的空间大小(文件大小),删除文档不会发生变化,compact 会,使用压缩后,可能会比 dataSize 小,为各 collection stats.storageSize 的累加
  • indexSize,类似于 storageSize,但是反馈的是所有索引表通过 BM 分配的的大小
  • fsUsedSize,文件系统当前实际使用空间
  • fsTotalSize,文件系统总容量,上面两个值都是通过boost::filesystem::space拿到值,如果共有同一个文件系统,和具体的 Database 没有关联
// src/mongo/db/catalog/database_impl.cpp:284
    if (!opCtx->getServiceContext()->getStorageEngine()->isEphemeral()) {
        boost::filesystem::path dbpath(
            opCtx->getServiceContext()->getStorageEngine()->getFilesystemPathForDb(_name));
        boost::system::error_code ec;
        boost::filesystem::space_info spaceInfo = boost::filesystem::space(dbpath, ec);
        if (!ec) {
            output->appendNumber("fsUsedSize", (spaceInfo.capacity - spaceInfo.available) / scale);
            output->appendNumber("fsTotalSize", spaceInfo.capacity / scale);
        } else {
            output->appendNumber("fsUsedSize", -1);
            output->appendNumber("fsTotalSize", -1);
            log() << "Failed to query filesystem disk stats (code: " << ec.value()
                  << "): " << ec.message();
        }
    }

collStats

  • size,  collection 中所有document 的未压缩大小
  • storageSize,collection 文件大小
  • wiredTiger."block-manager"."file size in bytes",等于storageSize
  • wiredTiger."block-manager"."file bytes available for reuse",collection 文件可重用的空间大小
  • totalIndexSize,collection 上所有索引对应的wt表文件的大小
  • indexSizes,Object,分别列出了各个索引的文件大小
  • indexDetails.index_name."block-manager"."file size in bytes",类似于 collection,反映的是索引表的文件大小
  • indexDetails.index_name."block-manager"."file bytes available for reuse",类似于 collection,反映的是索引表可重用空间大小
  • 所以要计算单个 collection(含索引)的磁盘空间碎片率,计算脚本,
function getCollectionDiskSpaceFragRatio(dbname, coll) {
    var res = db.getSiblingDB(dbname).runCommand({
        collStats: coll
    });
    var totalStorageUnusedSize = 0;
    var totalStorageSize = res['storageSize'] + res['totalIndexSize'];
    Object.keys(res.indexDetails).forEach(function(key) {
        var size = res['indexDetails'][key]['block-manager']['file bytes available for reuse'];
        print("index table " + key + " unused size: " + size);
        totalStorageUnusedSize += size;
    });
    var size = res['wiredTiger']['block-manager']['file bytes available for reuse'];
    print("collection table " + coll + " unused size: " + size);
    totalStorageUnusedSize += size;
    print("collection and index table total unused size: " + totalStorageUnusedSize);
    print("collection and index table total file size: " + totalStorageSize);
    print("Fragmentation ratio: " + ((totalStorageUnusedSize * 100.0) / totalStorageSize).toFixed(2) + "%");
}

一次查看 db 下的所有 collection 碎片率,

use xxxdb
db.getCollectionNames().forEach((c) => {print("\n\n" + c); getCollectionDiskSpaceFragRatio(db.getName(), c);});

compact

如果碎片率过高,我们需要做 compact,MongoDB 本身提供了 compact 命令,关于 compact 命令的使用和原理,可以参考团队另外一位同学文章:https://developer.aliyun.com/article/709526

如果是 Sharding 实例,需要执行 compact 命令,请按如下方式执行命令:
https://developer.aliyun.com/article/328761


最后,打一个小广告,阿里云 MongoDB 目前上线了 Serverless 版本,让您方便的以超低成本试用 MongoDB,活动期间首购 1 元包月,续费也有 5 折优惠,欢迎试用:https://www.aliyun.com/product/mongodb

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
3月前
|
存储 JSON NoSQL
3-MongoDB常用命令
MongoDB常用命令
108 2
|
5月前
|
NoSQL 数据可视化 关系型数据库
mongoDB入门教程三:数据库的创建和删除(增删改查)基本命令
mongoDB入门教程三:数据库的创建和删除(增删改查)基本命令
130 0
|
5月前
|
存储 JSON NoSQL
数据库系列课程(22)-MongoDB 常用命令
数据库系列课程(22)-MongoDB 常用命令
203 0
|
SQL NoSQL MongoDB
MongoDB---基本命令
MongoDB---基本命令
MongoDB---基本命令
|
3月前
|
存储 JSON NoSQL
3-MongoDB常用命令
#3-MongoDB常用命令
|
4月前
|
NoSQL MongoDB 数据库
MongoDB 命令
MongoDB 命令
|
8月前
|
存储 NoSQL MongoDB
MongoDB常用命令(2)
1、创建数据库
472 0
|
8月前
|
NoSQL 关系型数据库 MySQL
【Docker】Docker安装MongoDB最新版并连接使用附加docker常用命令
【Docker】Docker安装MongoDB最新版并连接使用附加docker常用命令
452 0
|
9月前
|
NoSQL 数据可视化 Linux

相关产品

  • 云数据库 MongoDB 版