TSZ 压缩算法是 TDengine 为浮点数据类型提供的可选压缩算法,可以实现浮点数有损至无损全状态压缩,相比默认压缩算法,TSZ 压缩算法压缩率更高,即使切至无损状态,压缩率也会比默认压缩高一倍。一般来说,TSZ 压缩算法是通过数据预测技术完成的压缩,所以更适合有规律变化的数据。同时 TSZ 压缩时间会更长一些,在我们的服务器 CPU 空闲、存储空间紧张的情况下适合选用。
在此前发布的《压缩比提高5倍!贡献者+1》一文中,华中科技大学、武汉光电国家研究中心的硕士研究生钟宇为大家详细介绍了其在近期发表的学术论文中,针对 TDengine TSZ 压缩算法进行的相关改进。本篇文章中,我们将就如何在 TDengine 中开启 TSZ 压缩算法进行详细说明,并会针对 TSZ 压缩算法展开功能测试,为大家验证其在实际业务场景中的更优性能。
在 TDengine 中开启 TSZ 压缩算法
TDengine 3.2.0.0 及以上版本中支持此压缩算法。在 taos.cfg 配置中增加以下内容,即可开启 TSZ 压缩算法,功能打开后,会替换默认算法。以下表示字段类型是 float 及 double 类型都使用此压缩算法,也可以单独只配置一个。
lossyColumns float|double
配置成功后需要重启服务才能生效,当 Taosd 日志输出以下内容时,即表明功能已生效:
02/22 10:49:27.607990 00002933 UTL lossyColumns float|double
配置参数
FLOAT 类型精度控制:
DOUBLE 类型精度控制:
TSZ 压缩中可选择的算法 FSE,默认为 HUFFMAN:
但需要注意的是,打开 TSZ 后生成的存储数据格式,在回退至 3.2.0.0 之前的版本后数据将不能被识别。
TDengine TSZ 压缩算法功能测试
数据正确性
首先我们需要验证写入数据被 TDengine 存储后再次读取出来的正确性:
- 通过 0-others/compress_tsz1.py 实现;
- 写入 10 个子表, 每子表 10 万数据,分别写入 float 和 double 字段指定的随机值,写入完成后全部再读取出来,和原来写入时的值进行比较。原来写入的值把整数及小数部分分别在两个 int64 的字段中保存,验证时再读取出来合成一个浮点数进行验证。验证的误差 float 为 1e-6, double 为 1e-12;
- 验证通过,数据完全正确。
数据兼容性
首先我们需要先写入打开 TSZ 压缩的数据,然后再写入关闭 TSZ 压缩的数据,此阶段测试预期是不管 TSZ 选项打开或关闭,原来使用 TSZ 写入的及没有使用 TSZ 写入的都能正确读取出来。
测试步骤如下:
- 配置 TSZ 选项为打开 lossyColumns float|double
- 启动 taosd
- 创建数据库及表,表中包括 float 及 double 字段
- 写入 100 万条数据
- 写入成功后读取并查看数据正确性
- 退出 taosd 并关闭 TSZ 选项
- 启动 taosd 并写入新数据到表中
测试结果显示原来的数据及新写入数据,都正常为符合预期,反复打开及关闭 TSZ,不影响已写入数据的正常存取。
性能比较
我们对本次新引入的 FSE 算法、原来的算法,及关闭 TSZ 压缩后的三个场景作为三种方案进行对比测试,验证打开 TSZ 算法及使用 TSZ 新的 FSE 算法的效果。本次测试的数据规模如下:1 个超级表,2 个子表,每子表 100 万条数据,子表为 25 列 (其中 float 11 列、double 11 列)。
下表为最终测试结果:
从上表可知,方案一中新增的 FSE 算法打开后写入性能优于原来的算法,符合预期;其次,TSZ 压缩算法打开比关闭时,在写入性能、查询及压缩率方面均有小幅提升,此结论也符合预期。
写在最后
在阅读完本篇文章后,你一定对在 TDengine 中开启 TSZ 压缩算法及如何打造更优质性能有了更深入的了解,现在你可以进行操作了。如果在实操过程中碰到任何问题或难点,可以联系我们,和资深研发工程师进行面对面沟通。