InfluxDB 1.4 现已发布:InfluxQL 增强功能、Prometheus 读/写、更优的压缩以及更多!
作者:Ryan Betts / 产品, 开发者
2017 年 11 月 14 日
导航至
InfluxDB 1.4 的新功能
我们宣布推出开源 InfluxDB 1.4 的新版本。与之前的版本不同,此版本没有对应的 InfluxDB 企业版。此处描述的所有功能和更改均在开源 InfluxDB 中提供。这篇博文主要由 InfluxDB 平台团队和社区成员编写的 pull request 和功能描述汇编而成。谢谢!
InfluxQL 增强功能
InfluxDB 1.4 包含新的 InfluxQL 功能,可更轻松地探索元数据并了解查询执行。我们添加了 SHOW CARDINALITY
查询,以更轻松地查询序列基数。
SHOW CARDINALITY
命令有两种类型:估计值和精确值。估计值使用草图计算,是所有基数大小的安全默认值。EXACT
变体直接从 TSM 数据计数,对于高基数数据,运行成本很高。我们建议首选估计值。我们还开始向元查询添加谓词支持(WHERE
子句支持)。但是,目前仅 TSI 支持按time
过滤。在开发 1.5 版本时,我们将继续改进这些功能。
SHOW MEASUREMENT CARDINALITY — estimates the cardinality of the measurement set for the current database. SHOW MEASUREMENT CARDINALITY ON db0 — estimates the cardinality of the measurement set on the provided database. Note: SHOW MEASUREMENT CARDINALITY also supports GROUP BY tag and WHERE tag. However when using these options on the query, then the query falls back to an exact count. SHOW SERIES CARDINALITY — estimates the cardinality of the measurement set for the current database. SHOW SERIES CARDINALITY ON db0 — estimates the cardinality of the measurement set on the provided database. Note: SHOW SERIES CARDINALITY also supports FROM measurement, GROUP BY tag WHERE tag etc. However when using these options on the query, then the query falls back to an exact count. SHOW MEASUREMENT EXACT CARDINALITY — counts exactly the number of measurements on the current database. SHOW SERIES EXACT CARDINALITY — counts exactly the number of series exactly on the current database. SHOW TAG KEY CARDINALITY — estimates the number of tag keys on the current database. Note: this is currently implemented as an exact count. SHOW TAG VALUES CARDINALITY WITH KEY = "X" — estimates the number of tag values for the provide tag key, on the current database. Note: this is currently implemented as an exact count. SHOW TAG KEY EXACT CARDINALITY — counts exactly the number of tag keys on the current database. SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "X" — counts exactly the number of tag values for the provide tag key, on the current database.
我们还添加了对 EXPLAIN
和 EXPLAIN ANALYZE
的支持,以帮助了解查询成本。EXPLAIN
解析和计划查询,然后打印估计成本的摘要。许多 SQL 引擎使用 EXPLAIN
来显示连接顺序、连接算法以及谓词和表达式下推。InfluxQL 不支持连接。相反,InfluxQL 中查询的成本通常是访问的总序列数、对 TSM 文件的迭代器访问次数以及需要扫描的 TSM 块数的函数。因此,这些是 InfluxQL EXPLAIN
的元素
> explain select sum(pointReq) from "_internal"."monitor"."write" group by hostname; QUERY PLAN ------ EXPRESSION: sum(pointReq::integer) NUMBER OF SHARDS: 2 NUMBER OF SERIES: 2 CACHED VALUES: 110 NUMBER OF FILES: 1 NUMBER OF BLOCKS: 1 SIZE OF BLOCKS: 931
运行 EXPLAIN ANALYZE
会执行查询并计算运行时期间的实际成本。
> explain analyze select sum(pointReq) from "_internal"."monitor"."write" group by hostname; EXPLAIN ANALYZE ----------- . └── select ├── execution_time: 242.167µs ├── planning_time: 2.165637ms ├── total_time: 2.407804ms └── field_iterators ├── labels │ └── statement: SELECT sum(pointReq::integer) FROM "_internal"."monitor"."write" GROUP BY hostname └── expression ├── labels │ └── expr: sum(pointReq::integer) ├── create_iterator │ ├── labels │ │ ├── measurement: write │ │ └── shard_id: 57 │ ├── cursors_ref: 1 │ ├── cursors_aux: 0 │ ├── cursors_cond: 0 │ ├── float_blocks_decoded: 0 │ ├── float_blocks_size_bytes: 0 │ ├── integer_blocks_decoded: 1 │ ├── integer_blocks_size_bytes: 931 │ ├── unsigned_blocks_decoded: 0 │ ├── unsigned_blocks_size_bytes: 0 │ ├── string_blocks_decoded: 0 │ ├── string_blocks_size_bytes: 0 │ ├── boolean_blocks_decoded: 0 │ ├── boolean_blocks_size_bytes: 0 │ └── planning_time: 1.401099ms └── create_iterator ├── labels │ ├── measurement: write │ └── shard_id: 58 ├── cursors_ref: 1 ├── cursors_aux: 0 ├── cursors_cond: 0 ├── float_blocks_decoded: 0 ├── float_blocks_size_bytes: 0 ├── integer_blocks_decoded: 0 ├── integer_blocks_size_bytes: 0 ├── unsigned_blocks_decoded: 0 ├── unsigned_blocks_size_bytes: 0 ├── string_blocks_decoded: 0 ├── string_blocks_size_bytes: 0 ├── boolean_blocks_decoded: 0 ├── boolean_blocks_size_bytes: 0 └── planning_time: 76.192µs
目前,提供这些统计信息是为了帮助用户和我们的支持团队了解正在执行的查询的“成本”。它有助于解释查询引擎实际在做什么,并有望更深入地了解正在访问的数据集。遗憾的是,除了确认正在访问的序列数基于预期结果有意义之外,您无法对这些结果采取更多措施。但是,我们相信这些见解本身就很有用。
支持 Prometheus 读写端点
正如之前宣布的那样,我们添加了 Prometheus 读写端点。这些端点已在 master
上可用一段时间,并随 InfluxDB 1.4 一起发布。
压缩性能改进
TSM 压缩在以下几个方面得到了改进:性能、调度和可观察性。性能得到了改进,可以更好地处理分片内更高的基数。这些更改包括为 TSM 索引使用堆外内存、在创建 TSM 文件时使用基于磁盘的索引缓冲以及减少分配。这些更改应减少 GC 压力,从而在几乎所有情况下降低 CPU 和内存利用率。它还可以防止由于极高基数压缩导致的 OOM。
压缩调度已得到改进,可以更好地协调跨分片的资源并适应不断变化的工作负载。以前,每个分片都独立调度和限制该分片的压缩。现在,调度程序使用加权队列方法,而不是对调度进行固定限制,并且可以更好地跨分片工作。这允许更高优先级的工作更动态地利用可用核心。在 1.3 中添加的 max-concurrent-compactions
限制现在默认启用,以将压缩限制为可用核心的 50%。当许多分片处于活动状态时,这可以更好地控制内存和 CPU 利用率。
现在,压缩监控具有每个级别队列深度的指标。每个分片现在都公开一个仪表样式指标,例如 tsmLevel3CompactionQueue
,该指标指示该级别和分片的队列长度。分片中所有级别的总和指示压缩是否正在备份,您可能需要更多 CPU 核心。*Active、*Err 和 *Queue 指标的组合提供基本利用率、饱和度和错误 (USE) 指标。如果您使用四种黄金信号方法进行监控,则可以使用现有的 *Duration
指标来监控压缩延迟。
客户端和 HTTP 增强功能
有许多功能使使用 HTTP 接口更加容易。
对 /query
端点的 HTTP 响应不再强制 Connection: close
。这允许客户端重复使用 HTTP 连接。问题 #8525 包含对更改的有用讨论。
InfluxDB HTTP 响应现在在标头 X-Influxdb-Build
中包含 InfluxDB 版本,供需要区分数据库版本的应用程序使用。在内部,Chronograf 将使用此功能更轻松地管理开源和企业 InfluxDB 实例的组合。
来自查询和写入的错误现在可以通过 X-InfluxDB-Error header
标头获得,并且当 [httpd] 配置部分中启用 log-enabled = true
时,5xx 错误消息将写入服务器日志。
InfluxDB 现在遵循 X-Request-Id
标头,以便调用者可以将关联 ID 作为请求的一部分传递。HTTP 响应同时填充 X-Request-Id 和 Request-Id,以保持与以前版本的向后兼容性,并支持更常见的 X-Request-Id 标头名称。pull request 中记录了更多详细信息:pull request。
最后,感谢 @emluque,InfluxDB CLI 现在支持 Ctrl+C 取消正在运行的查询。
响应的消息包格式
现在可以通过在 Accept 标头中设置 application/x-msgpack
来将消息包用于响应。服务器将响应消息包序列化响应。
实验性和预览功能
TSI 进展
在开发 1.4 的过程中,我们在 TSI 上投入了大量工作。但是,我们尚未准备好将 TSI 作为默认生产索引发布。在开发 1.5 版本时,我们将撰写更多关于 TSI 进展的文章。
此版本确实包含一个实用程序,用于从 TSM 数据生成 TSI 索引。这允许重建 TSI 索引,即使它们大于内存支持所允许的大小;它还允许为较旧的分片构建 TSI 索引以进行实验。
更多描述和使用示例可在 pull request 中找到: #8669。
uint64 支持预览
我们添加了无符号 64 位整数(又名 uint64
)支持,可以通过 InfluxDB 构建标志启用。在我们在 TICK 堆栈的其余部分实现 uint64
支持之前,我们将其保留在构建标志后面。Telgraf、Chronograf 和 Kapacitor 尚不支持此字段类型,并且在某些客户端库中,uint64
值无法自然地表示。
要启用 uint64
,请使用 go install -tags uint64 ./...
构建 InfluxDB。通过在写入协议中为整数添加后缀 u
来写入 uint64
值。
create database u64ex use u64ex Using database u64ex insert cpu v1=18446744073709551615u select v1 from cpu name: cpu time v1 ---- -- 1510620507267476000 18446744073709551615
IFQL 原型接口
InfluxDB OSS 1.4 包含原型 RPC 接口,以支持 IFQL。当我们推进 IFQL 原型时,此 API 将会更改,并且我们不对这个新接口做出任何兼容性承诺。但是,如果您想将该接口作为数据库的访问点进行探索,则可以启用并访问存储。ifql 部分现在可在配置文件中使用。
[ifql] # Determines whether the RPC service is enabled. enabled = true # Determines whether additional logging is enabled. log-enabled = true # The bind address used by the ifql RPC service. bind-address = ":8082"
IFQL RPC 接口基于 protobuf;protobuf 文件可供您编码使用。