分级存储

DolphinDB 的数据保留策略

数据库中数据的存活时间TTL(Time to Live)通常用于定义数据记录的有效期限。一旦发现数据的存活时间超过了TTL,数据库系统将认定此记录过期,并将其删除。

DolphinDB 的数据保留策略以数据库的分区为单位,即数据库下所有表都遵循相同的数据保留策略,且要求分区方案必须包含 DATE 类型或 DATEHOUR 类型。

用户可以通过 setRetentionPolicy对数据库设置数据保存时间 retentionHours,这样数据库会根据当前系统的机器时间,保留数据时间戳为最近 retentionHours 小时的数据,删除 [系统当前时间-保留期限-10天,系统当前时间-保留期限-1天] 范围内的数据。 retentionHours 的单位是小时,且必须是分区精度的倍数。例如,按天分区的数据库,保存时间的必须设置为24的整数倍。

注意:数据保留策略比较的是系统的机器时间与数据分区字段的时间,而非数据写入的时间。

DolphinDB 的分级存储策略

DolphinDB 自 2.00.6 版本引入了分级存储策略(仅适用于集群模式),即将一部分较旧的数据转存至本地其他磁盘卷(通常是更低速的磁盘卷)或云端(例如,s3)。较旧的数据(冷数据)通常不会被用户频繁查询或计算,但是存储在本地会占用大量磁盘资源,因此将不常用的数据存储在云端,或将其从高速磁盘(例如,SSD)转存至较低速的磁盘(例如,HDD),可以有效节约资源开销。该策略可概括为以下业务逻辑流程:

热数据(volumes)→ 冷数据(coldVolumes)→ 过期数据(删除)

热数据磁盘卷配置项

DolphinDB 的热数据存储路径取决于以下 volumes 相关的配置参数:

配置参数 解释
volumes=
/hdd/hdd1/volumes/<ALIAS>,
/hdd/hdd2/volumes/<ALIAS>,
/hdd/hdd3/volumes/<ALIAS>,
/hdd/hdd4/volumes/<ALIAS>
数据文件目录。如果没有指定,单节点模式下,默认目录是 <HomeDir>/storage。集群模式下,默认目录是<HomeDir>/<nodeAlias>/storage。
allowVolumeCreation=true 布尔值,当 volumes 指定的路径不存在时,是否允许自动创建该路径。默认值为 true,表示允许自动创建。若配置为 false,当 volumes 指定的路径不存在时,系统会自动退出,同时输出错误日志到 log 文件。
volumeUsageThreshold=0.97 浮点数,范围为(0, 1],默认值为 0.97。设置数据节点上磁盘卷的使用率阈值,仅适用于控制节点。当一个数据节点指定的磁盘卷的总使用率达到该值时,该节点将无法新增 chunk,但仍可继续向已存在的 chunk 写入数据。
用户可以根据数据量选择配置一或多个磁盘卷的路径于配置参数 volumes,并且可以根据实际磁盘卷利用情况,通过配置参数 volumeUsageThreshold 在控制节点上调节数据节点磁盘卷的使用率阈值。

冷数据磁盘卷配置项

S3 相关配置项
coldVolumes = file://home/mypath/hdd, s3://bucket1/data

存储冷数据的文件目录。可指定多个路径,路径间用逗号隔开。该参数支持配置为本地路径或者 s3 路径。请注意:

  • Linux 系统下本地路径需以标识符 "file://" 开头

  • Windows 系统下本地路径(假设在 D 盘)以标识符 "file:/D:/" 开头

  • S3 路径需以 "s3://" 开头,其格式为 "s3://{BucketName}/{s3path}",其中 "s3path" 不可为空

注:
  • 不同数据节点需要配置不同的 coldVolumes 路径,可通过宏定义实现,如:coldVolumes=s3://bucket/ddb/<ALIAS>

  • 若配置项中包含 s3 路径,则需要在配置文件同步增加 s3 的相关配置。

  • 需要确保配置的 s3 路径下无其他数据文件。

  • 存储在 s3 的分区权限为 READ_ONLY(只读)。

