处理逻辑
prometheus配置了remote write的目标地址后,它会从WAL读取数据,然后把采样数据写入各分片的内存队列,最后发起向远程目标地址的请求。
数据流的逻辑大致如下:
|--> queue (shard_1) --> remote endpoint
WAL --|--> queue (shard_...) --> remote endpoint
|--> queue (shard_n) --> remote endpoint
需要注意的是:WAL是每两小时压缩一次,如果远程写入的目标地址挂了超过两个小时,就会导致这段时间没被发送的数据丢失。如果远程写入的目标地址无响应时间较短(两小时以内),prometheus是会重试的,这种情况不会造成数据丢失。
当一个分片的队列被塞满时,promtheus将阻塞继续从WAL读取数据到任意分片。
在操作过程中,prometheus根据以下条件来持续计算要是用的最佳的分片数:
- 摄入样本的速率(incoming sample rate)
- 还未发送的样本数量(number of outstanding samples not sent)
- 发送每个样本的时间(time taken to send each sample)
内存的使用
当开启remote write功能后,prometheus内存的消耗是会上涨的。大部分反馈会上涨约25%的内存消耗,但实际数据取决于数据的分片。
对于WAL中的每一个series,远程写功能会缓存一个series ID到标签值的映射,这会导致内存消耗的大量增加。
除此之外,每个分片和其队列也增加了内存的使用。分片内存与 number of shards * (capacity + max_samples_per_send)
成正比。默认的capacity
和max_samples_per_send
将限制每个分片的内存使用小于100KB。
相关参数
remote write的相关参数在queue_config
配置块
# Configures the queue used to write to remote storage.
queue_config:
# Number of samples to buffer per shard before we block reading of more
# samples from the WAL. It is recommended to have enough capacity in each
# shard to buffer several requests to keep throughput up while processing
# occasional slow remote requests.
[ capacity: <int> | default = 500 ]
# Maximum number of shards, i.e. amount of concurrency.
[ max_shards: <int> | default = 1000 ]
# Minimum number of shards, i.e. amount of concurrency.
[ min_shards: <int> | default = 1 ]
# Maximum number of samples per send.
[ max_samples_per_send: <int> | default = 100]
# Maximum time a sample will wait in buffer.
[ batch_send_deadline: <duration> | default = 5s ]
# Initial retry delay. Gets doubled for every retry.
[ min_backoff: <duration> | default = 30ms ]
# Maximum retry delay.
[ max_backoff: <duration> | default = 100ms ]
capacity
用来指定每个分片队列可容纳的样本数上限。当队列达到上限后,将停止从WAL读数据。
通过设大capacity可以避免分片的阻塞,但是会导致过多的内存消耗,以及resharing时清空队列所需要的时间。
推荐是将capacity设为max_samples_per_send
的3到10倍。
max_shards
用来指定最大的分片数。当队列落后远程写模块时,prometheus将增加分片数直到最大值,来增加吞吐量。
min_shards
用来指定最小的分片数。这个参数对于大多数使用者来说不需要调整,因为当远程写落后时,prometheus会自动增加分片数。
max_samples_per_send
用来指定每次批量发送给远程写目标地址的最大samples数。如果远程写地址的后端服务,处理能力有限,或对每次处理的samples数有上限,则可以考虑设小次参数。
batch_send_deadline
指定发送一个远程写请求的最大等待时间。简单的说,,batch_send_deadline和max_samples_per_send这两个参数,有一个先达到,都会发起一个远程写请求。
min_backoff
指定当请求失败时,发起重试的最小时间间隔。增加这个值,可以使重试间隔时间更分散。每次重试后,下次重试的间隔时间将翻倍,直到达到max_backoff。
max_backoff
指定重试间隔的最大时间。
官方文档:https://prometheus.io/docs/practices/remote_write/