监控 Alluxio

指标为了解 Alluxio 集群的健康状况和性能提供了宝贵的见解。Alluxio 以 Prometheus 导出格式arrow-up-right公开指标,从而可以轻松地与现代监控堆栈集成。

本指南介绍了如何监控您的 Alluxio 集群,从使用 Alluxio Operator 提供的预配置仪表板到手动设置您自己的监控。

使用 Alluxio Operator 进行默认监控

在 Kubernetes 上监控 Alluxio 的最简单方法是使用 Alluxio Operator。默认情况下,operator 会在您的 Alluxio 集群旁边部署一个完整的监控堆栈,包括用于指标收集的 Prometheusarrow-up-right 和用于可视化的 Grafanaarrow-up-right

访问 Grafana 仪表板

Grafana 仪表板是可视化集群指标的主要工具。您可以通过两种方式访问它:

1. 通过端口转发访问(推荐)

使用 kubectl port-forward 从您的本地计算机安全地访问 Grafana UI。

# 找到 Grafana pod 并转发端口 3000
kubectl -n alx-ns port-forward $(kubectl -n alx-ns get pod -l app.kubernetes.io/component=grafana -o jsonpath="{.items[0].metadata.name}") 3000:3000

然后,您可以打开浏览器并导航到 http://localhost:3000

2. 通过节点主机名访问

如果您的 Kubernetes 节点在您的网络上可以直接访问,您可以通过其 NodePort 访问 Grafana。

# 获取 Grafana 正在运行的节点的主机名
kubectl -n alx-ns get pod $(kubectl -n alx-ns get pod -l app.kubernetes.io/component=grafana --no-headers -o custom-columns=:metadata.name) -o jsonpath='{.spec.nodeName}'

假设主机名是 foo.kubernetes.org,您可以在 http://foo.kubernetes.org:8080/ 访问 Grafana 服务。

了解仪表板

默认仪表板提供了集群状态的全面概览。

  • 集群部分提供了集群状态的高级摘要。

  • 进程部分详细说明了每个 Alluxio 组件的资源消耗(CPU、内存)和 JVM 指标。

  • 其他部分提供了特定组件(如Coordinator和 worker)的详细指标。

禁用默认 Grafana

如果您希望使用自己的 Grafana 实例,可以通过在 AlluxioCluster 定义中将 spec.grafana.enabled 设置为 false 来禁用默认实例。Prometheus 是一个核心组件,无法禁用。

设置告警规则

进程可用性 - ETCD

字段
取值

组件

进程可用性 - ETCD

指标

etcd_server_has_leader

指标说明

显示每个 etcd 成员当前是否有 leader

查询

sum(etcd_server_has_leader{job="etcd"})

查询说明

汇总当前拥有 leader 的所有 etcd 成员数量

触发条件

value < 3

阈值 / 参考值

期望为 3 个成员

含义

一个或多个 etcd Pod 异常,或者 etcd 集群失去多数派(quorum)

备注

字段
取值

组件

进程可用性 - ETCD

指标

etcd_server_leader_changes_seen_total

指标说明

统计 leader 发生变更的次数

查询

changes(etcd_server_leader_changes_seen_total{job="etcd"}[5m])

查询说明

计算最近 5 分钟内发生了多少次 leader 选举事件

触发条件

> 0 且持续 5 分钟以上

阈值 / 参考值

任意大于 0 的变化

含义

leader 不稳定,通常意味着 etcd 自身不稳定或网络问题

备注

仪表盘上的查询区间需要从 1d 修改为 5m

进程可用性 - Worker 数量

字段
取值

组件

进程可用性 - Worker 数量

指标

up{job="worker"}

指标说明

显示 worker 实例是否存活(Prometheus 抓取时是否有响应)

查询

sum(up{job="worker"})

查询说明

统计当前处于存活状态(up=1)的 worker 目标数量

触发条件

value < 期望的 worker 数量

阈值 / 参考值

小于期望的 worker 数量

含义

一个或多个 worker 已经宕机或无法响应抓取

备注

将期望的 worker 数量设置为生产环境集群的实际规模

进程资源

1)JVM 堆内存使用率

字段
取值

组件

进程资源

指标

jvm_memory_used_bytes

指标说明

显示当前 JVM 堆内存使用量占最大堆内存的百分比

查询

jvm_memory_used_bytes{area="heap"}/jvm_memory_max_bytes{area="heap"}

查询说明

计算当前堆内存使用量 / 最大堆内存,得到堆使用率

触发条件

> 0.75 且持续 5 分钟以上

阈值 / 参考值

75–80%

含义

组件使用了较高比例的堆内存,可能存在内存压力或即将出现频繁 GC 抖动

备注

适用于所有 JVM 组件(coordinator、workers、fuse 等)

2)老年代 GC 总耗时

字段
取值

组件

进程资源

指标

jvm_gc_collection_seconds_sum

指标说明

老年代 GC(Old GC)耗费的总时间

查询

rate(jvm_gc_collection_seconds_sum{gc="G1 Old Generation"}[5m])

查询说明

