分级存储
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 写入数据。 |
冷数据磁盘卷配置项
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/。
分级存储策略
通过函数 moveHotDataToColdVolume 和 setRetentionPolicy 均可以将冷数据转存至 coldVolumes 路径。两者指定的冷数据转存策略的区别如下:
区分点 | moveHotDataToColdVolume | setRetentionPolicy |
---|---|---|
触发方式 | 强制触发一次数据迁移。 | 系统为每个数据库分配固定的检查时间点。当到达每个数据库的检查时间点时,系统会检查库中是否存在需要迁移的数据,若存在,则进行迁移。每天每个数据库仅被检查一次。 |
迁移数据的时间范围 | 迁移数据的范围由参数 checkRange 指定,为 [当前时间 -
hoursToColdVolumes - checkRange, 当前时间 -
hoursToColdVolumes) |
只迁移 10 天的数据,范围为 [当前时间 - hoursToColdVolumes -
10 天, 当前时间 - hoursToColdVolumes) |
在实际场景应用分级存储策略时,建议用户在第一次转存大量历史数据时,先通过
setRetentionPolicy
配置合理的自动转存策略,再通过
moveHotDataToColdVolume
进行批量迁移,最后由系统自动迁移冷数据。
数据压缩
数据压缩与数据保留策略之间存在密切的关系。数据压缩是指通过使用各种算法和技术来减少数据占用的存储空间,有助于降低大规模数据存储的成本、提高数据传输效率和优化硬件资源利用等方面。通过减小数据的体积,可以显著节省存储空间,且提升 I/O 效率。在制定数据保留策略时,需要根据数据完整性、数据存储成本、访问效率等因素综合考虑:
-
哪些数据需要长期、中期、短期保留或不保留
-
哪些数据不需要压缩以确保数据完整性和访问效率
-
哪些数据需要压缩以降低存储成本
-
哪些数据需要提高压缩率以节省更多存储空间
DolphinDB 分布式表支持无损压缩,用户无需额外配置,会对插入的数据默认进行压缩。用户可采取以下措施,进一步提高压缩率:
-
在建表时,通过控制函数
createPartitionedTable
的参数 compressMethods,为不同的数据类型指定不同的压缩方式:-
时间列或数据变化较小的整型列指定 compressMethods 为 delta,即 delta-of-delta encoding。
-
其余列采用默认的 lz4 压缩算法。
-
-
对重复率较高的字符串列,采用 SYMBOL 类型替代 STRING 类型,可以在采用上述压缩算法前先用字典压缩。需要注意,单个分区下 SYMBOL 字段的唯一值数不能超过 221,即 2,097,152 个。
-
若采用 OLAP 存储引擎,尽可能采取批量写入,或通过配置参数 OLAPCacheEngineSize 开启cache engine 。因为 OLAP 存储引擎采用增量压缩策略,每次只对新增数据进行压缩,批量写入有助于提升压缩效果。
数据删除
在某些场景中,数据具有生命周期短、单位时间内产生数据量巨大、存储成本高的特点。在此类场景中,数据的生命周期并不一定包含由热转冷的过程。在热数据使用结束后,处于存储成本等因素考量,失去使用价值的数据不会保留,而是直接删除。
db = database(dbName, VALUE, today()-1..99)
setRetentionPolicy(database(dbName), 20*24)
数据保留策略是为了滚动删除时序数据,删除 [系统当前时间-保留期限-10天,系统当前时间-保留期限-1天] 范围内的数据。如果在数据库中存在早于系统当前时间-保留期限-10天的数据,用户需要手动删除。