存算分离
本主题解答了一些关于存算分离集群的常见问题。
为什么表创建失败?
检查 BE 日志 (be.INFO) 以确定具体原因。常见原因包括:
- 对象存储设置错误(例如,
aws_s3_path、endpoint、authentication)。 - 对象存储服务不稳定或异常。
其他错误:
错误信息:"Error 1064 (HY000): Unexpected exception: Failed to create shards. INVALID_ARGUMENT: shard info cannot be empty"
原因:这通常发生在使用自动桶推断时,没有 CN 或 BE 节点存活。此问题在 v3.2 中已修复。
为什么表创建时间过长?
过多的桶数量(尤其是在分区表中)导致 StarRocks 创建许多 tablets。系统需要为对象存储中的每个 tablet 写入一个 tablet 元数据文件,其高延迟可能会显著增加总创建时间。您可以考虑:
- 减少桶的数量。
- 通过 BE 配置
create_tablet_worker_count增加 tablet 创建线程池大小。 - 检查并解决对象存储中的高写入延迟问题。
为什么删除表后对象存储中的数据没有被清理?
StarRocks 支持两种 DROP TABLE 模式:
DROP TABLE xxx:将表元数据移动到 FE 回收站(数据未删除)。DROP TABLE xxx FORCE:立即删除表元数据和数据。
如果清理失败,请检查:
- 是否使用了
DROP TABLE xxx FORCE。 - 回收站保留参数是否设置过高。参数包括:
- FE 配置
catalog_trash_expire_second - BE 配置
trash_file_expire_time_sec
- FE 配置
- FE 日志中的删除错误(例如,RPC 超时)。如有需要,增加 RPC 超时时间。
如何找到对象存储中表数据的存储路径?
运行以下命令以获取存储路径。
SHOW PROC '/dbs/<database_name>';
示例:
mysql> SHOW PROC '/dbs/load_benchmark';
+---------+-------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+--------------------------------------------------------------------------------------------------------------+
| TableId | TableName | IndexNum | PartitionColumnName | PartitionNum | State | Type | LastConsistencyCheckTime | ReplicaCount | PartitionType | StoragePath |
+---------+-------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+--------------------------------------------------------------------------------------------------------------+
| 17152 | store_sales | 1 | NULL | 1 | NORMAL | CLOUD_NATIVE | NULL | 64 | UNPARTITIONED | s3://starrocks-common/xxxxxxxxx-xxxx_load_benchmark-1699408425544/5ce4ee2c-98ba-470c-afb3-8d0bf4795e48/17152 |
+---------+-------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.18 sec)
在 v3.1.4 之前的版本中,表数据分散在单个目录下。
从 v3.1.4 开始,数据按分区组织。相同命令显示表的根路径,现在包含以分区 ID 命名的子目录,每个分区目录包含 data/(segment 数据文件)和 meta/(tablet 元数据文件)子目录。
为什么在存算分离集群中的查询速度慢?
常见原因包括:
- 缓存未命中。
- 缺乏足够的 Compaction,导致过多的小 segment 文件,从而导致过多的 I/O。
- 并行度不佳(例如,tablet 数量过少)。
- 不当的
datacache.partition_duration设置,导致缓存失败。
您需要首先分析 Query Profile 以确定根本原因。
缓存未命中
在存算分离集群中,数据存储在远程,因此 Data Cache 至关重要。如果查询速度意外变慢,请检查 Query Profile 指标,如 CompressedBytesReadRemote 和 IOTimeRemote。
缓存未命中可能由以下原因导致:
- 在表创建时禁用了 Data Cache。
- 本地缓存空间不足。
- 由于弹性扩展导致的 tablet 迁移。
- 不当的
datacache.partition_duration设置导致无法缓存。
缺乏足够的 Compaction
如果没有足够的 Compaction,许多历史数据版本会保留,增加查询时访问的 segment 文件数量。这会增加 I/O 并减慢查询速度。
您可以通过以下方式诊断 Compaction 不足:
-
检查相关分区的 Compaction Score。
Compaction Score 应保持在 ~10 以下。过高的 Compaction Score 通常表示 Compaction 失败。
-
查看 Query Profile 指标,如
SegmentsReadCount。如果 Segment 数量很高,可能是 Compaction 滞后或卡住。
不当的 tablet 设置
Tablets 将数据分布在计算节点上。糟糕的分桶或不均衡的桶键可能导致查询仅在部分节点上运行。
建议:
- 选择能确保均衡分布的桶列。
- 设置合理的桶数量(公式:
total data size / (1–5 GB))。
不当的 datacache.partition_duration 设置
如果此值设置得过小,“冷”分区的数据可能无法缓存,导致重复的远程读取。在 Query Profile 中,如果 CompressedBytesReadRemote 或 IOCountRemote 非零,这可能是原因。相应调整 datacache.partition_duration。