计算最近 5 分钟内老年代 / Full GC 的每秒耗时

触发条件

> 5s/min 且持续 5 分钟以上

阈值 / 参考值

> 0.083(约等于 5 秒/分钟)

含义

JVM 频繁执行 Full GC,存在明显的停顿风险

备注

建议结合老年代 GC 次数一起使用,以进一步确认问题

3)老年代 GC 次数

字段
取值

组件

进程资源

指标

jvm_gc_collection_seconds_count

指标说明

老年代 GC 的触发频率

查询

rate(jvm_gc_collection_seconds_count{gc="G1 Old Generation"}[5m])

查询说明

计算最近 5 分钟内老年代 / Full GC 的每分钟次数

触发条件

> 1 次/分钟 且持续 5 分钟以上

阈值 / 参考值

> 1

含义

JVM 经常触发 Full GC,通常由内存压力等造成

备注

作为内存压力的早期预警指标

4)新生代 GC 总耗时

字段
取值

组件

进程资源

指标

jvm_gc_collection_seconds_sum

指标说明

年轻代 GC(Young GC)耗费的总时间

查询

rate(jvm_gc_collection_seconds_sum{gc="G1 Young Generation"}[5m])

查询说明

计算最近 5 分钟内年轻代 GC 的每秒耗时

触发条件

> 10s/min 且持续 5 分钟以上

阈值 / 参考值

> 0.166(约等于 10 秒/分钟)

含义

GC 开销较高,会明显拖慢吞吐

备注

仅在问题持续存在时才报警

5)进程 CPU 使用率

字段
取值

组件

进程资源

指标

process_cpu_seconds_total

指标说明

进程累计消耗的用户态 + 内核态 CPU 时间

查询

irate(process_cpu_seconds_total{job=~"$service",instance=~"$instance",cluster_name=~"$cluster"}[5m])

查询说明

计算最近 5 分钟内进程的每秒 CPU 使用率

触发条件

CPU 使用率持续保持在较高水平超过 5 分钟

阈值 / 参考值

> 单核 CPU 的 80%(约 0.8)

含义

进程处于 CPU 绑定(CPU bound)状态或卡死在高 CPU 消耗的逻辑中

备注

阈值可根据节点 vCPU 数量调整;在使用率接近饱和且平稳时才告警


缓存 - 命中率

字段
取值

组件

缓存 - 命中率

指标

alluxio_cached_data_read_bytes_totalalluxio_missed_data_read_bytes_total

指标说明

度量读取数据中,有多少是从缓存返回的、多少是从 UFS 拉取的

查询

sum(irate(alluxio_cached_data_read_bytes_total{job="worker",cluster_name=~"$cluster"}[5m])) / (sum(irate(alluxio_cached_data_read_bytes_total{job="worker",cluster_name=~"$cluster"}[5m])) + sum(irate(alluxio_missed_data_read_bytes_total{job="worker",cluster_name=~"$cluster"}[5m])))

查询说明

计算 5 分钟窗口内的缓存命中率

触发条件

缓存命中率持续偏低超过 5 分钟

阈值 / 参考值

< 80%

含义

大量访问 UFS 的读流量,缓存未被有效利用

备注

阈值可根据实际业务调整(如 70–90%)

缓存 - 利用率

字段
取值

组件

缓存 - 利用率

指标

alluxio_cached_storage_bytesalluxio_cached_capacity_bytes

指标说明

显示当前缓存已用容量占配置总容量的比例

查询

sum(alluxio_cached_storage_bytes{job="worker",cluster_name=~"$cluster"}) / sum(alluxio_cached_capacity_bytes{job="worker",cluster_name=~"$cluster"})

查询说明

计算当前缓存使用量 / 总缓存容量

触发条件

> 0.85(告警),> 0.95(严重) 且持续 5 分钟以上

阈值 / 参考值

85–95% 利用率

含义

缓存接近打满,可能面临频繁淘汰或写失败风险

备注

阈值需要结合集群规模和业务模式调整

缓存 - 淘汰与压力相关性

字段
取值

组件

缓存 - 淘汰与压力相关性

指标

alluxio_cached_evicted_data_bytes_totalalluxio_block_store_used_bytes

指标说明

通过同时观察被淘汰的字节数和当前缓存使用率来判断缓存是否存在压力

查询

(sum(irate(alluxio_cached_evicted_data_bytes_total{job="worker"}[5m])) > 0) and ((sum(alluxio_block_store_used_bytes{job="worker"}) / sum(alluxio_block_store_capacity_bytes{job="worker"})) > 0.8)

查询说明

检查在缓存使用率高于 80% 时是否存在缓存淘汰行为

触发条件

在使用率 > 80% 时,Evictions > 0 且持续 5 分钟以上

阈值 / 参考值

使用率 > 80%,且淘汰字节数 > 0

含义

在高缓存利用率下仍不断出现淘汰,说明缓存处于抖动或强压力状态

备注

需要在监控中手动新增该面板

Fuse - UFS 回退

字段
取值

组件

Fuse - UFS 回退

指标

alluxio_ufs_data_access_bytes_total

