Documentation

查询系统数据

InfluxDB 集群存储与查询、表、分区和压缩相关的数据在集群内的系统表中。系统表包含由 InfluxDB 集群内部监控系统使用和生成的时间序列数据。您可以查询集群系统表以获取有关您集群的信息。

可能会影响集群性能

查询 InfluxDB 3 系统表可能会影响您的 InfluxDB 集群的写入和查询性能。使用过滤器以 优化查询以减少对集群的影响

系统表可能会发生变化

系统表不是InfluxDB稳定API的一部分,可能会随着新版本的发布而改变。 提供的架构信息和查询示例在2024年9月18日有效。 如果您发现架构变化或查询示例不能正常工作,请 提交问题

查询系统表

使用 influxctl 查询系统表需要 influxctl v2.8.0 或更新版本

使用influxctl query命令和SQL查询系统表。提供以下内容:

  • 启用系统表 使用 --enable-system-tables 命令标志。

  • 数据库令牌: 一个数据库令牌 在指定数据库上具有读取权限。使用来自 influxctl 连接配置文件--token命令标志的token设置。

  • 数据库名称: 查询有关信息的数据库名称。 使用来自influxctl连接配置文件database设置或--database命令标志。

  • SQL查询: 要执行的SQL查询。

    以以下任一种方式传递查询:

    • a string on the command line
    • a path to a file that contains the query
    • a single dash (-) to read the query from stdin
influxctl query \
  --enable-system-tables \
  --database 
DATABASE_NAME
\
--token
DATABASE_TOKEN
\
"
SQL_QUERY
"
influxctl query \
  --enable-system-tables \
  --database 
DATABASE_NAME
\
--token
DATABASE_TOKEN
\
/path/to/query.sql
cat ./query.sql | influxctl query \
  --enable-system-tables \
  --database 
DATABASE_NAME
\
--token
DATABASE_TOKEN
\
-

替换以下内容:

  • DATABASE_TOKEN: 具有对指定数据库的读取访问权限的数据库令牌
  • DATABASE_NAME: 查询信息的数据库名称。
  • SQL_QUERY: 要执行的SQL查询。有关示例,请参见 系统查询示例

当被提示时,输入 y 以确认查询系统表可能对您的集群造成的潜在影响。

优化查询以减少对你的集群的影响

查询 InfluxDB 3 系统表可能会影响你的 InfluxDB 集群的性能。 当你向集群写入数据时,分区和 Parquet 文件的数量可能会增加到影响系统表性能的程度。 在文件和分区较少时只需毫秒的查询可能在文件和分区增加时需要 10 秒或更长时间。

使用以下过滤器来优化您的系统表查询并减少对集群性能的影响。

在你的查询中,替换以下内容:

  • TABLE_NAME: 需要检索分区的表
  • PARTITION_ID: 一个分区 ID (int64)
  • PARTITION_KEY: 一个 分区键 来源于表的分区模板。默认格式为 %Y-%m-%d (例如, 2024-01-01)。
按表名过滤

查询 system.tablessystem.partitionssystem.compactor 表时,使用 WHERE 子句按 table_name 进行过滤。

SELECT * FROM system.partitions WHERE table_name = '
TABLE_NAME
'
按分区键过滤

查询 system.partitionssystem.compactor 表时,请使用 WHERE 子句通过 partition_key 进行筛选。

SELECT * FROM system.partitions WHERE partition_key = '
PARTITION_KEY
'

为了进一步提高性能,使用 ANDpartition_keytable_name 配对——例如:

SELECT * 
FROM system.partitions 
WHERE
  table_name = '
TABLE_NAME
'
AND partition_key = '
PARTITION_KEY
'
;
SELECT * 
FROM system.compactor
WHERE
  table_name = '
TABLE_NAME
'
AND partition_key = '
PARTITION_KEY
'
;
按分区 ID 过滤

查询 system.partitionssystem.compactor 表时,使用 WHERE 子句来按 partition_id 进行过滤。

