InfluxDB 1.4 现已发布:InfluxQL 功能增强、Prometheus 读写、更好的压缩功能等等!
由 Ryan Betts / 产品,开发者
2017年11月14日
导航至
InfluxDB 1.4 的新功能
我们宣布 InfluxDB 1.4 的开源版本。与之前的版本不同,这次发布没有配套的 InfluxDB Enterprise 版本。这里描述的所有特性和更改都可在开源 InfluxDB 中使用。这篇博客文章主要是由 InfluxDB 平台团队和社区成员撰写的拉取请求和功能描述汇编而成。谢谢大家!
InfluxQL 功能增强
InfluxDB 1.4 包括新的 InfluxQL 功能,使其更容易探索元数据和了解查询执行。我们添加了 SHOW CARDINALITY
查询,以使查询系列基数变得更容易。
SHOW CARDINALITY
命令有两种类型:估计值和精确值。估计值使用草图计算,是所有基数大小的安全默认值。EXACT
变体直接从 TSM 数据中计数,对于高基数数据运行成本很高。我们建议优先考虑估计值。我们还开始添加对元查询的谓词支持(WHERE
子句支持)。然而,目前只支持使用 TSI 通过时间进行过滤。我们将继续在开发 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。
最后,感谢@emluque,InfluxDB CLI现在支持使用Ctrl+C取消正在运行的查询。
响应的消息Pack格式
现在可以通过在Accept
头部设置application/x-msgpack
来使用消息Pack作为响应。服务器将以消息Pack序列化响应进行响应。
实验性和预览功能
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包括用于支持IFQL的原型RPC接口。随着我们推进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文件可供您编码使用。