Pyroscope 分发器
分发器是一个无状态组件,接收来自代理的剖析数据。然后,分发器将数据分成批次,并行发送到多个ingester,在 ingester 之间分片序列,并按配置的复制因子复制每个序列。默认情况下,配置的复制因子为三。
验证
分发器在将数据写入 ingester 之前,会清理和验证收到的数据。由于单个请求可能包含有效和无效的剖析、样本、元数据和示例,分发器只将有效数据传递给 ingester。分发器在其向 ingester 发送的请求中不包含无效数据。如果请求包含无效数据,分发器会返回 400 HTTP 状态码,并且详细信息会出现在响应体中。有关第一个无效数据的详细信息通常由代理记录。
分发器的数据清理包括以下转换:
- 确保剖析具有时间戳,如果未设置,则默认为分发器接收到剖析的时间。
- 分发器将删除值为
0
的样本,并将共享相同堆栈跟踪的样本求和。
复制
分发器将传入的序列分片并在 ingester 之间复制。您可以通过-distributor.replication-factor
标志配置写入每个序列的 ingester 副本数,默认为1
。分发器结合可配置的复制因子,使用一致哈希来确定哪些 ingester 接收给定的序列。
分片和复制使用 ingester 的哈希环。对于每个传入的序列,分发器使用剖析名称、标签和租户 ID 计算哈希值。计算出的哈希值称为令牌。分发器在哈希环中查找令牌,以确定要将序列写入哪些 ingester。
更多信息,请参阅哈希环。
法定人数一致性
由于分发器共享访问相同的哈希环,写入请求可以发送到任何分发器。您也可以在其前面设置无状态负载均衡器。
为了确保查询结果一致,Pyroscope 在读写时使用Dynamo-style法定人数一致性。分发器在向代理推送请求发送成功响应之前,等待来自 n
/2 + 1 个 ingester 的成功响应,其中 n
是配置的复制因子。
分发器之间的负载均衡
我们建议在分发器实例之间随机负载均衡写入请求。如果您在 Kubernetes 集群中运行 Pyroscope,可以定义 Kubernetes Service 作为分发器的入口。
注意:Kubernetes Service 在 TCP 连接之间平衡负载,而不平衡单个 TCP 连接内的 HTTP 请求。如果您启用 HTTP 持久连接(HTTP keep-alive),由于代理使用 HTTP keep-alive,它会对每个推送 HTTP 请求重用同一个 TCP 连接。这可能导致分发器接收到的推送 HTTP 请求分布不均。