系统表第1部分:介绍和最佳实践
作者:叶春春 / 开发者,入门
2024年10月29日
导航到
作为InfluxDB 云专用或集群用户,您可能想检查您的集群以更好地了解您的数据库、表、分区和压缩状态。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
*压缩文件是经过压缩器处理的压缩 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 = ...
5. 使用最有效的过滤器
在上述过滤器中,以下过滤器经过特别优化,可以显著减少查询延迟到约 20 毫秒,即使在我们的最大集群中也是如此
WHERE table_name = '...' AND partition_key = '...'
WHERE table_name = '...' AND partition_id = ...
6. 总结
在这第一篇文章中,我们介绍了系统表,解释了如何访问它们,并讨论了如何使用过滤器优化查询。在下一篇文章中,我们将解释我们如何提高系统表性能。
参考