快速搭建 Alluxio 监控系统

个人简介:刘攀,腾讯大数据研发工程师,负责腾讯Presto on Alluxio运营、优化工作,Alluxio社区contributor。

导 语

腾讯Alluxio团队利用Alluxio和Grafana对Prometheus的良好支持以及Grafana的模板构建特性可用于快速搭建Alluxio监控系统,通过简单的修改模板变量即可快速适配Alluxio集群,搭建可配置的Alluxio Grafana监控系统。

背景需求

Alluxio有着十分完善的指标系统,用于监控Alluxio master、worker以及client的行为、状态等信息。Alluxio采用Coda Hale Metrics Library组件实现了可配置的metrics 系统,支持诸如CSV、Graphite、Prometheus等不同类别的metrics sink用于Alluxio状态信息的采集和监控系统的建立。Alluxio提供的master web UI集成了部分metrics的可视化呈现,可以方便观察远程读、短路读等指标,然而相较于更加完善和成熟的metrics采集和可视化系统,Alluxio master web UI的可配置性以及对于定制可视化的支持需要进一步提升。

因此,为了满足实际生产需求,腾讯Alluxio团队基于实际业务需求搭建了基于Prometheus和Grafana的Alluxio监控系统,更加直观、全面地呈现了Alluxio指标信息,同时设计了可复用度高的Grafana模板,实现了Alluxio监控系统的快速搭建、开箱即用,大大降低了 Alluxio 的维护成本,现已在腾讯内部上线使用。

Alluxio Metrics Sink分析

Alluxio 提供的便捷的Sink接口用于用户实现定制化的 metrics sink :

/**
 * Sink consumes the records generated by the metrics source.
 */
public interface Sink {
  /**
   * Starts the reporter polling.
   */
  void start();

  /**
   * Stops the reporter.
   */
  void stop();

  /**
   * Reports the current values of all metrics.
   */
  void report();
}

目前Alluxio内置支持的Sink有:

在这里插入图片描述

其中ConsolesSink、JmxSink、CsvSink 、GraphiteSink以及腾讯Alluxio团队贡献的Slf4jSink都是基于Coda Hale Metrics Library实现的,这些Sink对应的Reporter继承自ScheduledReporter , 提供定时report操作。除此之外,Alluxio维护了两个web metrics sink分别是内建的基于JSON的MetricsServlet和基于Prometheus的 PrometheusSink,这两个Sink服务需要对应的Servlet线程,在Alluxio对应的进程中维护,比如在 master 进程中:

/**
 * An Alluxio Master which runs a web and rpc server to handle FileSystem operations.
 */
@NotThreadSafe
public class AlluxioMasterProcess extends MasterProcess {
  private static final Logger LOG = LoggerFactory.getLogger(AlluxioMasterProcess.class);

  private final MetricsServlet mMetricsServlet = new MetricsServlet(MetricsSystem.METRIC_REGISTRY);
  private final PrometheusMetricsServlet mPMetricsServlet = new PrometheusMetricsServlet(
      MetricsSystem.METRIC_REGISTRY);
    ...
}


Alluxio可以通过metrics.properties开启和配置metrics服务,从而实现了metrics sink的延迟加载和灵活扩展,腾讯基于Alluxio提供的Sink接口实现了内部监控系统的对接。

/**
 * Starts sinks from a given metrics configuration. This is made public for unit test.
 *
 * @param config the metrics config
 */
public static synchronized void startSinksFromConfig(MetricsConfig config) {
  if (sSinks != null) {
    LOG.debug("Sinks have already been started.");
    return;
  }
  LOG.info("Starting sinks with config: {}.", config);
  sSinks = new ArrayList<>();
  Map<String, Properties> sinkConfigs =
      MetricsConfig.subProperties(config.getProperties(), SINK_REGEX);
  for (Map.Entry<String, Properties> entry : sinkConfigs.entrySet()) {
    String classPath = entry.getValue().getProperty("class");
    if (classPath != null) {
      LOG.info("Starting sink {}.", classPath);
      try {
        Sink sink =
            (Sink) Class.forName(classPath).getConstructor(Properties.class, MetricRegistry.class)
                .newInstance(entry.getValue(), METRIC_REGISTRY);
        sink.start();
        sSinks.add(sink);
      } catch (Exception e) {
        LOG.error("Sink class {} cannot be instantiated", classPath, e);
      }
    }
  }
}