指标说明

跟踪 Fuse Pod 直接访问 UFS 的读流量(绕过 Alluxio 缓存)

查询

irate(alluxio_ufs_data_access_bytes_total{job="fuse",method="read",cluster_name=~"$cluster"}[5m])

查询说明

计算 Fuse 发起的 UFS 读流量在 5 分钟窗口内的吞吐率

触发条件

Fuse 的 UFS 回退读流量持续上升 / 保持在较高水平

阈值 / 参考值

持续 > 10 MiB/s 且持续时间 > 5 分钟

含义

Fuse 客户端频繁绕过 Alluxio 缓存直读 UFS,回退占比高

备注

建议结合缓存命中率和请求速率一起观察;通常当回退持续 > 10–20 MiB/s 时值得重点排查

读取吞吐

字段
取值

组件

读取吞吐

指标

alluxio_data_throughput_bytes_total

指标说明

度量 worker 侧对外提供的读取吞吐

查询

sum(irate(alluxio_data_throughput_bytes_total{job="worker",method="read",cluster_name=~"$cluster"}[5m]))

查询说明

计算 worker 在 5 分钟窗口内的总读吞吐

触发条件

worker 读吞吐显著下降

阈值 / 参考值

低于设定基线(例如 < 10 MiB/s)且同时 UFS 读吞吐上升

含义

缓存未有效提供数据,业务流量更多地直接打到了 UFS

备注

阈值需要根据业务正常访问模式进行调优

数据访问

字段
取值

组件

数据访问

指标

alluxio_data_access_bytes_count{method="read"}

指标说明

统计 worker 处理的读请求(read 操作)的次数

查询

irate(alluxio_data_access_bytes_count{method="read",job="worker"}[5m])

查询说明

计算 5 分钟窗口内的读请求速率(请求数/秒)

触发条件

在预期有业务流量的时间段内,请求速率降为 0

阈值 / 参考值

接近 0 且持续 > 5 分钟

含义

worker 没有在提供数据服务 —— 可能是 worker 崩溃、不可用或缓存整体不可用

备注

需要结合业务调度时间窗口来避免误报(如非业务时段的正常“空闲”)

许可证 - 到期时间

字段
取值

组件

许可证 - 到期时间

指标

alluxio_license_expiration_date

指标说明

显示 Alluxio 许可证到期时间(UNIX 时间戳)

查询

(max by (cluster_name) (alluxio_license_expiration_date) - time()) / 86400

查询说明

用许可证到期时间减去当前时间,计算到许可证到期的天数

触发条件

< 30,< 7

阈值 / 参考值

30 天、7 天

含义

许可证即将到期,需要尽快续约,避免服务中断

备注

需要在监控系统中手动新增该面板

许可证 - 版本不一致

字段
取值

组件

许可证 - 版本不一致

指标

alluxio_version_info

指标说明

通过标签中的 version 字段展示各个 Alluxio 组件的运行版本

查询

count(count by (version) (alluxio_version_info)) > 1

查询说明

检查当前是否存在多于一个不同的 Alluxio 版本

触发条件

> 1

阈值 / 参考值

版本数量大于 1

含义

集群中存在 Alluxio 组件版本不一致的情况

备注

需要在监控系统中手动新增该面板

高级:直接查询指标

对于高级分析或调试,您可以直接查询 Prometheus 和组件端点。

使用 Promtool 查询

您可以直接对集群中运行的 Prometheus 服务器执行查询。

查询组件端点

Alluxio 组件(Coordinator、worker、FUSE)公开一个 /metrics/ 端点用于抓取。

有关可用指标的完整列表,请参阅指标参考。

与现有监控系统集成

如果您不使用 Alluxio Operator 或拥有现有的监控基础架构,您可以手动将其与 Alluxio 集成。

与 Prometheus 集成

将以下抓取作业添加到您的 prometheus.yml 以从 Alluxio 收集指标。

独立 Prometheus

对于独立的 Prometheus 实例,请使用 static_configs

Kubernetes 中的 Prometheus

对于在 Kubernetes 中运行的 Prometheus,请使用 kubernetes_sd_configs 自动发现 Alluxio pod。确保您的 Alluxio pod 具有所需的标签和注释。

您的 Alluxio pod 必须具有以下元数据:

与 Grafana 集成

  1. 将 Prometheus 添加为数据源:在 Grafana 中,将您的 Prometheus 服务器添加为新的数据源。

  2. 导入 Alluxio 仪表板:下载官方 Alluxio 仪表板模板并将其导入 Grafana。

与 Datadog 集成

Datadog 可以直接从 Alluxio 的 Prometheus 端点提取指标。

  1. 确保您的 Datadog 代理可以访问 Alluxio 组件的指标端口(Coordinator为 19999,worker 为 30000)。

  2. 在您的 Datadog 配置中,将 Alluxio 端点添加到您的 prometheus.yml 检查配置中。

conf.d/prometheus.d/conf.yaml 片段示例:

此配置允许 Datadog 收集、监控和对您的 Alluxio 集群的指标进行告警。

Last updated