文档下载建议反馈入口

  • 预分配空间管理
  • 数据压缩
  • 数据重组

存储管理

KWDB 支持在安装时通过修改 deploy.cfg 文件中的 data_root 参数自定义数据路径。部署完成后,用户也可以修改部署生成的 kaiwudb_env 文件或 docker-compose.yml 文件中的存储路径。更多配置信息,参见集群参数配置

说明

如果采用 Docker 容器部署,则使用宿主机路径,系统自动进行挂载。

下表列出 KWDB 各类文件的存储路径、文件系统和配置信息。

文件默认路径大小文件系统配置参数
数据文件/var/lib/kaiwudb取决于存储数据的大小建议使用 ext4 文件系统。如果存储大于 16 TB 的数据,建议使用 XFS 系统。--store
日志/var/lib/kaiwudb/logs默认 1G,可配置建议使用 ext4 文件系统。--log-dir
证书/etc/kaiwudb/certsN/A建议使用 ext4 文件系统。--certs-dir
二进制文件/usr/local/kaiwudb/bin> 200 M建议使用 ext4 文件系统。-
动态库文件/usr/local/kaiwudb/lib> 100 M建议使用 ext4 文件系统。-

预分配空间管理

KWDB 支持通过 ts.disk_free_space.alert_threshold 实时参数设置时序数据的预分配空间告警阈值,实现存储空间的智能管理。系统需要创建新的数据段(segment)以存储新写入的时序数据时,会自动检查节点剩余存储空间,并根据设置的阈值决定是否执行预分配操作:

  • 如果节点剩余存储空间达到配置的阈值,系统将不进行预分配操作,并返回提示信息。单机版本仍支持数据查询,但数据无法写入或导入。分布式集群下,该节点进入宕机状态。
  • 在多存储目录的环境下,系统会自动检查其他存储设备的可用空间。如果其他存储设备的剩余空间充足(大于设定阈值),这些存储目录将继续进行预分配操作。
  • 如果用户未配置预分配空间告警阈值,即采用默认值 0 B,表示不启用预分配空间管理功能,此时,如果剩余空间不足,预分配空间操作将执行失败,分布式集群下,该节点将进入宕机状态。

预分配空间告警阈值的设置取决于表的结构特征,具体计算方式如下:

ts.disk_free_space.alert_threshold (B) ≥ (type_a * column_number + type_b * column_number + ...) * ts.blocks_per_segment.max_limit * ts.rows_per_block.max_limit

其中:

  • 各数据类型所占的字节数,参见预估磁盘使用量
  • ts.blocks_per_segment.max_limit 用于控制时序数据分片下每个数据段中可存储的数据块数量,默认值为 1000
  • ts.rows_per_block.max_limit 用于控制每个数据块中可存储的数据行数,默认值为 1000

例如,INT8 数据类型占用的字节数是 8 字节,对于一个包含 100 列 INT8 类型的表,如果 ts.blocks_per_segment.max_limitts.rows_per_block.max_limit 均采用默认值 1000,预分配空间告警阈值应不小于:8 * 100 * 1000 * 1000 = 800 MB

数据压缩

数据压缩是用更少的空间对原有数据进行编码的过程,其核心在于去除冗余和不必要的数据,同时保持数据的核心信息和完整性。KWDB 支持对时序数据进行在线周期性压缩与即时压缩,确保用户享受自动压缩便利的同时,可以根据需求进行手动压缩,以灵活优化存储空间和数据管理;具备 5-30 倍的数据压缩能力,有助于降低数据存储成本;系统可以直接挂载压缩数据,无需解压缩即可查询数据。

周期性压缩与即时压缩

KWDB 支持周期性压缩与即时压缩两种压缩方式:

  • 周期性压缩:系统根据用户设置的数据活跃时间自动进行的数据压缩。周期性压缩在后台执行,系统会在每个压缩周期内,自动检测是否有数据超过指定的活跃时间,初次检测到符合条件的数据段会被标记为 InActiveSegment,在下个周期压缩为 squashfs 格式,从而释放存储空间。时序数据的默认活跃时间为 1 天。用户可通过创建表和修改表语句的 active_duration 参数设置活跃时间或取消周期性数据压缩功能。active_duration 参数更多信息,参见创建表修改表
  • 即时压缩:为需要快速响应的数据压缩需求设计,适合数据迁移或希望即时释放空间的场景,用户可根据需要手动执行 COMPRESS 压缩命令,系统将立即对所有符合条件的数据段执行压缩。即时压缩不依赖活跃时间设置,可以在任何时间对数据进行快速压缩。压缩完成时间取决于待压缩的数据量,待压缩的数据量越大,所需的时间越长。用户也可通过 immediate_compression.threads 实时参数设置即时压缩使用的线程数。有关压缩命令更多信息,参见即时压缩;有关 immediate_compression.threads 实时参数更多信息,参见实时参数

下表列出了周期性压缩和即时压缩的区别:

特性周期性压缩即时压缩
触发方式系统根据数据活跃时间设置自动触发用户手动触发,即刻执行
压缩条件根据时序表数据的活跃时间判定,初次检测到符合条件的数据段会标记为 InActiveSegment,到下个周期正式压缩无需判定活跃时间,直接对目标数据执行压缩
默认活跃时间1天,支持创建表和修改表时设置活跃时间无活跃时间要求

