系统表第 1 部分:简介和最佳实践

导航至

作为 InfluxDB Cloud DedicatedClustered 用户,您可能希望检查您的集群,以便更好地了解数据库、表、分区和压缩状态的大小。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_keypartition_id 的文档。

5. 使用最有效的过滤器

在上述过滤器中,以下过滤器经过专门优化,即使在我们的最大集群上,也能将查询延迟显著降低到约 20 毫秒

WHERE table_name = '...' AND partition_key = '...'
WHERE table_name = '...' AND partition_id = ...

6. 总结

在第一篇文章中,我们介绍了系统表,解释了如何访问它们,并讨论了如何使用过滤器优化您的查询。在下一篇文章中,我们将解释我们如何改进系统表的性能。

参考