- 存储
- 分布式文件系统
- 缓存
- 大数据
【免费下载链接】alluxio
Alluxio, data orchestration for analytics and machine learning in the cloud
Alluxio 内置了一套基于 Coda Hale Metrics 库的可配置指标系统(Metrics System),用于采集集群运行状态、诊断性能问题、评估缓存命中效果与 UFS 访问成本。本文以官方 Metrics-System 文档为骨架,深入讲解 Alluxio 指标系统的架构、配置方式、各类 Sink 的使用方法,并结合源码剖析其实现原理,帮助你快速搭建属于自己的 Alluxio 监控体系。
指标系统概述
核心概念:Source 与 Sink
Alluxio 的指标系统遵循经典的 "Source 生成指标、Sink 消费指标" 模型:
- Source(指标源):负责产生原始指标数据,例如 Alluxio 的
JvmSource(JVM 相关指标)和OperationSystemGaugeSet(操作系统指标)。这些 Source 被注册到全局的MetricRegistry中(见 MetricsSystem.java,初始化时即注册了 JVM 的 GC、内存、类加载、线程等 Gauge)。 - Sink(指标出口):决定指标最终被投递到哪里,例如控制台、CSV 文件、JMX、Graphite 或 HTTP Servlet。
- Polling(轮询):指标系统周期性轮询 Source,将指标记录批量传递给各个 Sink。在
MetricsSystem中,Sink 通过反射加载(Class.forName(classPath))并实例化后启动,见 MetricsSystem.java。
指标实例(Instance)
Alluxio 的指标按组件划分为不同的 Instance,每个 Instance 可以独立配置一组 Sink。目前支持以下实例:
| 实例 | 说明 |
|---|---|
| Master | Alluxio Master 进程 |
| Worker | Alluxio Worker 进程 |
| Client | 任何嵌入 Alluxio 客户端库的进程(如 Spark、MapReduce 作业) |
从源码看,MetricsSystem.InstanceType枚举还定义了更多实例类型(JOB_MASTER、JOB_WORKER、PROXY、FUSE、CLUSTER、PROCESS等),见 MetricsSystem.java,也就是说 Job Master/Job Worker、Proxy、FUSE 等进程也都可以上报指标。
注意(HA 模式):当集群以高可用(High Availability)模式运行时,默认情况下Standby Master 不提供指标服务。如需让 Standby Master 也提供指标,需要在配置中设置:
alluxio.standby.master.metrics.sink.enabled=true该属性定义于 PropertyKey.java。
指标类型(Metric Types)
每个指标都属于以下四种类型之一:
| 类型 | 含义 |
|---|---|
| Gauge | 记录一个瞬时值,例如当前已用内存大小 |
| Meter | 衡量事件随时间发生的速率,例如"每秒请求数" |
| Counter | 衡量事件累计发生的次数,例如 RPC 调用总数 |
| Timer | 同时衡量事件的调用速率和耗时分布 |
四种类型均由 Coda Hale Metrics 库提供。从源码可见,MetricsSystem提供了counter()、meter()、timer()、histogram()、registerGaugeIfAbsent()等工厂方法,并支持带标签(Tags)的版本counterWithTags()/meterWithTags()(见 MetricsSystem.java),标签用于区分不同 UFS、不同挂载点的指标。
指标 Sink 配置
支持的 Sink 类型
| Sink | 说明 |
|---|---|
| PrometheusMetricsServlet | 在 Web UI 中添加 Servlet,以 Prometheus 格式提供指标数据 |
| ConsoleSink | 将指标值输出到控制台 |
| CsvSink | 定期将指标数据导出为 CSV 文件 |
| JmxSink | 注册指标,供 JMX 控制台查看 |
| GraphiteSink | 将指标发送到 Graphite 服务器 |
| MetricsServlet | 在 Web UI 中添加 Servlet,以 JSON 格式提供指标数据 |
| Slf4jSink | 将指标写入 SLF4J 日志(模板中亦列出) |
配置文件位置
指标系统通过配置文件进行配置,Alluxio 默认期望该文件位于:
${ALLUXIO_HOME}/conf/metrics.properties如果希望使用自定义路径,可以通过配置属性指定:
alluxio.metrics.conf.file=/path/to/your/metrics.properties该属性在 PropertyKey.java 中定义。若配置了该属性,Alluxio 会将配置文件作为 Java 属性加载(-Dalluxio.metrics.conf.file=xxx),否则默认从${ALLUXIO_HOME}/conf目录自动加载。
配置文件语法
metrics.properties使用以下语法定义 Sink:
sink.[name].[options]=[value]即sink.<sink名称>.<属性名>=<属性值>。其中:
class属性指定 Sink 的全限定类名(必填)- 其余属性为对应 Sink 的可选配置(如轮询周期、单位、目录等)
MetricsConfig通过正则^sink\.(.+)\.(.+)解析配置,将同一名称下的所有属性分组(见 MetricsConfig.java)。同时,为保证向后兼容,配置解析时会自动移除master./worker./*.这类实例前缀(见 MetricsConfig.java),因此旧格式配置master.sink.console.class=...依然可用。
模板文件 conf/metrics.properties.template 中列出了全部可用 Sink 及其默认属性,要点如下:
| Sink | 属性 | 默认值 | 说明 |
|---|---|---|---|
| ConsoleSink | period | 10 | 轮询周期 |
unit | seconds | 轮询周期单位 | |
| CsvSink | period | 10 | 轮询周期 |
unit | seconds | 轮询周期单位 | |
directory | /tmp | CSV 文件存储目录 | |
| MetricsServlet | path | /metrics/json | Web 服务根路径下的路径前缀 |
| PrometheusMetricsServlet | path | /metrics/prometheus | Web 服务根路径下的路径前缀 |
| GraphiteSink | host | 无 | Graphite 服务器主机名 |
port | 无 | Graphite 服务器端口 | |
period | 10 | 轮询周期 | |
unit | seconds | 轮询周期单位 | |
prefix | 空字符串 | 指标名前缀 | |
| Slf4jSink | period | 10 | 轮询周期 |
unit | seconds | 轮询周期单位 | |
filter-class | null | 指标过滤器类 | |
filter-regex | null | 指标过滤正则 |
注意:涉及轮询周期的 Sink,最小允许轮询周期为1 秒,MetricsSystem.checkMinimalPollingPeriod()会校验该限制(见 MetricsSystem.java)。
集群部署提示:如果 Alluxio 部署在集群中,metrics.properties需要分发到所有节点。修改配置后需重启 Alluxio 服务才能生效。
Kubernetes 部署:在 Kubernetes 上配置指标系统,请参考 Metrics On Kubernetes。
此外,Alluxio 的Leading Master 不仅会输出自身的实例指标,还会输出一份集群级聚合指标汇总(如Cluster.BytesReadLocal等,见下文 Web UI 章节),用于从集群视角观察整体运行状况。
默认 HTTP JSON Sink
前提条件
- Alluxio Leading Master 和 Worker:无需任何额外配置,默认已启用。
- Alluxio 独立部署的 FUSE 进程:需在启动独立 FUSE 进程前,于
${ALLUXIO_HOME}/conf/alluxio-site.properties中设置alluxio.fuse.web.enabled=true,FUSE 进程才会提供 Web 端点(含指标服务)。
使用方法
向目标 Alluxio 进程的/metrics/json/端点发送 HTTP 请求,即可获得全部指标的 JSON 快照:
# 从 Alluxio Leading Master 或 Worker 获取 JSON 格式指标 $ curl <LEADING_MASTER_HOSTNAME>:<MASTER_WEB_PORT>/metrics/json/ $ curl <WORKER_HOSTNAME>:<WORKER_WEB_PORT>/metrics/json/ # 示例:获取本机 Master 指标(默认 Web 端口 19999) $ curl 127.0.0.1:19999/metrics/json/ # 示例:获取本机 Worker 指标(默认 Web 端口 30000) $ curl 127.0.0.1:30000/metrics/json/ # 示例:获取本机 Job Master 指标(默认 Web 端口 20002) $ curl 127.0.0.1:20002/metrics/json/ # 示例:获取本机 Job Worker 指标(默认 Web 端口 30003) $ curl 127.0.0.1:30003/metrics/json/ # 设置 alluxio.fuse.web.enabled=true 并启动独立 FUSE 进程后, # 使用其默认 Web 端口获取指标 $ curl <FUSE_WEB_HOSTNAME>:<FUSE_WEB_PORT>/metrics/json/ $ curl 127.0.0.1:49999/metrics/json/从源码看,MetricsServlet是默认启用的 Sink(定义于 MetricsServlet.java),它通过 Jetty Servlet 将MetricRegistry中的全部指标序列化为 JSON 输出。MetricsSystem.allMetrics()方法会遍历注册表中的所有指标,按 Gauge/Counter/Meter/Timer 类型分别取值并返回(见 MetricsSystem.java),对名称中的转义路径(如 UFS 地址中的/与.)也会做反转义处理,便于阅读。
Prometheus Sink 搭建
Prometheus 是一套流行的监控工具,非常适合用来监控 Alluxio 指标的变化趋势。
前提条件
在指标属性文件(默认为$ALLUXIO_HOME/conf/metrics.properties)中添加以下属性:
# 启用 PrometheusMetricsServlet sink.prometheus.class=alluxio.metrics.sink.PrometheusMetricsServlet- 集群部署时,该文件需分发到所有节点;
- 修改配置后需重启 Alluxio 服务;
- 若要在独立 FUSE 进程上启用 Prometheus Sink,同样需在
${ALLUXIO_HOME}/conf/alluxio-site.properties中设置alluxio.fuse.web.enabled=true后再启动 FUSE 进程。
从源码看,PrometheusMetricsServlet通过DropwizardExports将 Coda Hale 的MetricRegistry桥接导出为 Prometheus 格式,Servlet 路径固定为/metrics/prometheus(见 PrometheusMetricsServlet.java)。
使用方法
向目标进程的/metrics/prometheus/端点发送 HTTP 请求,即可获得 Prometheus 格式的指标快照:
# 从 Alluxio Leading Master / Worker / Job Service / 独立 FUSE 获取 Prometheus 格式指标 $ curl <LEADING_MASTER_HOSTNAME>:<MASTER_WEB_PORT>/metrics/prometheus/ $ curl <WORKER_HOSTNAME>:<WORKER_WEB_PORT>/metrics/prometheus/ $ curl <LEADING_JOB_MASTER_HOSTNAME>:<JOB_MASTER_WEB_PORT>/metrics/prometheus/ $ curl <JOB_WORKER_HOSTNAME>:<JOB_WORKER_WEB_PORT>/metrics/prometheus/ $ curl <FUSE_WEB_HOSTNAME>:<FUSE_WEB_PORT>/metrics/prometheus/ # 示例:本机 Master 指标(默认 Web 端口 19999) $ curl 127.0.0.1:19999/metrics/prometheus/ # 示例:本机 Worker 指标(默认 Web 端口 30000) $ curl 127.0.0.1:30000/metrics/prometheus/ # 示例:本机 Job Master 指标(默认 Web 端口 20002) $ curl 127.0.0.1:20002/metrics/prometheus/ # 示例:本机 Job Worker 指标(默认 Web 端口 30003) $ curl 127.0.0.1:30003/metrics/prometheus/ # 示例:本机独立 FUSE 进程指标(默认 Web 端口 49999) $ curl 127.0.0.1:49999/metrics/prometheus/现在你可以让 Grafana、Datadog 等平台直接对接这些 HTTP 端点,读取 Prometheus 格式的指标。
也可以使用下面的示例prometheus.yml配置 Prometheus 客户端来抓取端点,这种方式特别推荐用于对接 Grafana:
scrape_configs: - job_name: "alluxio master" metrics_path: '/metrics/prometheus/' static_configs: - targets: [ '<LEADING_MASTER_HOSTNAME>:<MASTER_WEB_PORT>' ] - job_name: "alluxio worker" metrics_path: '/metrics/prometheus/' static_configs: - targets: [ '<WORKER_HOSTNAME>:<WORKER_WEB_PORT>' ] - job_name: "alluxio job master" metrics_path: '/metrics/prometheus/' static_configs: - targets: [ '<LEADING_JOB_MASTER_HOSTNAME>:<JOB_MASTER_WEB_PORT>' ] - job_name: "alluxio job worker" metrics_path: '/metrics/prometheus/' static_configs: - targets: [ '<JOB_WORKER_HOSTNAME>:<JOB_WORKER_WEB_PORT>' ] - job_name: "alluxio standalone fuse" metrics_path: '/metrics/prometheus/' static_configs: - targets: [ '<FUSE_WEB_HOSTNAME>:<FUSE_WEB_PORT>' ]⚠️ 谨慎选择要轮询的指标:Prometheus 在加工指标名时会改写名称,通常会将
.替换为_,有时还会追加文本。建议先用上述curl命令查看 Prometheus 转换后的实际指标名,再据此配置抓取与告警规则。
CSV Sink 搭建
本节演示如何将采集到的指标写入 CSV 文件。
前提条件
先创建CsvSink的轮询输出目录(若尚未存在):
$ mkdir /tmp/alluxio-metrics然后在指标属性文件(默认为$ALLUXIO_HOME/conf/metrics.properties)中添加以下属性:
# 启用 CsvSink sink.csv.class=alluxio.metrics.sink.CsvSink # CsvSink 的轮询周期 sink.csv.period=1 sink.csv.unit=seconds # CsvSink 的输出目录,请确保该目录已存在! sink.csv.directory=/tmp/alluxio-metrics集群部署时该文件需分发到所有节点,并重启 Alluxio 服务使配置生效。
使用方法
启动 Alluxio 后,包含指标数据的 CSV 文件将出现在sink.csv.directory目录中,文件名与指标名一一对应(例如名为Master.RpcCalls的指标会生成Master.RpcCalls.csv文件,内容按轮询周期逐行追加采样值)。
Web UI 监控
Master Web UI 指标页
除了通过 metrics servlet 或自定义指标配置查看原始指标外,还可以在 Alluxio Leading Master 的 Web 界面中以更易读的方式追踪关键集群性能指标:
http://<leading_master_host>:19999/metrics该页面包含以下信息:
- Alluxio 空间与根 UFS 空间百分比使用率的时序数据
- 集群聚合吞吐量的时序数据,这是评估 Alluxio 缓存有效性的关键指标
- 集群累计执行的 RPC 调用与操作次数
- 每个挂载点累计服务的 API 调用次数,可用来量化 Alluxio 命名空间虚拟化带来的延迟降低与潜在成本节省
页面上的昵称(Nick Name)与原始指标名的对应关系如下:
| 昵称 | 原始指标名 |
|---|---|
| Local Alluxio (Domain Socket) Read | Cluster.BytesReadDomain |
| Local Alluxio (Domain Socket) Write | Cluster.BytesWrittenDomain |
| Local Alluxio (Short-circuit) Read | Cluster.BytesReadLocal |
| Local Alluxio (Short-circuit) Write | Cluster.BytesWrittenLocal |
| Remote Alluxio Read | Cluster.BytesReadRemote |
| Remote Alluxio Write | Cluster.BytesWrittenRemote |
| Under Filesystem Read | Cluster.BytesReadUfsAll |
| Under Filesystem Write | Cluster.BytesWrittenUfsAll |
这些指标的详细说明见 集群指标文档。
其余栏目说明:
Mounted Under FileSystem Read/Mounted Under FileSystem Write:分别展示每个 Alluxio UFS 的Cluster.BytesReadPerUfs.UFS:<UFS_ADDRESS>与Cluster.BytesWrittenPerUfs.UFS:<UFS_ADDRESS>指标;Logical Operations与RPC Invocations:展示 Master 指标 的一部分;Saved Under FileSystem Operations:展示由 Alluxio 命名空间直接完成、未访问 UFS的操作数量。当目标 UFS 为远程或响应缓慢时,性能提升可能非常显著;若底层存储按请求计费,还可节省成本。
基于 Prometheus 的 Grafana Web UI
Grafana 是常用的时序数据可视化与分析软件,可更直观地展示 Alluxio 收集的内存、存储与已完成操作等各类指标变化。Grafana 支持读取 Prometheus 数据,按以下步骤即可快速搭建基于 Grafana + Prometheus 的 Alluxio 监控:
- 按 Grafana 官方安装指南安装 Grafana;
- 下载 Alluxio 的 Grafana 模板 JSON 文件(Dashboard ID:13467);
- 导入模板 JSON 文件创建 Dashboard(参考官方 Dashboard 导入文档);
- 为 Grafana 添加 Prometheus 数据源,自定义名称如prometheus-alluxio;
- 按照 Dashboard 设置说明修改变量并保存Dashboard:
| 变量 | 值 |
|---|---|
alluxio_datasource | 你的 Prometheus 数据源名称(如步骤 4 中的prometheus-alluxio) |
masters | prometheus.yml中配置的 Masterjob_name(如alluxio master) |
workers | prometheus.yml中配置的 Workerjob_name(如alluxio worker) |
alluxio_user | 启动 Alluxio 所用的用户(如alluxio) |
如果 Grafana Dashboard 显示效果如上图,说明监控已成功搭建。当然,你也可以直接修改 JSON 文件或在 Dashboard 上操作,自定义你的监控视图。
仓库的 integration/metrics 目录提供了 Prometheus、OpenTelemetry Collector、Grafana 相关的
docker-compose-master.yaml、docker-compose-worker.yaml、prometheus.yaml、otel-agent-config.yaml等配套文件,可作为快速上手的参考模板。
基于 Prometheus 的 Datadog Web UI
Datadog 同样是类似 Grafana 的指标分析与可视化软件,支持读取 Prometheus 数据。按以下步骤即可快速搭建基于 Datadog + Prometheus 的 Alluxio 监控:
- 按 Datadog 官方文档安装并运行 Datadog Agent;
- 修改
conf.d/openmetrics.d/conf.yaml文件(该文件位置可在 Agent 配置目录文档中查找)。示例conf.yaml:init_config: instances: - prometheus_url: 'http://<LEADING_MASTER_HOSTNAME>:<MASTER_WEB_PORT>/metrics/prometheus/' namespace: 'alluxioMaster' metrics: [ "<Master metric 1>", "<Master metric 2>" ] - prometheus_url: 'http://<WORKER_HOSTNAME>:<WORKER_WEB_PORT>/metrics/prometheus/' namespace: 'alluxioWorker' metrics: [ "<Worker metric 1>", "<Worker metric 2>" ] - 重启 Datadog Agent。
之后 Alluxio 输出的指标就会显示在 Datadog 的 Web 界面中。
JVM 指标采集
如需获取 JVM 相关指标(如堆内存、GC、线程状态等),可以使用jmx_exporter作为 Java Agent 运行:
下载jmx_prometheus_javaagent-0.16.0.jar(可从 Maven 中央仓库获取),然后以如下方式启动你的 Java 程序:
java -javaagent:./jmx_prometheus_javaagent-0.16.0.jar=8080:config.yaml -jar yourJar.jar启动后,指标即可通过http://localhost:8080/metrics访问。
config.yaml提供 jmx_exporter 的配置。空文件即可快速开始使用;如需自定义(如过滤 MBean 或重命名指标),请参考 jmx_exporter 官方文档。
补充说明:Alluxio 自身也在
MetricRegistry初始化时注册了 JVM 指标集,包括JvmAttributeGaugeSet、GarbageCollectorMetricSet、MemoryUsageGaugeSet、ClassLoadingGaugeSet、CachedThreadStatesGaugeSet以及OperationSystemGaugeSet(见 MetricsSystem.java),这些 JVM 指标会随进程自身的 metrics servlet 一并输出,可配合 jmx_exporter 一起使用。
参考与进一步阅读
- 详细的 Alluxio 指标清单见 Metrics-List 文档;
- 存储在 Leading Master 上的指标可通过
fsadmin report metrics命令查看; - 全部 Sink 的完整配置项参考 conf/metrics.properties.template;
- 指标系统核心实现参考 MetricsSystem.java 与 MetricsConfig.java;
- Prometheus / Grafana / OpenTelemetry 的容器化配套参考 integration/metrics。
- 存储
- 分布式文件系统
- 缓存
- 大数据
【免费下载链接】alluxio
Alluxio, data orchestration for analytics and machine learning in the cloud
相关推荐
Alluxio 度量指标系统(Metrics System)完全指南:从 Sink 配置到集群监控实战
Alluxio 度量指标系统(Metrics System)完全指南:从 Sink 配置到集群监控实战 导读 Alluxio 内置一套基于 Coda Hale
存储分布式文件系统缓存大数据Docker4Drupal核心组件解析:Nginx、MariaDB与PHP容器配置实战
Docker4Drupal核心组件解析:Nginx、MariaDB与PHP容器配置实战 Docker4Drupal是一套基于Docker的Drupal开发环境解
10分钟搭建Alluxio Metrics监控体系:Prometheus+Grafana可视化实践指南
你是否还在为分布式存储系统的性能调优和问题排查而烦恼?本文将带你快速搭建Alluxio Metrics监控体系,通过Prometheus收集指标并使用Grafa
存储分布式文件系统缓存大数据
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考