SELECT * FROM system.partitions WHERE partition_id = 
PARTITION_ID

对于最优化的方法,使用 ANDpartition_idtable_name 配对——例如:

SELECT * 
FROM system.partitions 
WHERE
  table_name = '
TABLE_NAME
'
AND partition_id =
PARTITION_ID
;

虽然你不需要将 partition_idtable_name 配对(因为分区 ID 在一个集群内是唯一的), 但这是最优化的方法,特别是当你在一个数据库中有许多表时

检索分区 ID

要获取分区 ID,请查询 system.partitionstable_namepartition_key 对,例如:

SELECT
  table_name,
  partition_key,
  partition_id 
FROM system.partitions
WHERE
  table_name = '
TABLE_NAME
'
AND partition_key = '
PARTITION_KEY
'
;

结果包含 partition_id

表名分区键分区ID
天气43 | 2020-05-271362
组合过滤器以提高性能

使用 ANDORIN 关键字在你的查询中组合过滤器。

  • 在同一列中过滤不同值时使用 ORIN 条件–例如:

    WHERE partition_id = 1 OR partition_id = 2
    

    使用 IN 来使多个 OR 条件更易读——例如:

    WHERE table_name IN ('foo', 'bar', 'baz')
    
  • 避免在 OR 条件中混合不同的列,因为这不会提高性能——例如:

    WHERE table_name = 'foo' OR partition_id = 2  -- This will not improve performance
    

系统表

系统表 可能会更改

了解系统表数据分布

system.tablessystem.partitionssystem.compactor 中的数据包括您集群中所有 InfluxDB Queriers 的数据。数据来自目录,由于所有查询器共享一个目录,因此这三个表的结果源于相同的数据, 无论您连接的是哪个查询器。

然而,system.queries 表是不同的——数据是本地于每个查询者的。system.queries 包含一个非持久化的查询日志,用于记录当前路由到您的查询的查询。查询日志特定于当前查询者,并且不会在您的集群中的查询者之间共享。日志的范围限定于指定的数据库。

系统.查询

system.queries 表存储在 当前处理查询 的节点上执行的针对提供的命名空间(数据库)的查询日志条目。system.queries 反映了一个进程本地的、内存中的、按照命名空间范围的查询日志。

虽然这个表对于调试和监控查询可能很有用,但请记住以下几点:

  • 存储在 system.queries 中的记录是短暂的和易变的
    • InfluxDB 在 pod 重启期间删除 system.queries 记录。
    • 一个命名空间的查询可以驱逐另一个命名空间的记录。
  • 数据反映了特定 pod 在命名空间中回答查询的状态。
    • 数据不会在您集群中的查询者之间共享。
    • 针对 system.queries 中记录的查询可能会返回不同的结果,具体取决于请求被路由到的 pod。

查看 system.queries 架构

当列出命名空间中可用的测量(表)时,一些客户端和查询工具可能会将 queries 表包含在命名空间表的列表中。

系统.表

system.tables 表包含关于指定数据库中表的信息。

查看 system.tables 模式

系统.分区

system.partitions 包含与指定数据库相关的分区信息。

查看 system.partitions 模式

系统.压缩器

system.compactor 表包含与指定数据库相关联的压缩分区 Parquet 文件的信息。

查看 system.compactor 架构

系统查询示例

可能会影响集群性能

查询 InfluxDB 的 3 个系统表可能会影响您 InfluxDB 集群的写入和查询性能。

本节中的示例包括 WHERE 过滤器,以 优化查询并减少对您的集群的影响

在下面的示例中,将 TABLE_NAME 替换为您想要查询信息的表的名称。


查询日志

查看所有存储的查询日志

SELECT * FROM system.queries

查看端到端持续时间超过阈值的查询日志

以下内容返回端到端持续时间超过50毫秒的查询日志。

SELECT *
FROM
  system.queries
WHERE
  end2end_duration::BIGINT > (50 * 1000000)

