关于 Grafana Mimir Ingester 断路器
您可以使用断路器来防止应用程序重复尝试运行很可能失败的操作。断路器监控近期失败的次数,然后利用这些信息决定是否允许新操作继续进行,或者立即返回异常。在操作失败的情况下,断路器允许应用程序继续执行,而无需等待您解决失败原因。由于失败的操作会立即被拒绝,应用程序不会重试它。这减少了应用程序的 CPU 使用率。
断路器模式有三种状态:closed
(关闭)、open
(打开)和 half-open
(半开)。
- 在
closed
状态下,断路器正常运行,将所有请求转发到其保护的应用程序。 - 在
open
状态下,断路器会立即停止将请求转发到故障应用程序,从而有效地隔离它。 - 在
open
状态下经过指定的超时时间后,断路器转换为half-open
状态,在此状态下它会向应用程序转发有限数量的试探性请求,并监控它们的执行情况。成功的试探性请求表明应用程序恢复,断路器回到closed
状态。失败的试探性请求表明问题依然存在,断路器回到open
状态。
Grafana Mimir Ingester 断路器如何工作?
对受断路器保护资源的请求遵循以下步骤:
- 请求尝试获取断路器许可。
- 如果断路器处于打开状态,则不会获取到许可,请求因发生断路器打开错误而失败。
- 否则,请求获取断路器许可并运行。
- 如果请求满足断路器的失败条件,断路器会记录一次失败。否则,断路器记录一次成功。
根据配置的成功和失败频率,断路器从一个状态转换为另一个状态。
注意
Grafana Mimir Ingester 断路器是一项实验性功能。它们独立地保护 Mimir 的写入和读取路径免受慢速请求的影响。它们不会保护 ingester 免受其他问题的影响。
更准确地说,Grafana Mimir ingester 区分为*推送请求断路器*和*读取请求断路器*,您可以独立配置它们。可以配置推送和读取请求的最大允许持续时间,以及在断路器打开并开始保护 ingester 之前慢速请求的最高频率。
推送请求断路器
如果推送请求的持续时间长于配置的最大推送请求持续时间,则该请求满足推送请求断路器的失败条件。
读取请求断路器
读取请求断路器遵循以下条件:
- 为了尽可能地保护写入路径,如果 ingester 的推送断路器处于打开状态,它们不允许读取推送请求。这意味着 ingester 在尝试获取读取断路器许可之前,首先会检查其推送断路器是否打开。如果打开,则返回断路器打开错误。否则,ingester 尝试获取读取请求断路器许可。
- 获取读取请求断路器许可的读取请求,如果其持续时间长于配置的读取请求最大持续时间,则该请求满足读取请求断路器的失败条件。
配置 Grafana Mimir Ingester 断路器
要启用 Grafana Mimir ingester 推送和读取断路器,请设置 -ingester.push-circuit-breaker.enabled=true
和 -ingester.read-circuit-breaker.enabled=true
。您可以独立启用断路器。启用其中一个不要求启用另一个。
启用后,推送和读取断路器会带有一些默认配置。例如,失败请求的百分比是在一分钟 (1m
) 的移动窗口内计算的。要更改这些配置,请将 -ingester.push-circuit-breaker.thresholding-period
或 -ingester.read-circuit-breaker.thresholding-period
设置为您所需的值。
在对应的断路器打开并开始保护 ingester 之前,在配置的移动窗口内允许失败的推送和拉取请求的默认百分比是 10% (10
)。您可以通过 -ingester.push-circuit-breaker.failure-threshold-percentage
和 -ingester.read-circuit-breaker.failure-threshold-percentage
标志设置不同的百分比。
断路器达到 open
状态后,会等待 10 秒 (10s
),然后才转换为 half-open
状态并允许试探性请求。您可以通过 -ingester.push-circuit-breaker.cooldown-period
和 -ingester.read-circuit-breaker.cooldown-period
标志更改这些等待时间。
Grafana Mimir ingester 推送和读取断路器带有请求达到超时之前的最大持续时间的默认配置。推送请求的默认值为两秒 (2s
),读取请求的默认值为三十秒 (30s
)。您可以通过 -ingester.push-circuit-breaker.request-timeout
和 -ingester.read-circuit-breaker.request-timeout
设置来配置这些设置。断路器在内部使用这些超时,并且永远不会将其报告为错误。
Grafana Mimir Ingester 断路器指标
Grafana Mimir ingester 断路器添加了几个指标,这些指标不属于任何 API 保证,并可能随时更改。
cortex_ingester_circuit_breaker_transitions_total
: 计数器,显示断路器进入某个状态的总次数。包含标签 state,可能值为closed
、open
和half-open
;以及request_type
设置,可能值为push
和read
。cortex_ingester_circuit_breaker_results_total
: 计数器,显示通过断路器执行请求的结果。包含标签 result,可能值为success
、error
和circuit_breaker_open
;以及request_type
设置,可能值为push
和read
。cortex_ingester_circuit_breaker_request_timeouts_total
: 计数器,显示断路器记录达到超时请求的总次数。包含request_type
标签,可能值为push
和read
。cortex_ingester_circuit_breaker_current_state
: Gauge,当断路器处于与标签名称对应的状态时设置为1
。包含标签 state,可能值为closed
、open
和half-open
;以及request_type
设置,可能值为push
和read
。