Prometheus 远程存储是什么?
这篇文章是Z Lab Advent Calendar的第四天的文章。今天将继续昨天@tkusumi先生的文章,内容与Prometheus相关。由于Z Lab正在进行Prometheus的远程存储验证,所以我想在这篇文章中介绍一下远程存储。
这个功能是什么?
以简单明了的话来说,Prometheus可以将获取到的指标数据存储到本地存储之外的另一台机器上的存储设备中。
为了实现这一目标,Prometheus通过制定远程读取/写入API规范,并在远程存储上提供针对读取/写入操作的HTTP端点,实现了对度量数据的输入和输出。
Remote Write のエンドポイント: メトリクスデータを Remote Storage に書き込むために利用される
Remote Read のエンドポイント: そのエンドポイントに対してクエリを送信することで, Remote Storage 側に格納されているメトリクスデータを取得するために利用される
为何需要这个功能?
根据官方文档,当Prometheus发生故障时,有时需要删除数据。为了长期存储Prometheus获取的指标数据,需要将数据迁移到适合长期存储的其他存储设备中。因此,我们开发了一项名为Remote Storage的功能来实现这一目的。
目前可用的实施方案是什么?
目前可以用作远程存储的实现列在此处。特别是支持读取和写入两个端点的实现有以下四个。
Cortex 大脑皮层 (Dà pí
Cortex 是由 Weaveworks 开发的可扩展的 Prometheus 作为服务的项目。该实现本身是开源的,但为了使用,前提是使用 Weave Cloud。
CrateDB是一个选项。
CrateDB 是一种开源的分布式 SQL 数据库,其内部实现中使用了 Elasticsearch 来管理集群等部分。然而,CrateDB 本身并没有直接提供 Prometheus Remote Storage 的功能,而是通过在 Prometheus 和 CrateDB 之间放置名为 crate_adapter 的适配器来实现可用作 Remote Storage。
InfluxDB的意思是InfluxDB。
InfluxDB 是一种开源的纯粹的时间序列数据库实现。在之前,当使用 InfluxDB 作为远程存储时,需要使用适配器,但从 v1.4.0 版本开始,它作为 Prometheus 的远程存储端点提供原生功能,无需使用适配器。需要注意的是,只有付费版才支持集群功能。
PostgreSQL (一种开源数据库管理系统)
我认为PostgreSQL是众所周知的一种关系数据库管理系统。要将其用作远程存储,需要在PostgreSQL中添加一个名为pg_prometheus的扩展,以便能够处理Prometheus的指标数据,然后使用prometheus-postgresql-adapter适配器。
我要嘗試一下。
这次,我从之前提到的远程存储实现中选择了CrateDB和InfluxDB进行试验,因为它们看起来都很容易搭建,并且运营成本也较低。
CrateDB可以被简述为某种数据库软件。
为了将CrateDB作为Prometheus的远程存储使用,需要使用名为crate_adapter的适配器。通过使用这个适配器,我们将按以下配置进行搭建。
首先,CrateDB 会准备三个实例并进行集群化。然后,我们会准备适配器,所有来自Prometheus的输入输出将通过该适配器进行传递。
+-------------+
| Prometheus |
+------+------+
|
|
v
+----------------+
| Crate Adapter |
+---+---+---+----+
| | |
| | |
| | |
+----------+ | +----------+
| | |
| v |
| +---------+ |
| +------+ CrateDB +------+ |
| | +---------+ | |
v | | v
+-------+-+ +-+-------+
| CrateDB +-------------------+ CrateDB |
+---------+ +---------+
Prometheus 的设置如下所示。url 指定了适配器的端点,queue_config 指定了调整写入到远程存储配置的参数。
remote_write:
- url: http://{{ crate_adapter の IP アドレス }}:9268/write
queue_config:
capacity: 1000000
batch_send_deadline: 10s
max_samples_per_send: 1000
max_shards: 3
remote_read:
- url: http://{{ crate_adapter の IP アドレス }}:9268/read
以下是 queue_config 的每个项目的含义。
请注意,这里只提供一种翻译选项。
如果保持默认设置,对于远程存储的请求可能过于频繁,导致CrateDB无法承受写入负载,结果是Prometheus端的队列会变长。CrateDB可以通过批量插入来提高写入性能,因此我们通过将batch_send_deadline和max_samples_per_send设置得更大,将每个请求中包含的样本数量设为相对较大的值来解决这个问题。同时,我们也将队列的最大长度设置得更大。
同时,我们已经确认了将发送并行度与 CrateDB 实例数保持大致相同可以确保性能稳定。
通过这样的设置,我们确认了 Prometheus 可以稳定地将大约5k个样本/秒的度量写入 CrateDB。但是,我们发现 CrateDB 使用的磁盘容量比预期要大得多,似乎每个样本消耗约200字节。相比之下,Prometheus的TSDB每个样本仅消耗1-2个字节。我们猜想这是由于 CrateDB 不是纯粹的 TSDB,可能是因为创建了不必要的索引导致的。
InfluxDB 海量数据库
由于InfluxDB原生具备作为Prometheus的远程存储的功能,所以不需要像CrateDB一样准备适配器。因此,构建系统变得简单如下。
准备3个InfluxDB实例,通过Prometheus分别对每个实例进行度量数据的输入和输出。在这里需要注意,为了将InfluxDB互相集群化,需要使用收费的企业版,而本次未进行InfluxDB本身的集群化。将数据分散到每个InfluxDB实例上是通过Prometheus的分片逻辑来实现的。
+--------------+
| Prometheus |
+---+--+--+----+
| | |
| | |
| | |
+----------+ | +-----------+
| | |
| | |
v v v
+----------+ +----------+ +----------+
| InfluxDB | | InfluxDB | | InfluxDB |
+----------+ +----------+ +----------+
在 Prometheus 中,我们会按照以下方式描述每个 InfluxDB 实例的端点列表。不需要调整类似 CrateDB 时的参数来配置 queue_config,所以不需要指定(至少在每秒数千个样本的负载下不会感到需要)。
remote_write:
- url: http://{{ InfluxDB の IP アドレス }}:8086/api/v1/prom/write?db={{ DB 名 }}
- url: http://{{ InfluxDB の IP アドレス }}:8086/api/v1/prom/write?db={{ DB 名 }}
- url: http://{{ InfluxDB の IP アドレス }}:8086/api/v1/prom/write?db={{ DB 名 }}
remote_read:
- url: http://{{ InfluxDB の IP アドレス }}:8086/api/v1/prom/read?db={{ DB 名 }}
- url: http://{{ InfluxDB の IP アドレス }}:8086/api/v1/prom/read?db={{ DB 名 }}
- url: http://{{ InfluxDB の IP アドレス }}:8086/api/v1/prom/read?db={{ DB 名 }}
在这个设置中,我们也确认了可以将 InfluxDB 用作远程存储。
令人担忧的是没有将InfluxDB本身进行集群化可能会产生的影响,但通过Prometheus查看度量数据时,由于Prometheus能够很好地合并数据,所以并没有特别感觉到问题。然而,如果希望不通过Prometheus而是充分利用InfluxDB的功能来分析数据,那么每个InfluxDB可能只有已经分片的数据,这可能无法达到期望的效果。
总结。
-
- CrateDB と InfluxDB を Prometheus の Remote Storage として利用することができました.
-
- CrateDB を Remote Storage として利用する場合, データの容量が期待するよりも大きくなってしまうことが分かりました.
- InfluxDB を Remote Storage として利用する場合, Prometheus を通じてメトリクスデータを確認する限りは, 無償版の機能だけでも十分利用できることが分かりました.