查看特定查询在时间区间内的查询日志

SELECT *
FROM system.queries
WHERE issue_time >= now() - INTERVAL '1 day'
  AND query_text LIKE '%select * from home%'
from influxdb_client_3 import InfluxDBClient3
client = InfluxDBClient3(token = DATABASE_TOKEN,
                          host = HOSTNAME,
                          org = '',
                          database=DATABASE_NAME)
client.query('select * from home')
reader = client.query('''
                      SELECT *
                      FROM system.queries
                      WHERE issue_time >= now() - INTERVAL '1 day'
                      AND query_text LIKE '%select * from home%'
                      ''',
                    language='sql',
                    headers=[(b"iox-debug", b"true")],
                    mode="reader")

分区

查看特定表的分区模板

SELECT *
FROM
  system.tables
WHERE
  table_name = '
TABLE_NAME
'

查看表的所有分区

SELECT *
FROM
  system.partitions
WHERE
  table_name = '
TABLE_NAME
'

查看每个表的分区数量

SELECT
  table_name,
  COUNT(*) AS partition_count
FROM
  system.partitions
WHERE
  table_name IN ('foo', 'bar', 'baz')
GROUP BY
  table_name

查看特定表的分区数量

SELECT
  COUNT(*) AS partition_count
FROM
  system.partitions
WHERE
  table_name = '
TABLE_NAME
'

存储使用情况

查看特定表的大小(以兆字节为单位)

SELECT
  SUM(total_size_mb) AS total_size_mb
FROM
  system.partitions
WHERE
  table_name = '
TABLE_NAME
'

查看每个表的大小(以兆字节为单位)

SELECT
  table_name,
  SUM(total_size_mb) AS total_size_mb
FROM
  system.partitions
WHERE
  table_name IN ('foo', 'bar', 'baz')
GROUP BY
  table_name

查看每个表压缩分区的总大小(以字节为单位)

SELECT
  table_name,
  SUM(total_l0_bytes) + SUM(total_l1_bytes) + SUM(total_l2_bytes) AS total_bytes
FROM
  system.compactor
WHERE
  table_name IN ('foo', 'bar', 'baz')
GROUP BY
  table_name

查看特定表的压缩分区总大小(以字节为单位)

SELECT
  SUM(total_l0_bytes) + SUM(total_l1_bytes) + SUM(total_l2_bytes) AS total_bytes
FROM
  system.compactor
WHERE
  table_name = '
TABLE_NAME
'

压缩

查看每个表的压缩总数

SELECT
  table_name,
  SUM(total_l0_files) AS total_l0_files,
  SUM(total_l1_files) AS total_l1_files,
  SUM(total_l2_files) AS total_l2_files,
  SUM(total_l0_bytes) AS total_l0_bytes,
  SUM(total_l1_bytes) AS total_l1_bytes,
  SUM(total_l2_bytes) AS total_l2_bytes
FROM
  system.compactor
WHERE
  table_name IN ('foo', 'bar', 'baz')
GROUP BY
  table_name

查看特定表的压缩总计

SELECT
  SUM(total_l0_files) AS total_l0_files,
  SUM(total_l1_files) AS total_l1_files,
  SUM(total_l2_files) AS total_l2_files,
  SUM(total_l0_bytes) AS total_l0_bytes,
  SUM(total_l1_bytes) AS total_l1_bytes,
  SUM(total_l2_bytes) AS total_l2_bytes
FROM
  system.compactor
WHERE
  table_name = '
TABLE_NAME
'


Flux的未来

Flux 正在进入维护模式。您可以像现在一样继续使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

InfluxDB 3 核心,是我们新的开源产品。 它是一个用于时间序列和事件数据的实时数据引擎。 InfluxDB 3 企业版是建立在核心基础之上的商业版本,增加了历史查询能力、读取副本、高可用性、可扩展性和细粒度安全性。

有关如何开始的更多信息,请查看: