在使用 TDegnine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。

本工具通过分析样本数据,提供最佳压缩率的检测结果,并同时输出与之相关的两个关键性能指标:写入速度和查询速度。由于写入过程中涉及数据压缩,压缩效率越高,写入速度越快;而查询过程中则需要解压数据,解压效率越高,查询速度越快。借助这些指标,用户可以根据实际需求,在存储效率与访问性能之间找到最佳平衡,选择最适合自己数据的压缩算法。

下载和安装

  1. 本工具为开源工具,使用 python 编写
  2. 工具下载地址:https://github.com/taosdata/TDengine/tree/3.0/tools/auto/testCompression
  3. 本工具为绿色软件,下载后即可使用,无需安装

使用指南

文件说明

  1. testCompression.py:主程序文件,运行时需依赖 json/template.json。
  2. json 目录: 存放运行 taosBenchmark 所需的 JSON 和 CSV 文件。
  3. json/tempalte.json:taosBenchmark 用于生成不同二级压缩算法的模板文件,文件名固定不可修改,格式与使用方法详见官网文档: https://docs.taosdata.com/reference/tools/taosbenchmark/。模板文件中使用宏 @COMPRESS 表示压缩算法名。支持的四种压缩算法分别为:zlib、xz、zstd、lz4,以及 disabled(关闭二级压缩)。
  4. d0_10w.csv.zip: 测试样本数据文件(10 万条数据)。使用前需解压至当前目录,在 template.json 中有引用。
  5. query.json:报告中 query-QPS 指标的来源,通过 taosBenchmark 测试查询性能,使用可详见官网taosBenchmark 使用说明。
  6. generate.json:配置文件用于通过 taosBenchmark 生成样例数据 d0_10w.csv。可以修改此 json 生成更大规模的数据集(如 100 万或更多)。

使用步骤

  1. 前置条件: ⅰ.确认已安装 TDengine 3.3.2.0 及以上版本 ⅱ.确认已安装 python3 ⅲ.确认已安装 TDegnine 的 python3 连接器 taospy ⅳ.确认 taosd 服务已启动,执行 taos 可正常连接 TDengine ⅴ.确认 taosBenchmark(安装包中自带) 能运行
  2. 进入仓库源码目录 testCompression
  3. 解压 json\d0_10w.csv.zip 到当前 json 目录,确认 d0_10w.csv 在 json 目录下存在
  4. 在 testCompression 目录下执行 python3 ./testCompression.py 运行主程序启动检测
  5. 输出测试报告,测试完成。历史测试报告记录在 ./result.txt 操作步骤:
# 安装 TDengine python 连接器
pip3 install taospy
# 下载 TDengine 开源代码仓库
git clone https://github.com/taosdata/TDengine.git
# 进入工具目录
cd TDengine/tools/auto/testCompression
# 解压测试样本数据集
unzip json/d0_10w.csv.zip -d ./json/
# 运行主程序
python3 testCompression.py
# 查看测试报告
cat ./result.txt

输出报告

为了检测更精准,在上一步示例操作中把 tempalte.json 文件中子表数 childtable_count 从 1 改为 10 ,数据规模扩大 10 倍到 100w 后得到的检测数据如下: 数据分布说明:100w 数据是把 csv 文件中 10w 数据复制出 10 份放到 10 个子表中的 1280X1280.PNG 从结果可以看出,此样本数据下最好的 xz 压缩算法与最差的 lz4 之间压缩率差距还是很大的。

格式说明:

  1. 第一行括号中的时间为测试开始时间,最后一行为测试完成时间。
  2. 2 ~ 4 行是记录 taosBenchmark json 文件中的几个重要信息,VGROUPD 数量,子表数量及生成子表行数。
  3. 下面 5 ~ 10 行为报告内容,各列如下: No: 序号
    compress: 压缩算法 dataSize: 磁盘上压缩后数据文件大小 rate: 压缩率 writeSpeed: 写入速度 (单位:写入行数/每秒) query-QPS: 查询 QPS(单位: 查询请求数/每秒) ,查询 sql 可在 json/query.json 中指定
  4. 重点说下 rate (压缩率)的计算: 分母: 1)对于固定长度数据类型,分母即约定的长度 bool ( 1 字节)tinyint ( 1 字节) smallint ( 2 字节) int ( 4 字节) 等 2)对于可变长度数据类型,如 varchar, binary , nchar 等,分母是在建表时创建字段时指定的长度,如 varchar(12) 即 12 字节 分子:压缩后数据的实际大小 此压缩率是以超级表为统计单位,统计的是超级表及其所有子表。