说明

周期性压缩和即时压缩同时触发时,系统会根据触发顺序自动调整:如果周期性压缩先触发,即时压缩会等待周期性压缩完成后再执行;如果即时压缩先触发,系统将跳过本次周期性压缩。

数据压缩算法

KWDB 支持通过 ts.compression.type 实时参数为时序数据配置以下无损压缩算法:

  • GZIP:对于要压缩的文件,GZIP 首先使用 LZ77 算法的一个变种进行压缩,对得到的结果再使用 Huffman 编码的方法进行压缩,压缩率很高,但比较耗时。
  • LZ4:属于 LZ77 压缩方案家族,压缩比并不高,但是解码速度极快。
  • LZMA:LZMA(Lempel-Ziv-Markov chain Algorithm)是一种 DEFLATE 和 LZ77 算法改良和优化后的压缩算法。它使用类似于 LZ77 的字典编码机制。
  • LZO:LZO 是块压缩算法,属于 LZ77 压缩方案家族。该算法旨在快速压缩和解压缩。由于块中可能存放多种类型的数据,整体的压缩效果没有针对某一种数据类型进行压缩的算法好。
  • XZ:采用 LZMA2 算法,具有非常高的压缩比,但压缩和解压速度相对较慢。
  • ZSTD(Zstandard):是一种提供高压缩比的快速压缩算法。ZSTD 采用有限状态熵(Finite State Entropy,FSE)编码器,提供非常强大的压缩速度、压缩率的折中方案。

默认情况下,KWDB 采用 GZIP 压缩算法。如需设置其他算法,参见集群实时参数配置

说明

当 mksquashfs 数据压缩工具 或者 mount 挂载工具不支持某种算法时,系统默认采用 GZIP 压缩算法并且以 WARN 日志的形式输出告警信息。

KWDB 软件依赖支持的数据压缩算法

说明

  • mksquashfs、mount 或 squashfuse 必须同时支持某种压缩算法。
  • 采用 Docker 部署 KWDB 时,需要添加 -v /boot:/boot 目录映射,或者复制宿主机 /boot/config-$(uname -r) 文件到 Docker 的 /boot 目录下。然后重启 KWDB。否则,系统仅支持 GZIP 压缩算法。
  • mksquashfs 压缩工具

    mksquashfs 压缩工具支持以下算法:

    版本压缩算法
    4.0 及以下版本GZIP
    4.1GZIP、LZMA、LZO
    4.2GZIP、LZMA、LZO、XZ
    4.3GZIP、LZMA、LZO、XZ、LZ4
    4.4 及以上版本GZIP、LZMA、LZO、XZ、ZSTD
  • mount 挂载工具支持的压缩算法与内核对 squashfs 的压缩算法支持有关。例如,

    • CentOS 7:支持挂载 GZIP、LZO、XZ 压缩的 .sqfs 文件。
    • Ubuntu 20.04/24.04:支持挂载 GZIP、LZO、XZ、LZ4、ZSTD 压缩的 .sqfs 文件。

数据压缩级别

数据的压缩级别与压缩速度和压缩率相关。压缩级别越高,压缩速度越慢,压缩效果越好,压缩后的文件越小。反之,压缩级别越低,压缩速度越快,压缩效果越差,压缩后的文件越大。KWDB 支持通过 ts.compression.level 实时参数配置以下压缩级别:

  • low:低压缩级别,通常情况下,压缩率相对较低,压缩速度快。
  • middle:中压缩级别,通常情况下,兼顾压缩率及压缩速度。
  • high:高压缩级别,通常情况下,压缩率相对较高,压缩速度慢。

下表列出 KWDB 支持的压缩算法与压缩级别之间的关系。

压缩级别压缩算法
GZIPLZOZSTDLZ4XZLZMA
low有效有效有效有效,等同于 middle无效无效
middle有效有效有效有效无效无效
high有效有效有效有效无效无效

数据重组

数据重组是指对原始数据按照一定的规则和逻辑进行清理、排序和整合。数据重组依赖于迭代器排序,通过过滤删除的数据、历史数据的数据类型更新以及排序读取等方法,优化存储空间的利用率,提升数据库的查询速度和响应能力,节省存储成本,提高数据库的访问速度和效率。

在 KWDB 中,数据重组功能默认启用,用户可以通过 ts.auto_vacuum.enabled 实时参数启用或禁用该功能。有关详细信息,参见集群实时参数

系统在执行数据重组前,会先进行重组评估,检查以下内容:

  • 分区内的 segment 版本和数量
  • 分区最后修改时间
  • 分区内是否有数据删除
  • 数据的顺序状态

重组以分区为单位进行。重组开始前,分区会被短暂加锁,设置为不可读写状态,以确定是否需要进行数据重组。

重组开始时,该分区的所有 segment 均会被设置为不可写状态,同时分区解锁,数据读取不受影响。新增数据将被写入新创建的 segment。如果在重组期间发生数据删除或插入,系统会中止该分区的重组,在下次重组任务中重新执行该分区的重组。