概述
Ganglia 是 Hadoop 默认使用的监控系统(Ganglia 官网),功能强大,单台机器即可持续监控数百个 NameNode 集群,本篇文章介绍 Ganglia 集群的部署流程和相关配置,仅适用于 CentOS7 系列。
Ganglia 系统结构
一个简单的 ganglia 系统如下:
可以看到,一个典型的 HDFS Ganglia 集群基本上包括下面三个部分:
-
gmond
- 部署在 Ganglia Server 机器上,负责接收其它机器上的 gmond 进程发送过来的数据,或者其他业务进程通过 ganglia sdk 发送过来的数据(如 NameNode)。
- 部署在被监控机器上,负责收集该机器的 CPU、内存、网络等数据,并发送给 Ganglia Server 机器上的 gmond 进程。
-
gmetad
部署在 Ganglia Server 机器上,负责处理 gmond 进程收到的所有监控数据,生成格式化的 XML 文件,最终以 RRD 数据库的方式,保存到本地磁盘。 -
ganglia-web
上图中没有画出来,同样部署在 ganglia server 机器上,本质上其实就是一个 Apache Http 服务器,它使用 PHP 响应用户的浏览器请求,并返回监控数据,最终显示在用户浏览器上。
ganglia 监控结果
最终,用户在浏览器上看到的 ganglia 监控页面类似下图:
Ganglia Server 机器部署流程
用一台机器作为 Ganglia Server,部署 gmetad, gmond, ganglia-web 等所有 ganglia 的主要进程,这台机器的网络带宽要大,且最好配置 SSD 磁盘。
gmetad
gmetad 是 Ganglia 的主要进程之一,负责对监控数据进行处理,生成格式化的 XML 文件,并最终以 rrd 数据库的方式,保存到本地磁盘上。
-
安装 gmetad(若找不到 package,请先添加 CentOS EPEL 源,参见 CentOS 7添加 EPEL 源,其他软件类似):
yum install ganglia-gmetad
-
配置 gmetad,配置文件为
/etc/ganglia/gmetad.conf
-
定义 ganglia 集群名称,并指定集群中的若干个 gmod 的地址,简单保持默认即可
-
配置 gmetad 响应 XML 查询请求的线程数,默认为4,配置为 20
-
配置 rrd 数据库的存放路径,默认为 /var/lib/ganglia/rrds,根据实际情况配置,最好选择一个 ssd 盘,注意相关目录属主问题
-
- 修改相关路径属主为 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 方式发送.
-
安装 gmod:
yum install ganglia-gmond
-
配置 gmod,配置文件为
/etc/ganglia/gmond.conf
-
配置 UDP 接收地址和缓存大小,这里之所以注释掉组播方式,是因为组播默认不能跨网段传输:
-
配置 UDP 发送地址和端口(配置这个的目的是同时监控 ganglia 机器自身的运行状况),注意需要增加一个 host 配置项:
-
-
增大 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 远吗):
步骤:
-
sysctl -w 调大 UDP 接收缓存为 1G:
sysctl -w net.core.rmem_max=1073741823
-
在
/etc/sysctl.conf
配置文件中增加一项,固化该 UDP 配置:
echo net.core.rmem_max=1073741823 >> /etc/sysctl.conf
-
在 gmond.conf 文件中配置 UDP 接收 buffer 为 1G,上面已经说过。
-
ganglia-web
ganglia-web 也是 Ganglia 的主要进程之一,负责响应浏览器的 http 请求,并返回相应的网页内容以供显示。
-
安装 ganglia-web
yum install ganglia-web
-
配置 ganglia-web http 页面访问权限,具体配置文件为
/etc/httpd/conf.d/ganglia.conf
注释掉所有访问限制,添加Require all granted
,允许所有人访问,如下:
-
配置 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"; # 这一行不要改动
如下图所示:
-
配置 http server 监听端口,具体配置文件为
/etc/httpd/conf/httpd.conf
假设监听端口为 8080,则配置如下:
-
配置时区
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');
,如下所示:
-
启动相关进程
- 启动 httpd
service httpd start
- 启动 gmetad
service gmetad start
- 启动 gmond
service gmond start
- 以 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、内存、网络等使用情况
-
安装 gmod:
yum install ganglia-gmond
-
配置 gmod,配置文件为
/etc/ganglia/gmond.conf
-
配置 UDP 发送地址和端口,注意需要增加一个 host 配置项:
-
同样,由于使用 UDP 单播发送数据,因此需设置
18.PNGsend_metadata_interval
为推荐的 60s,否则 ganglia server 上的 gmond 重启之后,将无法继续接收该机器的这部分数据
-
-
后台启动 gmond
/usr/sbin/gmond
Ganglia Server 高级优化
某人配置下,所有 HDFS 集群 NameNode 的监控数据,都统一发送到一个 Ganglia Server 机器上的 gmond 进程,这会导致这个 gmond 进程负载很高,可能产生比较严重的 UDP 丢包现象,有两种方案来解决丢包问题:
- 增大 UDP 接收缓存
上文中,已将这个 gmond 进程的 UDP 接收缓存增大为 1GB. - 使用 iptables 做负载分摊
接下来主要介绍这种方式。
负载分摊的原理是:使用 iptables 做端口转发,同时用多个 UDP socket 接收监控消息,从根本上解决单个 socket UDP 缓冲区不够导致丢包的问题。
思路
- gmond 进程监听多个 udp 端口,这样就相当于使用了多个 udp socket 接收缓冲区,自然就不存在缓冲区内存不够的问题了。
- 使用 iptables 做端口转发,将机器收到的 ganglia udp 包随机转发给上面那些端口。
步骤
- 配置多 UDP 端口监听
在 Ganglia Server 机器上,对 gmond 进程,除 8649 之外,再额外监听其它多个 UDP 端口,例如 10001-10005 这5个端口,具体配置文件为/etc/ganglia/gmond.conf
,如下所示:
- 使用 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
- 重启 gmond 进程。
网友评论