处理逻辑

prometheus配置了remote write的目标地址后,它会从WAL读取数据,然后把采样数据写入各分片的内存队列,最后发起向远程目标地址的请求。

数据流的逻辑大致如下:

      |-->  queue (shard_1)   --> remote endpoint
WAL --|-->  queue (shard_...) --> remote endpoint
      |-->  queue (shard_n)   --> remote endpoint
  • 1
  • 2
  • 3

需要注意的是: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)成正比。默认的capacitymax_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 ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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/

发表评论

邮箱地址不会被公开。 必填项已用*标注