配置 Grafana Mimir 哈希环
哈希环是一种分布式一致性哈希方案,被 Grafana Mimir 广泛用于分片和复制。
以下每个 Grafana Mimir 组件都构建独立的哈希环。用于配置每个组件哈希环的 CLI 标志具有以下前缀
- Ingesters:
-ingester.ring.*
- Distributors:
-distributor.ring.*
- Compactors:
-compactor.ring.*
- Store-gateways:
-store-gateway.sharding-ring.*
- (可选) Query-schedulers:
-query-scheduler.ring.*
- (可选) Rulers:
-ruler.ring.*
- (可选) Alertmanagers:
-alertmanager.sharding-ring.*
- (可选) Overrides-exporters:
-overrides-exporter.ring.*
文档其余部分将这些前缀称为 <prefix>
。您可以通过 CLI 标志或其相应的 YAML 配置选项来配置每个参数。
配置键值存储
哈希环数据结构需要在 Grafana Mimir 实例之间共享。为了传播哈希环的更改,Grafana Mimir 使用键值存储。键值存储是必需的,并且可以为不同组件的哈希环独立配置。
Grafana Mimir 支持以下用于哈希环的键值 (KV) 存储后端
memberlist
(默认)consul
etcd
multi
您可以通过设置 <prefix>.store
CLI 标志(例如,-ingester.ring.store
)来配置 KV 存储后端。
Memberlist (默认)
默认情况下,Grafana Mimir 使用 memberlist
作为 KV 存储后端。
启动时,Grafana Mimir 实例会连接到其他 Mimir 副本以加入集群。Grafana Mimir 实例通过解析 -memberlist.join
中配置的地址来发现要加入的其他副本。-memberlist.join
CLI 标志必须解析到集群中的其他副本,并且可以指定多次。
-memberlist.join
可以设置为
<ip>:<port>
格式的地址。<hostname>:<port>
格式的地址。- DNS 服务发现格式的地址。
默认端口是 7946
。
注意
至少配置一个或多个解析到副本一致子集(例如,所有 ingester)的地址。
注意
如果您在 Kubernetes 中运行 Grafana Mimir,请定义一个headless Kubernetes Service,该 Service 解析到所有 Grafana Mimir Pod 的 IP 地址。
然后将
-memberlist.join
设置为dnssrv+<service name>.<namespace>.svc.cluster.local:<port>
。
注意
与其他支持的后端不同,
memberlist
后端是全局配置的,无法按组件进行定制。
Grafana Mimir 支持其组件之间的 memberlist 连接使用 TLS。有关 TLS 配置的更多信息,请参阅使用 TLS 保护通信安全。
要查看所有支持的配置参数,请参阅memberlist。
配置 memberlist 地址和端口
默认情况下,Grafana Mimir memberlist 协议监听地址 0.0.0.0
和端口 7946
。如果您在同一节点上运行多个 Mimir 进程或端口 7946
不可用,您可以通过设置以下参数来更改绑定和通告端口
-memberlist.bind-addr
: 本地机器上监听的 IP 地址。-memberlist.bind-port
: 本地机器上监听的端口。-memberlist.advertise-addr
: 通告给其他 Mimir 副本的 IP 地址。其他副本将连接到此 IP 与实例通信。-memberlist.advertise-port
: 通告给其他 Mimir 副本的端口。其他副本将连接到此端口与实例通信。
集群标签验证
默认情况下,Grafana Mimir memberlist 根据 -memberlist.join
CLI 标志设置或 memberlist 的 YAML 配置选项,与主机解析时发现的任何实例加入集群。如果出于某种原因,发现的地址包含其他 Grafana Mimir 集群的实例,或使用 memberlist 的其他分布式系统的实例,Grafana Mimir 会将这些不相关的集群连接在一起。
为避免这种情况,Grafana Mimir 提供了一种额外的验证类型,称为集群标签验证。
启用集群标签验证后,所有 memberlist 内部流量都会加上配置的集群标签作为前缀。任何不匹配该前缀的流量都会被丢弃,以确保只有具有相同配置标签的副本才能相互连接。
迁移到使用集群标签验证
将 Grafana Mimir 集群迁移到使用集群标签验证
- 通过
-memberlist.cluster-label-verification-disabled=true
CLI 标志(或其相应的 YAML 配置选项)在所有集群实例上禁用集群标签验证。 - 等待配置更改发布到所有 Grafana Mimir 实例。
- 在每个集群上,通过
-memberlist.cluster-label
CLI 标志(或其相应的 YAML 配置选项)定义一个对该集群唯一且所有实例相同的标签。同一集群中的所有实例必须使用相同的标签。例如,如果您在专用命名空间中运行 Grafana Mimir 集群,则将集群标签设置为该命名空间的名称。 - 等待配置更改发布到所有 Grafana Mimir 实例。
- 通过移除配置选项
-memberlist.cluster-label-verification-disabled=true
来在所有集群实例上启用集群标签验证。 - 等待配置更改发布到所有 Grafana Mimir 实例。
微调 memberlist 更改传播延迟
cortex_ring_oldest_member_timestamp
指标可用于衡量哈希环更改的传播。此指标跟踪环中所有实例中最旧的心跳时间戳。您可以执行以下查询来测量环中最旧心跳时间戳的年龄
max(time() - cortex_ring_oldest_member_timestamp{state="ACTIVE"})
测量的年龄不应高于配置的 <prefix>.heartbeat-period
加上合理的增量(例如,15 秒)。如果您遇到更高的更改传播延迟,可以调整以下设置
- 减小
-memberlist.gossip-interval
- 增大
-memberlist.gossip-nodes
- 减小
-memberlist.pullpush-interval
- 增大
-memberlist.retransmit-factor
Consul
要使用Consul作为后端 KV 存储,请设置以下参数
<prefix>.consul.hostname
: Consul 主机名和端口,用冒号分隔。例如,consul:8500
。<prefix>.consul.acl-token
: 用于向 Consul 进行身份验证的ACL 令牌。如果 Consul 身份验证已禁用,您可以将令牌留空。
要查看所有支持的配置参数,请参阅consul。
Etcd
要使用etcd作为后端 KV 存储,请设置以下参数
<prefix>.etcd.endpoints
: etcd 主机名和端口,用冒号分隔。例如,etcd:2379
。<prefix>.etcd.username
: 用于向 etcd 进行身份验证的用户名。如果 etcd 身份验证已禁用,您可以将用户名留空。<prefix>.etcd.password
: 用于向 etcd 进行身份验证的密码。如果 etcd 身份验证已禁用,您可以将密码留空。
Grafana Mimir 支持其组件和 etcd 之间使用 TLS。有关 TLS 配置的更多信息,请参阅使用 TLS 保护通信安全。
要查看所有支持的配置参数,请参阅etcd。
Multi
multi
后端是一种实现,仅应用于在其他两个后端之间进行迁移。
multi
后端使用两个不同的 KV 存储:主存储和副存储。主后端接收所有读写操作。副后端仅接收写入操作。主后端和副后端可以实时切换,这使您无需停机即可从一个后端切换到另一个后端。
您可以使用以下参数配置 multi KV 存储设置
<prefix>.multi.primary
: 主后端存储的类型。<prefix>.multi.secondary
: 副后端存储的类型。<prefix>.multi.mirror-enabled
: 是否启用向副后端存储镜像写入操作。<prefix>.multi.mirror-timeout
: 允许向副后端存储镜像更改的最长时间。
注意
如果 Grafana Mimir 无法向副后端存储镜像写入操作,它不会记录错误。但是,错误总数会通过
cortex_multikv_mirror_write_errors_total
指标进行跟踪。
multi KV 主后端和镜像也可以在运行时配置文件中配置。运行时配置中对 multi KV Store 的更改将应用于使用 multi KV 存储的所有组件。
以下示例显示了 multi KV 存储的运行时配置文件
multi_kv_config:
# The runtime configuration only allows to override the primary backend and whether mirroring is enabled.
primary: consul
mirror_enabled: true
注意
运行时配置设置优先于 CLI 标志。
Ingester 迁移示例
以下步骤演示了如何将 ingester 从 Consul 迁移到 etcd
- 配置
-ingester.ring.store=multi
、-ingester.ring.multi.primary=consul
、-ingester.ring.multi.secondary=etcd
和-ingester.ring.multi.mirror-enabled=true
。配置 Consul 设置-ingester.ring.consul.*
和 etcd 设置-ingester.ring.etcd.*
。 - 将更改应用到您的 Grafana Mimir 集群。更改发布后,Grafana Mimir 将使用 Consul 作为主 KV 存储,并且所有写入也将镜像到 etcd。
- 在运行时配置文件中的
multi_kv_config
块中配置primary: etcd
。运行时配置文件中的更改会实时重新加载,无需重启进程。 - 等待所有 Mimir 实例重新加载更新的配置。
- 在运行时配置文件中的
multi_kv_config
块中配置mirror_enabled: false
。 - 等待所有 Mimir 实例重新加载更新的配置。
- 配置
-ingester.ring.store=etcd
并移除 multi 和 Consul 的配置,因为它们不再需要。 - 将更改应用到您的 Grafana Mimir 集群。更改发布后,Grafana Mimir 将仅使用 etcd。