网上有很多Ganglia部署的教程,每一个我都觉得繁琐,我的目的只是用来监控Hadoop测试集群,能即刻使用才是王道,于是我想到通过Rancher部署Ganglia应用服务(类似于我在上一篇文章中部署Jmeter容器集群的方式),以容器的方式一键部署,省去了中间繁琐的安装过程。
第一步:安装部署Docker
1、对于CantOS安装Docker最好是CentOS7,这样可以保证内核至少是3.10(通过uname -r 命令查看),低于这个版本的内核无法安装Docker。
2、使用 root 权限登录 Centos。确保 yum 包更新到最新(sudo yum update)。
3、卸载旧版本(如果安装过旧版本的话)
sudo yum remove docker docker-common docker-selinux docker-engine
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
5、设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
6、直接安装最新版的docker(记住版本宁可最新,也不要低于Rancher所要求的版本)
sudo yum install docker-ce
7、启动并加入开机启动
sudo systemctl start docker
sudo systemctl enable docker
第二步:部署安装Rancher
Rancher最好部署在独立的机器上,毕竟是Docker管理平台,需要有足够的资源和空间,由于我的另一篇文章《搭建Jmeter容器集群平台》已经介绍了Rancher的部署,在这里我就不多写了,而且我用的就是当初部署好的Rancher。
第三步:添加主机
在Rancher->基础架构->主机->添加主机(Custer),直接将页面上的脚本,复制到Ganglia对应的主机(Linux)上运行,举例如下(确保没有防火墙封禁端口):
sudo docker run --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.10 http://172.16.1.30:8080/v1/scripts/5F5DD52AF831DB9BB4AF:1514678400000:JTVmpDRKXUlm1TtU93FgwforgIA
第四步:添加Ganglia容器
先用docker search ganglia命令搜索一下公共库里有哪些可用的ganglia镜像:
我们就用搜索到的第一个镜像就行,安装的方式有两种,一种是直接在主机管理界面上添加容器,如下:
主要是选择要下载调用的镜像,映射的端口,调度规则(设置需要在哪台主机上部署容器,如果不设置的话,就按Rancher的规则从多台主机中挑一台)
另一种方式是我推荐的,就是通过docker-compose配置文件安装,而且是以应用服务的方式对外提供服务:
1、用编辑器编写如下docker-compose.yml:
version: '2'
services:
ganglia:
image: wookietreiber/ganglia
stdin_open: true
tty: true
ports:
- 8649:8649/tcp
- 8651:8651/tcp
- 8652:8652/tcp
- 8661:8661/tcp
- 2003:2003/tcp
- 80:80/tcp
- 6343:6343/udp
labels:
io.rancher.container.pull_image: always
io.rancher.scheduler.affinity:host_label: host.ip=172.17.2.130
和rancher-compose.yml:
version: '2'
services:
ganglia:
scale: 1
start_on_create: true
2、在Rancher的应用->用户->添加应用:输入应用名,选择docker-compose.yml和rancher-compose.yml。
点击【创建】按钮,就能成功创建应用和容器服务。通过http://172.17.2.130/ganglia/就能够直接访问了ganglia了
由于这个镜像安装的ganglia是默认的组播模式(不需要固定的Server IP,比较方便),所以我们以下的监控配置就按组播模式进行配置。
第五步:在hadoop集群节点机器上部署监控代理gmond
yum -y install epel-release
yum -y install ganglia-mond
由于用组播模式,并较省事,什么配置都不用改,为了能让hadoop集群能标识出来,我们改一下cluster name
vi /etc/ganglia/gmond.conf
cluster {
name = "hadoop"
owner = "unspecified"
latlOng= "unspecified"
url = "unspecified"
}
三个hadoop节点(无论主从)全是按这么操作。然后启动各节点的gmood:
systemctl start gmond.service (如果是centos6.5,用service gmond start启动)
systemctl enable gmond.service
由于ganglia容器部署完后,上面自带有gmond节点,为了跟hadoop集群的gmond以示区别,我们进入ganglia容器下,把gmond.conf配置改掉:
vi /etc/ganglia/gmond.conf,按如下把原来的8649端口改成8661(跟hadoop节点监控端口区别开)
第六步:修改ganglia中的gmetad
gmetad会定期检查gmond,从那里拉取数据,并将他们的指标存储在RRD存储引擎中。也可以查询多个集群并聚合指标。所以配好它,才能收集各个节点的监控数据。
进入ganglia容器中,vi /etc/ganglia/gmetad.conf
由于是组播模式,什么都不用动了,主需要修改一下data_source参数如下:
data_source "my cluster" localhost:8661
data_source "hadoop" 10 172.17.2.171:8649 172.17.2.186:8649 172.17.2.187:8649
以上的修改目的是,localhost的监控端口变了,所以加上8661,hadoop是我们新加的监控集群,所以添加一个data_source,每10秒轮询一次,其中监控端口8649是默认的,可以不写。
这样我们就可以重启ganglia容器,然后再回到http://172.17.2.130/ganglia/,就能看到新加入的节点和集群了:
第七步:修改hadoop配置
前面说了那么多,其实都是为了这一步准备,我们要监控hadoop,就必须让hadoop各节点的ganglia metrics接口开放,通过修改hadoop配置文件目录下的hadoop-metrics2.properties:
namenode.sink.ganglia.servers=239.2.11.71:8649
datanode.sink.ganglia.servers=239.2.11.71:8649
jobtracker.sink.ganglia.servers=239.2.11.71:8649
tasktracker.sink.ganglia.servers=239.2.11.71:8649
maptask.sink.ganglia.servers=239.2.11.71:8649
reducetask.sink.ganglia.servers=239.2.11.71:8649
resourcemanager.sink.ganglia.servers=239.2.11.71:8649
nodemanager.sink.ganglia.servers=239.2.11.71:8649
historyserver.sink.ganglia.servers=239.2.11.71:8649
journalnode.sink.ganglia.servers=239.2.11.71:8649
nimbus.sink.ganglia.servers=239.2.11.71:8649
supervisor.sink.ganglia.servers=239.2.11.71:8649
以上标粗部分是通用配置的(其它是在Ambari下的HDP集群建议加配的),另外由于是组播模式,IP需要设置成239.2.11.71(这个IP就能互相找到各个监控与被监控节点,如果不放心,可以在各个节点上添加路由到组播地址ip route add 239.2.11.71 dev eth0)。
另外如果是用Ambari管理的hadoop集群,修改hadoop-metrics2.properties是需要在Ambari管理界面上进行的,通过HDFS的Configs->Advanced完成配置,需要注意的是Ambari本身有一套监控接口(用的是metric_collector,默认是开启的),如果我们要同时用ganglia监控,就要求把ganglia.servers参数的注释去掉,替换servers ip为239.2.11.71,同时ganglia_server应该为允许,可以直接将{% if has_ganglia_server %}和对应的{% endif %}去掉,最终配置为:
# if has_ganglia_server
*.period=60
*.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31
*.sink.ganglia.period=10
# default for supportsparse is false
*.sink.ganglia.supportsparse=true
.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both
.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40
# Hook up to the server
namenode.sink.ganglia.servers=239.2.11.71:8649
datanode.sink.ganglia.servers=239.2.11.71:8649
jobtracker.sink.ganglia.servers=239.2.11.71:8649
tasktracker.sink.ganglia.servers=239.2.11.71:8649
maptask.sink.ganglia.servers=239.2.11.71:8649
reducetask.sink.ganglia.servers=239.2.11.71:8649
resourcemanager.sink.ganglia.servers=239.2.11.71:8649
nodemanager.sink.ganglia.servers=239.2.11.71:8649
historyserver.sink.ganglia.servers=239.2.11.71:8649
journalnode.sink.ganglia.servers=239.2.11.71:8649
nimbus.sink.ganglia.servers=239.2.11.71:8649
supervisor.sink.ganglia.servers=239.2.11.71:8649
resourcemanager.sink.ganglia.tagsForPrefix.yarn=Queue
# endif
保存修改的配置,重启hadoop集群服务。然后不出意外就能看到hadoop的监控指标(如果不行,可以把主从节点和ganglia容器都重启一遍):
最后一步:验证监控结果
最后我们就可以享受监管结果了,不只是能监控hadoop集群的资源使用情况(CPU、内存、磁盘负载、网络负载),还能看到以下的hadoop JvmMetrics监控指标,基本是全面监控。
其实监控方式和原理都与Ambari自带的监控框架一样,所以ganglia是用来满足对传统hadoop集群或其它集群服务器的监控,至于用Ambari或Cloudera Manager部署及管理的Hadoop集群,用管理平台自带的监控框架就行了。但是本文的目的不只是为了说明如何快速构建和应用ganglia监控,而是更想表达容器化是非常有助于我们快速构建测试环境和性能监控环境,这对于性能测试来讲非常重要,特别是我们面对大量云端化或集群化服务的测试。