更换样本

更换为自己的样本数据,需要修改以下几处:

  1. 更换 CSV 文件 若你的数据已在 TDegnine 中,可以通过 taos-CLI 工具导出。 重点强调下,一个 csv 文件中只能存放一张子表数据。 选择一个最具代表数据特征的子表,假设为 d0,可以使用 select * from d0 >> d0.csv 命令完成导出,导出后的 csv 需删除第一行(第一行是列名, 非数据,需删除)。 步骤如下:
# taos-CLI 中导出表数据到 csv 
select * from d0 >> d0.csv
# shell 中删除 csv 首行
sed -i '1d' d0.csv
  1. template.json 中做相应修改 ⅰ."prepared_rand": 100000 一定要改为大于或等于你的 CSV 文件行数 ⅱ. "sample_file": "./json/d0_10w.csv" 改成你 csv 文件路径 ⅲ. "use_sample_ts": "yes", 如果你的 csv 文件中第一列是时间主列,保持 yes 不动,即写入数据的时间使 用 csv 文件中的第一列时间。如果你的 csv 文件没有时间列的,改成 no,由 taosBenchmark 帮你生成时间列,生成时间的开始时间由"start_timestamp" 指定,步长由 "timestamp_step" 指定,每个子表生成的记录数由 "insert_rows" 指定。 ⅳ. "childtable_count": 1, CSV 文件写入到几个子表中,每个子表写入数据都是和 CSV 中数据是相同的,填写你期望的数量。 ⅴ."columns": 更换成与你 CSV 文件中数据相匹配的列类型 示例: 如你的 CSV 文件有 100 万行, 你希望能把写入数据规模扩大 10 倍,那按照如下黄色背景标记地方修改即可:
{
    "filetype": "insert",
    ...
    "prepared_rand": 1000000,
    "databases": [
        {
            "dbinfo": {
                "name": "dbrate",
                ...
            },
            "super_tables": [
                {
                    "name": "meters",
                    "childtable_count": 10,
                    "childtable_prefix": "d",
                    "insert_rows": 1000000,
                    ...
                }
            ]
        }
    ]
}

检测方法

  1. 整体检测 这种方式是通过按用户实际建表结构和实际数据进行整体压缩率测试,上述示例即属于这种,一个 CSV 文件中混合着表的所有数据类型,对所有数据类型整体上评估最佳压缩算法。该方法优点是操作简单,检测速度快,但却无法针对不同数据类型的列分别优化,可能会忽略各列数据类型对应的最佳压缩算法。
  2. 单数据列检测 单数据列检测方式将用户实际建表中的所有列按数据类型分组,例如,如果表中包含四种数据类型,则分为四组,每组分别进行一次测试。该方法的优势在于,CSV 文件中仅保留时间列和指定的数据类型列,使得检测结果更加精确,能够准确找到该数据类型的最佳压缩率。但其缺点是需要进行多轮操作,增加了测试的复杂性和时间成本。

常见问题

1. 我的数据样本应该多大合适? 原则上,数据越大,检测压缩率越准确。建议 CSV 文件的行数不少于 1 万,写入数据库的总行数不少于 100 万。通过配置多个子表写入,可以进一步放大样本数量,提升测试的精度。 2. 我已知某列最佳压缩算法,不想再每轮测试中再改变,怎么办? 我们的目标是找出每列数据的最佳压缩算法。当已知某列的最佳压缩算法时,可在 template.json 中直接用具体算法名替换 @COMPRESS 宏,这样在测试过程中,该列的压缩算法将保持不变。 3. TDegnine 都支持哪些压缩算法? 压缩算法支持列表请参考官网:https://docs.taosdata.com/reference/taos-sql/compress/ 4. 如何在 template.json 中定义数据类型? 在 csv 测试样本数据中,每一列数据都需要在 template.json 中声明数据类型。可参考 taosBenchmark 使用说明 最后一节的“数据类型书写对照表”,确保数据类型定义正确:https://docs.taosdata.com/reference/tools/taosbenchmark/

结语

通过该工具,用户可以更高效地测试并选择最适合自身数据的压缩算法,不仅提升存储效率,还能在性能和存储之间取得最佳平衡。无论是整体压缩测试还是单数据列检测,该工具都为不同需求提供了灵活的方案,帮助用户快速找到解决方案。