系统表第 1 部分:简介和最佳实践
作者:Chunchun Ye / 开发者,入门指南
2024 年 10 月 29 日
导航至
作为 InfluxDB Cloud Dedicated 或 Clustered 用户,您可能希望检查您的集群,以便更好地了解数据库、表、分区和压缩状态的大小。InfluxDB 将这些重要的元数据存储在系统表(第 1 节中描述)中,这有助于为关于集群性能和维护的决策提供信息。
1. 什么是 系统表?
系统表是“虚拟”表,用于呈现特定数据库的元数据,并提供对数据库存储的深入了解。每个系统表的作用域都限定于特定的数据库,并且是只读的,这意味着它不能被修改。
系统表默认情况下是隐藏的,因为对这些表的高频率访问可能会干扰数据库的持续运行。因此,查询系统表需要在请求中包含一个特殊的调试标头。一旦添加了调试标头(在第 2 节中描述),您就可以使用 SQL 查询系统表,类似于 InfluxDB 中的任何其他表。
以下是 InfluxDB 提供的系统表
+---------------+--------------------+-------------+------------+
| table_catalog | table_schema | table_name | table_type |
+---------------+--------------------+-------------+------------+
| ... | ... | ... | ... |
| public | system | compactor | BASE TABLE |
| public | system | partitions | BASE TABLE |
| public | system | queries | BASE TABLE |
| public | system | tables | BASE TABLE |
| ... | ... | ... | ... |
+---------------+--------------------+-------------+------------+
在本博客中,我们将重点介绍三个表
system.tables
system.partitions
system.compactor
表 | 描述 | 架构 |
system.tables |
包含关于表的信息,例如表名和特定数据库中的分区模板。 | 链接 |
system.partitions |
包含关于分区的信息,例如分区大小、文件计数等。 | 链接 |
system.compactor |
包含关于不同压缩级别的已压缩分区的详细信息。 | 链接 |
警告: 系统表不是 InfluxDB 稳定 API 的一部分。它们可能会发生更改,并且不保证兼容性。
警告: 查询系统表可能会影响写入和查询性能。仅将其用于调试目的,并使用过滤器来优化查询并最大限度地减少其对集群的影响。
2. 访问系统表
要访问系统表,您必须在请求中提供一个调试标头。添加此标头的具体命令因您使用的客户端而异。
influxctl CLI
对于 influxctl
,设置 --enable-system-tables
标头
influxctl query \
--enable-system-tables \
--database DATABASE_NAME \
--token DATABASE_TOKEN \
"SQL_QUERY"
Arrow Flight SQL 或其他客户端库
对于 Arrow Flight SQL 或 其他客户端库(例如 Go 和 Python),将 iox-debug
标头设置为 true
。
3. 查询系统表:示例
1. 查看特定表的分区模板
SELECT * FROM system.tables WHERE table_name = 'TABLE_NAME'
示例结果
+-----------------+--------------------------------------------------------+
| table_name | partition_template |
+-----------------+--------------------------------------------------------+
| your_table_name | {"parts":[{"timeFormat":"%Y-%m"},{"tagValue":"col1"}]} |
+-----------------+--------------------------------------------------------+
如果表在此命令的输出中不包含分区模板,则该表使用默认的(1 天)分区策略,并且不按标签分区。
2. 查看每个表的分区数和总大小
SELECT
table_name,
COUNT(*) AS partition_count,
SUM(total_size_mb) AS total_size_mb
FROM system.partitions
WHERE table_name IN ('foo', 'bar', 'baz')
GROUP BY table_name
示例结果
+------------+-----------------+---------------+
| table_name | partition_count | total_size_mb |
+------------+-----------------+---------------+
| foo | 1 | 2 |
| bar | 4 | 5 |
| baz | 10 | 23 |
+------------+-----------------+---------------+
3. 查看不同级别压缩文件的大小*
SELECT
table_name,
SUM(total_l0_files) AS l0_files,
SUM(total_l1_files) AS l1_files,
SUM(total_l2_files) AS l2_files,
SUM(total_l0_bytes) AS l0_bytes,
SUM(total_l1_bytes) AS l1_bytes,
SUM(total_l2_bytes) AS l2_bytes
FROM system.compactor
WHERE table_name IN ('foo', 'bar', 'baz')
GROUP BY table_name
*压缩文件是由 Compactor 处理的压缩 Parquet 文件,用于优化存储。这些文件具有不同的压缩级别:L0、L1 和 L2。L0 或“级别 0”表示新摄取的、未压缩的小文件,而 L2 或“级别 2”表示已压缩的、非重叠的文件。
示例结果
+------------+----------+----------+----------+----------+----------+----------+
| table_name | l0_files | l1_files | l2_files | l0_bytes | l1_bytes | l2_bytes |
+------------+----------+----------+----------+----------+----------+----------+
| foo | 0 | 1 | 0 | 0 | 20659 | 0 |
| bar | 0 | 1 | 0 | 0 | 7215 | 0 |
| baz | 0 | 1 | 0 | 0 | 10784 | 0 |
+------------+----------+----------+----------+----------+----------+----------+
4. 优化查询以减少集群影响
查询系统表可能会降低其他常见查询的性能,特别是当您尝试查看包含数百个表、数十万个分区和数百万个 Parquet 文件的集群中的每个细节时。
为了减少性能影响,我们建议通过添加如下过滤器来选择特定表或特定分区的信息
WHERE table_name = '...'
WHERE table_name = '...' AND partition_key = '...'
WHERE table_name = '...' AND partition_id = ...
WHERE partition_id = ...
请参阅关于如何获取 partition_key 和 partition_id 的文档。
5. 使用最有效的过滤器
在上述过滤器中,以下过滤器经过专门优化,即使在我们的最大集群上,也能将查询延迟显著降低到约 20 毫秒
WHERE table_name = '...' AND partition_key = '...'
WHERE table_name = '...' AND partition_id = ...
6. 总结
在第一篇文章中,我们介绍了系统表,解释了如何访问它们,并讨论了如何使用过滤器优化您的查询。在下一篇文章中,我们将解释我们如何改进系统表的性能。
参考