Gnocchi 入门

Gnocchi 专为当今的大型云平台而构建,它能够大规模存储和索引时间序列数据和资源。
640 位读者喜欢这篇文章。
Storage units side by side

Scott Meyers。由 Opensource.com 修改。CC BY-SA 2.0。

Gnocchi 是一个开源的 时间序列数据库,创建于 2014 年,当时 OpenStack 正在寻找一个高度可扩展、容错的时间序列数据库,该数据库不依赖于专用数据库(例如 Hadoop、Cassandra 等)。

Gnocchi 最初是在 OpenStack 内部构建的,但后来从该项目中移出,因为它被构建为与平台无关。即便如此,Gnocchi 仍然被这个云平台用作主要的时间序列后端;例如,OpenStack Ceilometer 利用 Gnocchi 的大规模可扩展性和高可用性属性来确保其遥测始终可用且快速。

Gnocchi 解决的问题是大规模存储和索引时间序列数据和资源。现代云平台不仅庞大,而且是动态的,并且可能是多租户的。Gnocchi 考虑了所有这些因素。

聚合

Gnocchi 采用了一种独特的时间序列存储方法:它在存储原始数据点之前先对其进行聚合。这种内置功能与大多数其他时间序列数据库不同,后者通常将此机制作为一种选项,并在查询时计算聚合(平均值、最小值等)。

由于 Gnocchi 在摄取时计算所有聚合,因此取回数据非常快,因为它只需要读取预先计算的结果。

这些数据点的聚合方式在每个指标的基础上是可配置的,使用归档策略。归档策略定义了要计算哪些聚合以及要保留多少聚合。Gnocchi 支持大量的聚合方法,例如最小值、最大值、平均值、第 N 个百分位数、标准差等。这些聚合是在一段时间(称为粒度)内计算的,并保留一段定义的时间跨度。聚合以压缩格式存储,确保数据点占用尽可能少的空间。

例如,假设您定义了一个归档策略,以五分钟的粒度保留时间序列的平均值、最小值和最大值 30 天。在这种情况下,Gnocchi 将计算五分钟范围内值的平均值、最小值和最大值,最多保留 8,640 个点(30 天内可以拥有的五分钟聚合数)。

入门

在安装 Gnocchi 之前,您需要决定要使用哪些度量和聚合存储驱动程序。Gnocchi 可以利用高度可扩展的存储系统,例如 Ceph、OpenStack Swift、Redis 甚至 Amazon S3。如果这些选项都不可用,您仍然可以使用标准文件系统。

您还需要一个数据库来索引 Gnocchi 将处理的资源和指标——PostgreSQL 和 MySQL 都受支持。

安装页面 描述了如何设置 Gnocchi 并编写其配置文件。一旦编写了此配置文件,gnocchi-upgrade 程序将设置存储引擎和数据库索引,以便它们可以随时使用。

Gnocchi 由两个中心服务组成:一个 HTTP 服务器,提供 REST API,以及一个指标处理守护程序。前者称为 gnocchi-api;后者名为 gnocchi-metricd。您需要运行这两个服务才能使用 Gnocchi。REST API 将被客户端用来查询 Gnocchi 并向其写入数据。metricd 服务将摄取 API 接收的度量,计算聚合,并将其存储在长期聚合存储中。

这两个服务都是无状态的,因此可以水平扩展。与许多时间序列数据库相反,可以与 Gnocchi 一起运行的 metricd 守护程序或 API 端点的数量没有限制。如果您的负载开始增加,您只需要生成更多守护程序来处理新的请求流。如果您想处理高可用性场景,同样适用:只需在独立的服务器上启动更多 Gnocchi 守护程序即可。

使用命令行工具

部署 Gnocchi 后,您可以使用 pip(Python 包安装程序)安装 Gnocchi 客户端命令行工具;只需键入 pip install gnocchiclient。它向 HTTP REST API 发送请求,并格式化和打印回复。

为了组织指标,Gnocchi 提供了资源的概念。一个资源可以附加任意数量的指标

