菜单
开源

配置 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 集群迁移到使用集群标签验证

  1. 通过 -memberlist.cluster-label-verification-disabled=true CLI 标志(或其相应的 YAML 配置选项)在所有集群实例上禁用集群标签验证。
  2. 等待配置更改发布到所有 Grafana Mimir 实例。
  3. 在每个集群上,通过 -memberlist.cluster-label CLI 标志(或其相应的 YAML 配置选项)定义一个对该集群唯一且所有实例相同的标签。同一集群中的所有实例必须使用相同的标签。例如,如果您在专用命名空间中运行 Grafana Mimir 集群,则将集群标签设置为该命名空间的名称。
  4. 等待配置更改发布到所有 Grafana Mimir 实例。
  5. 通过移除配置选项 -memberlist.cluster-label-verification-disabled=true 来在所有集群实例上启用集群标签验证。
  6. 等待配置更改发布到所有 Grafana Mimir 实例。

微调 memberlist 更改传播延迟

cortex_ring_oldest_member_timestamp 指标可用于衡量哈希环更改的传播。此指标跟踪环中所有实例中最旧的心跳时间戳。您可以执行以下查询来测量环中最旧心跳时间戳的年龄

promql
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 存储的运行时配置文件

yaml
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

  1. 配置 -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.*
  2. 将更改应用到您的 Grafana Mimir 集群。更改发布后,Grafana Mimir 将使用 Consul 作为主 KV 存储,并且所有写入也将镜像到 etcd。
  3. 运行时配置文件中的 multi_kv_config 块中配置 primary: etcd。运行时配置文件中的更改会实时重新加载,无需重启进程。
  4. 等待所有 Mimir 实例重新加载更新的配置。
  5. 运行时配置文件中的 multi_kv_config 块中配置 mirror_enabled: false
  6. 等待所有 Mimir 实例重新加载更新的配置。
  7. 配置 -ingester.ring.store=etcd 并移除 multi 和 Consul 的配置,因为它们不再需要。
  8. 将更改应用到您的 Grafana Mimir 集群。更改发布后,Grafana Mimir 将仅使用 etcd。