Data Cache
自 StarRocks v3.1.7 和 v3.2.3 版本起,StarRocks 引入 Data Cache 功能用以加速存算分离集群中的查询。该功能将取代早期版本中的 File Cache 功能。Data Cache 以 Block(MB 级别)为单位,按需从远端存储中加载数据。相较之下,File Cache 无论查询需要读取多少数据,都需要在后台线程加载整个数据文件。
相比 File Cache,Data Cache 具有以下优势:
- 可以减少对对象存储的读取,从而降低访问对象存储的成本(假设对象存储服务按访问频率收费)。
- 无需后台加载线程,可以降低对本地磁盘的写入压力和 CPU 使用率,从而减少对其他写入或查询任务的影响。
- 可以优化有效缓存率(因为 File Cache 会加载文件中不常用的数据)。
- 提供更精确的缓存控制能力,避免了 File Cache 淘汰缓存不及时导致磁盘被写满的状况。
启用 Data Cache
自 v3.2.3 版本起,StarRocks 默认启用 Data Cache。如果您需要在 v3.1 版本集群中使用 Data Cache,或此前曾手动禁用了此功能,需执行以下流程启用 Data Cache。
执行以下语句在集群运行时动态启用 Data Cache:
UPDATE information_schema.be_configs SET VALUE = 1
WHERE name = "starlet_use_star_cache";
动态配置将在 CN 节点重新启动后失效。
如需永久启用 Data Cache,需要将以下配置添加到 CN 配置文件 cn.conf 中,并重新启动 CN 节点:
starlet_use_star_cache = true
配置 Data Cache
您可以通过以下 CN(BE)配置项配置 Data Cache:
- storage_root_path(在存算分离集群中,此项用于指定用于缓存数据的根路径。)
- starlet_use_star_cache
- starlet_star_cache_disk_size_percent
如果您在升级至 v3.1.7、v3.2.3 或更高版本之前启用了 File Cache,则需要检查是否修改了配置项 starlet_cache_evict_high_water
。该项的默认值为 0.2
,表示 File Cache 将使用 80% 的存储空间来缓存数据文件。如果您曾修改过此项,您必须在升级时针对 starlet_star_cache_disk_size_percent
做相应配置。假设您之前将 starlet_cache_evict_high_water
设置为 0.3
,在升级 StarRocks 集群时,您需要将 starlet_star_cache_disk_size_percent
设置为 70
,以确保 Data Cache 使用的磁盘容量上限与 File Cache 相同。
查看 Data Cache 状态
-
执行以下语句查看是否已启用 Data Cache:
SELECT * FROM information_schema.be_configs
WHERE NAME LIKE "%starlet_use_star_cache%"; -
执行以下语句查看存储缓存数据的根路径:
SELECT * FROM information_schema.be_configs
WHERE NAME LIKE "%storage_root_path%";缓存数据存储在
storage_root_path
的子路径starlet_cache/star_cache
下。 -
执行以下语句以查看 Data Cache 的磁盘使用上限:
SELECT * FROM information_schema.be_configs
WHERE NAME LIKE "%starlet_star_cache_disk_size_percent%";
监控 Data Cache
StarRocks 提供了多种监控 Data Cache 的指标。
Dashboard 模板
您可以根据您的 StarRocks 环境下载以下 Grafana Dashboard 模板:
有关为 StarRocks 部署监控和警报服务的更多说明,请参考 监控报警。
重要指标
fslib read io_latency
Data Cache 的读延迟。
fslib write io_latency
Data Cache 的写延迟。
fslib star cache meta memory size
Data Cache 的预估内存使用量。
fslib star cache data disk size
Data Cache 的实际磁盘占用。
禁用 Data Cache
执行以下语句在集群运 行时动态禁用 Data Cache:
UPDATE information_schema.be_configs SET VALUE = 0
WHERE name = "starlet_use_star_cache";
动态配置将在 CN 节点重新启动后失效。
如需永久禁用 Data Cache,需要将以下配置添加到 CN 配置文件 cn.conf 中,并重新启动 CN 节点:
starlet_use_star_cache = false
清除缓存数据
在紧急情况下,您可以清除缓存数据。此举不会影响远程存储中的原始数据。
按照以下步骤清除 CN 节点上的缓存数据:
-
删除存储缓存数据的子目录,即
${storage_root_path}/starlet_cache
。示例:
# 假设 `storage_root_path = /data/disk1;/data/disk2`
rm -rf /data/disk1/starlet_cache/
rm -rf /data/disk2/starlet_cache/ -
重启 CN 节点。
使用说明
- 如果云原生表的
datacache.enable
属性设置为false
,则不会为该表启用 Data Cache。 - 如果云原生表的
datacache.partition_duration
属性设置为一个特定的时间范围,则超出该时间范围的数据将不会被缓存。 - 从 v3.3 版本降级到 v3.2.8 及其之前版本时,如需复用先前缓存数据,需要手动修改 starlet_cache 目录下 Blockfile 文件名,将文件名格式从
blockfile_{n}.{version}
改为blockfile_{n}
,即去掉版本后缀。v3.2.9 及以后版本自动兼容 v3.3 文件名格式,无需手动执行该操作。您可使用以下脚本进行批量修改:
#!/bin/bash
# 将 <starlet_cache_path> 替换为集群的 Data Cache 目录,例如 /usr/be/storage/starlet_cache
starlet_cache_path="<starlet_cache_path>"
for blockfile in ${starlet_cache_path}/blockfile_*; do
if [ -f "$blockfile" ]; then
new_blockfile=$(echo "$blockfile" | cut -d'.' -f1)
mv "$blockfile" "$new_blockfile"
fi
done
已知问题
内存占用过高
- 现象:当集群在低负载条件下运行时,CN 节点的总内存使用量远远超过每个模块内存使用量的总和。
- 识别:如果
fslib star cache meta memory size
和fslib star cache data memory size
的总和占据了 CN 节点总内存使用量中的较大比例,可能表明存在此问题。 - 影响版本:v3.1.8 及以下小版本,v3.2.3 及以下小版本
- 修复版本:v3.1.9、v3.2.4
- 解决方案:
- 将集群升级到已修复版本。
- 如果您不想升级集群,可以清除 CN 节点的
${storage_root_path}/starlet_cache/star_cache/meta
目录,并重新启动节点。