$ gnocchi resource create server42
+-----------------------+--------------------------------------+
| Field                 | Value                                |
+-----------------------+--------------------------------------+
| created_by_project_id |                                      |
| created_by_user_id    | admin                                |
| creator               | admin                                |
| ended_at              | None                                 |
| id                    | 43164383-6dc3-5034-a675-9a39493ca7df |
| metrics               |                                      |
| original_resource_id  | server42                             |
| project_id            | None                                 |
| revision_end          | None                                 |
| revision_start        | 2017-10-20T13:19:46.902754+00:00     |
| started_at            | 2017-10-20T13:19:46.902642+00:00     |
| type                  | generic                              |
| user_id               | None                                 |
+-----------------------+--------------------------------------+

Gnocchi 处理资源的修订;如果任何属性发生更改,Gnocchi 将记录该更改并在资源的历史记录中创建一个新条目。

创建此资源后,我们可以为此资源创建一个新指标

$ gnocchi metric create -r server42 cpu
+------------------------------------+------------------------------------------------------------------+
| Field                              | Value                                                            |
+------------------------------------+------------------------------------------------------------------+
| archive_policy/aggregation_methods | std, count, min, max, sum, mean                                  |
| archive_policy/back_window         | 0                                                                |
| archive_policy/definition          | - points: 8640, granularity: 0:05:00, timespan: 30 days, 0:00:00 |
| archive_policy/name                | low                                                              |
| created_by_project_id              |                                                                  |
| created_by_user_id                 | admin                                                            |
| creator                            | admin                                                            |
| id                                 | ab0b5dab-31e9-4760-a58f-0dc324047f9f                             |
| name                               | cpu                                                              |
| resource/created_by_project_id     |                                                                  |
| resource/created_by_user_id        | admin                                                            |
| resource/creator                   | admin                                                            |
| resource/ended_at                  | None                                                             |
| resource/id                        | 43164383-6dc3-5034-a675-9a39493ca7df                             |
| resource/original_resource_id      | server42                                                         |
| resource/project_id                | None                                                             |
| resource/revision_end              | None                                                             |
| resource/revision_start            | 2017-10-20T13:19:46.902754+00:00                                 |
| resource/started_at                | 2017-10-20T13:19:46.902642+00:00                                 |
| resource/type                      | generic                                                          |
| resource/user_id                   | None                                                             |
| unit                               | None                                                             |
+------------------------------------+------------------------------------------------------------------+

这将创建一个名为 cpu 的指标,并将其附加到资源 server42。新指标默认使用的归档策略是 low,这是安装 Gnocchi 时默认提供的。low 归档策略以五分钟的粒度存储 30 天的各种聚合方法。

这个新指标没有度量,所以是时候发送一些了

$ gnocchi measures add -m "2017-10-20 12:00@42" -m "2017-10-20 12:03@18" -m "2017-10-20 12:06@56" -r server42 cpu
$  gnocchi measures show -r server42 cpu
+---------------------------+-------------+-------+
| timestamp                 | granularity | value |
+---------------------------+-------------+-------+
| 2017-10-20T12:00:00+02:00 |       300.0 |  30.0 |
| 2017-10-20T12:05:00+02:00 |       300.0 |  56.0 |
+---------------------------+-------------+-------+

发送的三个度量被聚合为 12:00 和 12:05 的两个数据点。默认情况下,显示的聚合方法是 mean,但您可以请求任何其他聚合方法

$ gnocchi measures show --aggregation count -r server42 cpu
+---------------------------+-------------+-------+
| timestamp                 | granularity | value |
+---------------------------+-------------+-------+
| 2017-10-20T12:00:00+02:00 |       300.0 |   2.0 |
| 2017-10-20T12:05:00+02:00 |       300.0 |   1.0 |
+---------------------------+-------------+-------+

count 聚合方法计算每个间隔内接收到的数据点数量。

默认资源类型为 generic,但您可以创建自己的资源类型,其中包含任意数量的额外属性。这些属性可以是可选的,并且可以具有特定的类型,以确保您的数据结构合理且易于使用

