美文网首页
Ganglia 部署文档

Ganglia 部署文档

作者: xudong1991 | 来源:发表于2021-09-05 11:20 被阅读0次

    概述

    Ganglia 是 Hadoop 默认使用的监控系统(Ganglia 官网),功能强大,单台机器即可持续监控数百个 NameNode 集群,本篇文章介绍 Ganglia 集群的部署流程和相关配置,仅适用于 CentOS7 系列。

    Ganglia 系统结构

    一个简单的 ganglia 系统如下:

    可以看到,一个典型的 HDFS Ganglia 集群基本上包括下面三个部分:

    1. gmond

      • 部署在 Ganglia Server 机器上,负责接收其它机器上的 gmond 进程发送过来的数据,或者其他业务进程通过 ganglia sdk 发送过来的数据(如 NameNode)。
      • 部署在被监控机器上,负责收集该机器的 CPU、内存、网络等数据,并发送给 Ganglia Server 机器上的 gmond 进程。
    2. gmetad
      部署在 Ganglia Server 机器上,负责处理 gmond 进程收到的所有监控数据,生成格式化的 XML 文件,最终以 RRD 数据库的方式,保存到本地磁盘。

    3. ganglia-web
      上图中没有画出来,同样部署在 ganglia server 机器上,本质上其实就是一个 Apache Http 服务器,它使用 PHP 响应用户的浏览器请求,并返回监控数据,最终显示在用户浏览器上。

    ganglia 监控结果

    最终,用户在浏览器上看到的 ganglia 监控页面类似下图:


    Ganglia Server 机器部署流程

    用一台机器作为 Ganglia Server,部署 gmetad, gmond, ganglia-web 等所有 ganglia 的主要进程,这台机器的网络带宽要大,且最好配置 SSD 磁盘。

    gmetad

    gmetad 是 Ganglia 的主要进程之一,负责对监控数据进行处理,生成格式化的 XML 文件,并最终以 rrd 数据库的方式,保存到本地磁盘上。

    1. 安装 gmetad(若找不到 package,请先添加 CentOS EPEL 源,参见 CentOS 7添加 EPEL 源,其他软件类似):
      yum install ganglia-gmetad

    2. 配置 gmetad,配置文件为 /etc/ganglia/gmetad.conf

      • 定义 ganglia 集群名称,并指定集群中的若干个 gmod 的地址,简单保持默认即可


      • 配置 gmetad 响应 XML 查询请求的线程数,默认为4,配置为 20


      • 配置 rrd 数据库的存放路径,默认为 /var/lib/ganglia/rrds,根据实际情况配置,最好选择一个 ssd 盘,注意相关目录属主问题


    1. 修改相关路径属主为 ganglia:ganglia
      假设配置的 ganglia rrd 存储目录为 /dir/for/ganglia/rrds,则需要对其父目录做如下属主设置:
    mkdir -p /dir/for/ganglia/rrds
    chown ganglia:ganglia -R /dir/for/ganglia/
    
    gmond

    gmond 也是 Ganglia 的主要进程之一,负责接收所有 HDFS NameNode 发送过来的监控数据(通过 ganglia SDK),或者其他 gmond 进程发送过来的监控数据,注意 ganglia 的监控数据都以 UDP 方式发送.

    1. 安装 gmod:
      yum install ganglia-gmond

    2. 配置 gmod,配置文件为 /etc/ganglia/gmond.conf

      • 配置 UDP 接收地址和缓存大小,这里之所以注释掉组播方式,是因为组播默认不能跨网段传输:


      • 配置 UDP 发送地址和端口(配置这个的目的是同时监控 ganglia 机器自身的运行状况),注意需要增加一个 host 配置项:


    1. 增大 gmond 进程的 UDP 接收缓存,缓解 ganglia 的 UDP 丢包问题
      这个非常重要,gmod 进程通过 UDP 接收现网所有 NN 发送过来的监控数据(或其他 gmond 进程发送过来的监控数据),UDP 相比 TCP 本身功能较弱。特别的,如果 gmond 进程的 UDP 接收缓存已满,那么它会直接丢弃所有新的 NN metrics 消息,导致监控失真。

      如果按照默认的 kernel 配置,可能导致 ganglia 大量丢包(通过 netstat -s -u 可以查看),必须增大 gmond 进程的 UDP 接收缓存。centos7 kernel 的 udp socket 最大接收缓存默认设置为 224K(通过 /proc/sys/net/core/rmem_max 控制)。根据手动测试结果,这个最大可以设置到1G(在现网机器上手动尝试得到,这个内核配置项的极值写死在 linux kernel 代码中,具体多大需要参考 kernel 远吗):

      步骤:

      1. sysctl -w 调大 UDP 接收缓存为 1G:
        sysctl -w net.core.rmem_max=1073741823

      2. /etc/sysctl.conf 配置文件中增加一项,固化该 UDP 配置:
        echo net.core.rmem_max=1073741823 >> /etc/sysctl.conf

      3. 在 gmond.conf 文件中配置 UDP 接收 buffer 为 1G,上面已经说过。

    ganglia-web

    ganglia-web 也是 Ganglia 的主要进程之一,负责响应浏览器的 http 请求,并返回相应的网页内容以供显示。

    1. 安装 ganglia-web
      yum install ganglia-web

    2. 配置 ganglia-web http 页面访问权限,具体配置文件为 /etc/httpd/conf.d/ganglia.conf
      注释掉所有访问限制,添加 Require all granted,允许所有人访问,如下:

    3. 配置 rrd 数据库位置,具体配置文件为 /etc/ganglia/conf.php
      假设 gmetad 的 rrd_rootdir 为 /dir/for/ganglia/rrds,则 ganglia-web 中应配置

    $conf['gmetad_root'] = "/dir/for/ganglia"; # 这一行根据实际情况配置
    $conf['rrds'] = "${conf['gmetad_root']}/rrds";  # 这一行不要改动
    

    如下图所示:


    1. 配置 http server 监听端口,具体配置文件为 /etc/httpd/conf/httpd.conf
      假设监听端口为 8080,则配置如下:

    2. 配置时区
      gmetad 生成 rrd 数据时使用的时区,和 PHP 本身使用的时区,可能并不一致,最终导致监控页面上数据的时区漂移,这里需要将两者统一设置为 Asia/Shanghai,即北京时间.

      • 配置 gmetad 生成 rrd 数据时使用的时区
        /etc/ganglia/conf.php 中,增加时区配置 $conf['rrdtool'] = "env TZ='Asia/Shanghai' /usr/bin/rrdtool";,如下所示:

      • 配置 PHP 时区
        /usr/share/ganglia/header.php 中,增加时区配置 date_default_timezone_set('Asia/Shanghai');,如下所示:

    启动相关进程
    1. 启动 httpd
      service httpd start
    2. 启动 gmetad
      service gmetad start
    3. 启动 gmond
      service gmond start
    4. 以 debug 模式启动 gmetad 和 gmond,用于定位问题时使用
      /usr/sbin/gmetad -d 10
      /usr/sbin/gmond -d 10
    使用浏览器访问 ganglia server

    通过浏览器,访问 ganglia server,例如(假设为 ganglia-web 的 http 端口为 8080):
    http://ganglia_server:8080/ganglia

    NameNode 机器部署流程

    NameNode

    etc/hadoop/hadoop-metrics2.properties 中,添加下面的配置(替换 "Ganglia机器IP地址"),将 NN 的所有监控数据发送给 ganglia 处理,并重启 NN 生效:

    *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31
    *.sink.ganglia.period=60
    
    namenode.sink.ganglia.servers=Ganglia机器IP地址:8649
    
    *.source.filter.class=org.apache.hadoop.metrics2.filter.RegexFilter
    namenode.sink.ganglia.source.filter.exclude=NNTopUserOpCounts
    
    *.metric.filter.class=org.apache.hadoop.metrics2.filter.RegexFilter
    namenode.source.metric.filter.exclude=Caller\(.*\)\..*
    
    gmond

    NameNode 机器上,额外安装 gmond,目的是收集机器整体的 CPU、内存、网络等使用情况

    1. 安装 gmod:
      yum install ganglia-gmond

    2. 配置 gmod,配置文件为 /etc/ganglia/gmond.conf

      • 配置 UDP 发送地址和端口,注意需要增加一个 host 配置项:


      • 同样,由于使用 UDP 单播发送数据,因此需设置 send_metadata_interval 为推荐的 60s,否则 ganglia server 上的 gmond 重启之后,将无法继续接收该机器的这部分数据

        18.PNG
    3. 后台启动 gmond
      /usr/sbin/gmond

    Ganglia Server 高级优化

    某人配置下,所有 HDFS 集群 NameNode 的监控数据,都统一发送到一个 Ganglia Server 机器上的 gmond 进程,这会导致这个 gmond 进程负载很高,可能产生比较严重的 UDP 丢包现象,有两种方案来解决丢包问题:

    1. 增大 UDP 接收缓存
      上文中,已将这个 gmond 进程的 UDP 接收缓存增大为 1GB.
    2. 使用 iptables 做负载分摊
      接下来主要介绍这种方式。

    负载分摊的原理是:使用 iptables 做端口转发,同时用多个 UDP socket 接收监控消息,从根本上解决单个 socket UDP 缓冲区不够导致丢包的问题。

    思路
    1. gmond 进程监听多个 udp 端口,这样就相当于使用了多个 udp socket 接收缓冲区,自然就不存在缓冲区内存不够的问题了。
    2. 使用 iptables 做端口转发,将机器收到的 ganglia udp 包随机转发给上面那些端口。
    步骤
    1. 配置多 UDP 端口监听
      在 Ganglia Server 机器上,对 gmond 进程,除 8649 之外,再额外监听其它多个 UDP 端口,例如 10001-10005 这5个端口,具体配置文件为 /etc/ganglia/gmond.conf,如下所示:
    1. 使用 iptables 做端口转发
      在 Ganglia Server 机器上,将收到的所有目标端口为 8649 的 UDP 包(这是各个 NameNode 和其它 gmond 发送给本机 gmond 进程的监控消息),随机转发到本机的 10001-10005 端口:
    iptables -t nat -A PREROUTING  -p udp --dport 8649 -j REDIRECT --to-ports 10001-10005 --random
    service iptables save
    
    1. 重启 gmond 进程。

    相关文章

      网友评论

          本文标题:Ganglia 部署文档

          本文链接:https://www.haomeiwen.com/subject/gcixwltx.html