菜单
开源

集群

集群允许一组 Alloy 部署协同工作,以实现工作负载分发和高可用性。它支持水平可扩展的部署,同时将资源和操作开销降至最低。

Alloy 使用最终一致性模型来实现集群。该模型假定所有参与的 Alloy 部署都是可互换的,并且收敛到相同的配置文件。

独立的非集群 Alloy 的行为与单节点集群相同。

您可以通过将 cluster 命令行标志传递给 run 命令来配置集群。

用例

目标自动分发

目标自动分发是集群最简单的用例。它允许所有对等节点上运行的抓取组件在它们之间分发抓取负载。目标自动分发要求同一集群中的所有 Alloy 部署访问相同的服务发现 API 并抓取相同的目标。

您必须通过定义 clustering 块在组件上显式启用目标自动分发。

alloy
prometheus.scrape "default" {
    clustering {
        enabled = true
    }

    ...
}

当节点加入或离开时,集群会检测到状态变化。所有参与的组件会在本地重新计算目标所有权,并在不通过网络明确通信所有权的情况下重新平衡它们正在抓取的目标数量。

目标自动分发允许您动态扩展 Alloy 部署的数量以处理工作负载峰值。它还提供弹性,因为如果某个节点离开,其他对等节点会自动接管目标。

Alloy 使用本地一致性哈希算法来分发目标。平均而言,只有约 1/N 的目标会被重新分发。

请参阅组件参考文档,检查组件是否支持集群,例如

最佳实践

避免因目标过大导致的问题

当您的环境中混合有非常大和平均大小的目标时,避免运行过多的集群实例。虽然集群通常能很好地对目标进行分片以实现负载均衡,但显著的目标大小差异可能导致负载分布不均。当您在多个实例中遇到少量过大的目标时,分配到这些大目标的节点将比其他节点承受更高的负载(例如,在 Prometheus 指标的情况下是 samples/second),可能导致负载均衡不均匀或达到资源限制。在这种情况下,通常最好进行纵向扩展而不是横向扩展,以减少异常大目标的影响。这种方法可以确保您的部署中资源利用更一致,并防止特定实例过载。

使用 --cluster.wait-for-size,但需谨慎

当在单个实例无法处理全部负载的部署中使用集群时,建议使用 --cluster.wait-for-size 标志来确保在接受流量之前达到最小集群规模。但是,配置此值时应留出足够的安全余量,将其设置得远小于您通常预期的运行实例数。当此条件未满足时,启用集群的组件中的实例将完全停止处理流量,因此为任何意外事件留出余地非常重要。

例如,如果您在 Kubernetes 中使用 Horizontal Pod Autoscalers (HPA) 或 PodDisruptionBudgets (PDB),请确保将 --cluster.wait-for-size 标志设置为远低于您的 HPA 和 PDB 最低限允许的值。这可以防止在正常的 Pod 终止或滚动更新等操作期间,当 Kubernetes 实例数量暂时降至这些阈值以下时,流量停止。

我们建议使用 --cluster.wait-timeout 标志为等待期设置一个合理的超时时间,以限制潜在配置错误的影响。适当的超时持续时间应基于您期望您的编排或事件响应团队提供所需实例数量的速度来确定。请注意,超时后,集群可能太小而无法处理流量,并可能遇到进一步的问题。

不需要时请勿启用集群

虽然集群可以扩展到非常多的实例,但它会引入额外的开销,包括日志、指标、潜在的告警和处理要求。如果您没有使用专门支持集群并从中受益的组件,最好根本不启用集群。一个特别常见的错误是在收集日志的 DaemonSet 上启用集群。从挂载节点 Pod 日志收集日志并不能从启用集群中受益,因为每个实例通常只从自己的节点收集日志。在这种情况下,启用集群只会增加不必要的复杂性和资源使用,而不会带来任何功能上的好处。

集群监控和故障排除

您可以使用 Alloy UI 的集群页面监控集群状态。有关更多故障排除信息,请参阅调试集群问题