整体架构

在这里插入图片描述
Alluxio和Grafana对Prometheus都有很好的支持,直接访问http://<MASTER_HOSTNAME:PORT>/metrics/prometheus或者http://<WORKER_HOSTNAME:PORT>/metrics/prometheus即可获得对应的Alluxio Prometheus metrics,因此采用Prometheus作为监控系统的metrics采集组件合适且易用。

Prometheus持续采集Alluxio侧的metrics,按照不同的metrics生成相应的时间序列供后续可视化链路调用。Prometheus提供了内建的查询语言PromQL方便对metrics进行时间维度的加工和查询。Prometheus的优势尤其体现在其易用性,简单的配置文件和启动指令就能快速实现对指定metrics的抓取。

Grafana提供了对多种不同的metrics的支持,多样化的dashboard配置灵活易用,且支持模板导入,是行业内应用十分广泛的可视化监控组件。我们采用了Grafana的模板特性快速搭建应用于不同 Alluxio 集群的监控系统。

快速搭建

推荐使用的版本:

Alluxio : 2.4.1或 master(edge) 、Prometheus: 2.22.2、Grafana: 7.3.4-1
1 .设置 Prometheus 任务

参考文档快速搭建Prometheus。

修改Prometheus配置文件prometheus.yml,填写对应的 job_name 和 Alluxio 节点信息。在我们的方案中,targets 目录下存储了对应集群的 masters、workers 的 IP 和端口信息,利于Alluxio集群扩缩容。Master和worker的metrics分成不同的scrape job,方便后续Grafana对于 metrics 的分类采集,示例:

# prometheus.yml
- job_name: ' Alluxio  masters'
    metrics_path: /metrics/prometheus
    file_sd_configs:
    - refresh_interval: 1m
      files:
      - "targets/cluster/masters/*.yml"
- job_name: ' Alluxio  workers'
    metrics_path: /metrics/prometheus
    file_sd_configs:
    - refresh_interval: 1m
      files:
      - "targets/cluster/workers/*.yml"
# /target/cluster/masters/masters_01.yml
- targets:
  - "<master_ip>:19999"
# /target/cluster/masters/workers_01.yml
- targets:
  - "<worker1_ip>:30000"
  - "<worker2_ip>:30000"

  1. 导入 Grafana Dashboard

我们将构建的Alluxio监控系统开源在Grafana社区,为Alluxio开发和使用人员提供了简单易用的JSON 模板

启动Grafana Server并登录Grafana Web UI,下载并导入模板。

为了构建复用性强且易用的模板,我们将构建系统所需要的公用部分进行了抽象,总结出4个接口变量用于快读构建Grafana dashboard,通过修改模板变量适配搭建的 Alluxio 集群:

  • alluxio_datasource :注册在Grafana中对应Alluxio的Prometheus数据源;

  • masters :定义在 prometheus.yml 中的 master job_name;

  • workers :定义在 prometheus.yml 中的workres job_name;

  • alluxio _user :启动Alluxio服务的用户
    在这里插入图片描述3. 搭建完成
    根据关键程度、指标类型,我们将Alluxio的metrics分为了7类,分别放置在不同的rows:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

结 语

腾讯Alluxio团队基于Alluxio强拓展性的metrics系统设计,利用Prometheus和Grafana构建了敏捷性高、复用性强的Alluxio监控系统,只需通过简单地修改模板接口变量即可实现快速复用,搭建易用、可配置的Alluxio监控系统。

腾讯Alluxio团队积极参与Alluxio社区建设,也将持续为Alluxio在大数据生态领域的蓬勃发展贡献力量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值