//插件配置
pluginDir=plugins
preloadModules=plugins::awss3

//s3相关配置
s3AccessKeyId
s3SecretAccessKey
s3Region

关于如何搭建 AWS s3 云存储服务器,参考: https://aws.amazon.com/cn/getting-started/guides/setup-environment/

分级存储策略

通过函数 moveHotDataToColdVolumesetRetentionPolicy 均可以将冷数据转存至 coldVolumes 路径。两者指定的冷数据转存策略的区别如下:

区分点 moveHotDataToColdVolume setRetentionPolicy
触发方式 强制触发一次数据迁移。 系统为每个数据库分配固定的检查时间点。当到达每个数据库的检查时间点时,系统会检查库中是否存在需要迁移的数据,若存在,则进行迁移。每天每个数据库仅被检查一次。
迁移数据的时间范围 迁移数据的范围由参数 checkRange 指定,为 [当前时间 - hoursToColdVolumes - checkRange, 当前时间 - hoursToColdVolumes) 只迁移 10 天的数据,范围为 [当前时间 - hoursToColdVolumes - 10 天, 当前时间 - hoursToColdVolumes)

在实际场景应用分级存储策略时,建议用户在第一次转存大量历史数据时,先通过 setRetentionPolicy 配置合理的自动转存策略,再通过 moveHotDataToColdVolume 进行批量迁移,最后由系统自动迁移冷数据。

数据压缩

数据压缩与数据保留策略之间存在密切的关系。数据压缩是指通过使用各种算法和技术来减少数据占用的存储空间,有助于降低大规模数据存储的成本、提高数据传输效率和优化硬件资源利用等方面。通过减小数据的体积,可以显著节省存储空间,且提升 I/O 效率。在制定数据保留策略时,需要根据数据完整性、数据存储成本、访问效率等因素综合考虑:

  • 哪些数据需要长期、中期、短期保留或不保留

  • 哪些数据不需要压缩以确保数据完整性和访问效率

  • 哪些数据需要压缩以降低存储成本

  • 哪些数据需要提高压缩率以节省更多存储空间

DolphinDB 分布式表支持无损压缩,用户无需额外配置,会对插入的数据默认进行压缩。用户可采取以下措施,进一步提高压缩率:

  • 在建表时,通过控制函数 createPartitionedTable 的参数 compressMethods,为不同的数据类型指定不同的压缩方式:

    • 时间列或数据变化较小的整型列指定 compressMethodsdelta,即 delta-of-delta encoding。

    • 其余列采用默认的 lz4 压缩算法。

  • 对重复率较高的字符串列,采用 SYMBOL 类型替代 STRING 类型,可以在采用上述压缩算法前先用字典压缩。需要注意,单个分区下 SYMBOL 字段的唯一值数不能超过 221,即 2,097,152 个。

  • 若采用 OLAP 存储引擎,尽可能采取批量写入,或通过配置参数 OLAPCacheEngineSize 开启cache engine 。因为 OLAP 存储引擎采用增量压缩策略,每次只对新增数据进行压缩,批量写入有助于提升压缩效果。

数据删除

在某些场景中,数据具有生命周期短、单位时间内产生数据量巨大、存储成本高的特点。在此类场景中,数据的生命周期并不一定包含由热转冷的过程。在热数据使用结束后,处于存储成本等因素考量,失去使用价值的数据不会保留,而是直接删除。

针对这种场景,可以直接通过setRetentionPolicy设置数据保留时间,实际使用中可参考以下代码进行调整,以下代码为一个按天分区的数据库设置数据保留时间为20天。
db = database(dbName, VALUE, today()-1..99)

setRetentionPolicy(database(dbName), 20*24)

数据保留策略是为了滚动删除时序数据,删除 [系统当前时间-保留期限-10天,系统当前时间-保留期限-1天] 范围内的数据。如果在数据库中存在早于系统当前时间-保留期限-10天的数据,用户需要手动删除。