Grafana Pyroscope 的 memberlist 和 gossip 协议
Memberlist 是一个 Go 库,它使用基于 gossip 的协议管理集群成员身份、节点故障检测和消息传递。Memberlist 最终一致,并通过尝试通过多条路径与可能死亡的节点通信来部分容忍网络分区。
Pyroscope 使用 memberlist 来实现实例之间的哈希环数据结构。
每个实例都维护一份哈希环的副本。每个 Pyroscope 实例在本地更新哈希环,并使用 memberlist 将更改传播到其他实例。本地生成的更新和从其他实例接收的更新会合并在一起,形成该实例上的当前环状态。
要配置 memberlist,请参考配置 memberlist。
Memberlist 如何传播哈希环更改
当使用基于 memberlist 的 KV 存储时,每个 Pyroscope 实例使用以下技术将哈希环数据结构传播到其他实例
- 仅传播最新更改引入的差异。
- 传播完整的哈希环数据结构。
每隔 -memberlist.gossip-interval
,一个实例会随机选择 -memberlist.gossip-nodes
配置的所有 Pyroscope 集群实例的一个子集,并将最新更改发送到选定的实例。此操作频繁执行,是传播更改的主要技术。
此外,每隔 -memberlist.pullpush-interval
,一个实例会随机选择 Pyroscope 集群中的另一个实例,并传输 KV 存储的全部内容,包括所有哈希环(除非 -memberlist.pullpush-interval
为零,这将禁用此行为)。此操作完成后,两个实例将拥有与 KV 存储相同的内容。此操作计算成本较高,因此执行频率较低。此操作确保哈希环定期协调到共同状态。