$ gnocchi resource-type create -a ipaddress:string:true network-switch
+----------------------+----------------------------------------------------------+
| Field                | Value                                                    |
+----------------------+----------------------------------------------------------+
| attributes/ipaddress | max_length=255, min_length=0, required=True, type=string |
| name                 | network-switch                                           |
| state                | active                                                   |
+----------------------+----------------------------------------------------------+
$ gnocchi resource create --type network-switch --attribute ipaddress:192.168.2.3 sw18-prs.example.com
+-----------------------+--------------------------------------+
| Field                 | Value                                |
+-----------------------+--------------------------------------+
| created_by_project_id |                                      |
| created_by_user_id    | admin                                |
| creator               | admin                                |
| ended_at              | None                                 |
| id                    | 4fbdf14d-5650-58f5-b232-dc3cf91c28d0 |
| ipaddress             | 192.168.2.3                          |
| metrics               |                                      |
| original_resource_id  | sw18-prs.example.com                 |
| project_id            | None                                 |
| revision_end          | None                                 |
| revision_start        | 2017-10-20T15:08:30.935529+00:00     |
| started_at            | 2017-10-20T15:08:30.935513+00:00     |
| type                  | network-switch                       |
| user_id               | None                                 |
+-----------------------+--------------------------------------+

如果属性值发生更改,则可以检索其历史记录

$ gnocchi resource update --type network-switch --attribute ipaddress:192.168.2.48 sw18-prs.example.com
+-----------------------+--------------------------------------+
| Field                 | Value                                |
+-----------------------+--------------------------------------+
| created_by_project_id |                                      |
| created_by_user_id    | admin                                |
| creator               | admin                                |
| ended_at              | None                                 |
| id                    | 4fbdf14d-5650-58f5-b232-dc3cf91c28d0 |
| ipaddress             | 192.168.2.48                         |
| metrics               |                                      |
| original_resource_id  | sw18-prs.example.com                 |
| project_id            | None                                 |
| revision_end          | None                                 |
| revision_start        | 2017-10-20T15:10:11.903018+00:00     |
| started_at            | 2017-10-20T15:08:30.935513+00:00     |
| type                  | network-switch                       |
| user_id               | None                                 |
+-----------------------+--------------------------------------+

$ gnocchi resource history --format yaml --type network-switch sw18-prs.example.com
- creator: admin
  ended_at: null
  id: 4fbdf14d-5650-58f5-b232-dc3cf91c28d0
  ipaddress: 192.168.2.3
  metrics: {}
  original_resource_id: sw18-prs.example.com
  project_id: null
  revision_end: '2017-10-20T15:10:11.903018+00:00'
  revision_start: '2017-10-20T15:08:30.935529+00:00'
  started_at: '2017-10-20T15:08:30.935513+00:00'
  type: network-switch
  user_id: null
- creator: admin
  ended_at: null
  id: 4fbdf14d-5650-58f5-b232-dc3cf91c28d0
  ipaddress: 192.168.2.48
  metrics: {}
  original_resource_id: sw18-prs.example.com
  project_id: null
  revision_end: null
  revision_start: '2017-10-20T15:10:11.903018+00:00'
  started_at: '2017-10-20T15:08:30.935513+00:00'
  type: network-switch
  user_id: null

修订字段指示更改发生的时间。ipaddress 的旧属性值和新属性值都可访问,从而可以轻松跟踪资源的修改方式。

Gnocchi 还提供其他功能,例如资源和指标搜索、指标的高级交叉聚合、访问控制列表 (ACL) 管理等等。

与其他工具集成

Gnocchi 可以与许多其他工具集成。例如,可以使用其 collectd 插件 使用 collectd 收集指标并将它们发送到 Gnocchi。

Gnocchi 还通过 Grafana 插件 支持 Grafana,这是用于显示来自时间序列数据库的图表的标准工具。

Grafana integration with Gnocchi

opensource.com

Gnocchi 的路线图

Gnocchi 正在 积极开发 中,并且总是有新功能推出。下一个版本 (4.1) 应该为跨指标聚合提供更多计算可能性。此外,正在构建 Prometheus 的摄取点,以便 Gnocchi 可以用作 Prometheus 时间序列警报和监控系统的长期且可扩展的存储选项。

标签
User profile image.
Red Hat 的首席软件工程师,致力于 OpenStack Telemetry。拥有 15 年以上自由软件黑客经验,Emacs 和 Debian 开发人员。《The Hacker's Guide to Python》的作者。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.