将 ingester 迁移到最小化扩散令牌
本指南将帮助您配置 Mimir 的 ingester,使其使用“最小化扩散令牌生成策略”。
开始之前
ingester 时间序列复制应配置为启用区域感知。
注意
建议使用最小化扩散令牌,如果
您的 ingester 写入路径上禁用了 shuffle-sharding,或者即使启用了,您系统中的大多数租户都使用了所有可用的 ingester。
注意
为了防止查询结果不正确,
在将 ingester 迁移到最小化扩散令牌之前,必须禁用 ingester 读取路径上的shuffle-sharding。在最后一个 ingester 区域迁移到最小化扩散令牌至少
-querier.query-store-after
时间后,可以重新启用 ingester 读取路径上的 shuffle-sharding。
如果 ingester 配置了非空的 -ingester.ring.tokens-file-path
值,则这是 ingester 在关闭时存储令牌并在启动时恢复的文件。请记住此值,因为在最后一步会用到它。
为简单起见,假设配置了三个可用区域,分别命名为 zone-a
、zone-b
和 zone-c
。迁移到“最小化扩散令牌生成策略”是一个复杂的过程,需要逐个区域执行以防止任何数据丢失。
步骤 1:禁用 zone-a 中的 ingester 写入请求
要禁用写入请求,请在 distributor 和 ruler 上配置以下标志
-ingester.ring.excluded-zones=zone-a
在继续下一步之前,使用以下查询确保没有向 zone-a 中的 ingester 发送写入请求
sum by(route) (
rate(
cortex_request_duration_seconds_count{
namespace="<your-namespace>",
container="ingester",
pod=~"ingester-zone-a-.*",
route="/cortex.Ingester/Push"}[5m]
)
)
您应该会看到类似以下内容
步骤 2:关闭 zone-a 中的 ingester
调用 zone-a 中所有 ingester 上的 /ingester/shutdown 端点,将所有内存中的时间序列和指标刷新到长期存储,并从 ring 中清除所有 ingester。
在继续下一步之前,确保所有调用都成功完成。
步骤 3:为 zone-a 中的 ingester 启用最小化扩散令牌
在 zone-a 中的 ingester 上配置以下标志
-ingester.ring.tokens-file-path=
-ingester.ring.token-generation-strategy=spread-minimizing
-ingester.ring.spread-minimizing-zones=zone-a,zone-b,zone-c
注意
示例使用
zone-a,zone-b,zone-c
表示配置的可用区域的逗号分隔列表。
在继续下一步之前,确保与 zone-a 相关的所有 ingester Pod 都已启动并使用新配置运行。
可选步骤:ingester 的有序注册
Mimir 可以强制 ring 按顺序注册 ingester。启用此功能后,只有在所有之前的 ingester(ID 小于其自身的 ID)都已注册后,ingester 才能在 ring 中注册其令牌。此功能可以最大限度地减少应由某个 ingester 处理的写入请求在 ingester 在 ring 中注册之前实际到达 ring 的可能性。在这种情况下,请求将由另一个 ingester 处理。这种情况可能会导致负载分配偏离最佳状态。
配置此功能
-ingester.ring.spread-minimizing-join-ring-in-order=true
步骤 4:重新启用 zone-a 中的 ingester 写入请求
要重新启用写入请求,请恢复步骤 1:禁用 zone-a 中的 ingester 写入请求。
此时,您可以使用以下查询检查 zone-a 中的 ingester 的内存中时间序列数量
sum by(pod) (
cortex_ingester_memory_series{
namespace="<your-namespace>",
pod=~"ingester-zone-a-.*"}
)
如果一切顺利,您应该会看到类似以下内容
步骤 5:迁移 zone-b 中的 ingester
重复步骤 1 到 4,将所有出现的 zone-a
替换为 zone-b
。
步骤 6:迁移 zone-c 中的 ingester
重复步骤 1 到 4,将所有出现的 zone-a
替换为 zone-c
。
步骤 7:删除旧的令牌文件
如果在迁移之前,您配置了 ingester 将其令牌存储在 -ingester.ring.tokens-file-path
下,那么在将所有 ingester 区域迁移到最小化扩散令牌后,您必须删除这些文件。
例如,如果来自 mimir-prod
命名空间的名为 ingester-zone-a
的 ingester Pod 过去将其令牌存储在名为 /data/tokens
的文件中,您可以运行以下命令删除 /data/tokens
文件
kubectl -n mimir-prod exec ingester-zone-a-0 -- rm /data/tokens