前一篇介绍了全部手工安装Ganglia的文章,当时安装测试的环境比较简单。按照网上的步骤安装好,看到图了以为就懂了。Ganglia的基本多播/单播的概念都没弄懂。
这次有机会把Ganglia安装到正式环境,由于网络复杂一些,遇到新的问题。也更进一步的了解了Ganglia。
后端Gmetad(ganglia meta daemon)和Gmond(ganglia monitoring daemon)是Ganglia的两个组件。
Gmetad负责收集各个cluster的数据,并更新到rrd数据库中;Gmond把本机的数据UDP广播(或者单播给某台机),同时收集集群节点的数据供Gmetad读取。Gmetad并不用于监控数据的汇总,是对已经采集好的全部数据处理并存储到rrdtool数据库。
搭建yum环境
由于正式环境没有提供外网环境,所以需要把安装光盘拷贝到机器,作为yum的本地源。
1
2
3
4
5
6
7
8
9
mount -t iso9660 -o loop rhel-server-6.4-x86_64-dvd\[ED2000.COM\].iso iso/
ln -s iso rhel6.4
vi /etc/yum.repos.d/rhel.repo
[os]
name = Linux OS Packages
baseurl = file:///opt/rhel6.4
enabled=1
gpgcheck = 0
再极端点,yum程序都没有安装。到 Packages 目录用 rpm 安装 yum*
。
安装httpd后,把 rhel6.4 源建一个软链接到 /var/www/html/rhel6.4
,其他机器就可以使用该源来进行安装软件了。
1
2
3
4
5
6
cat /etc/yum.repos.d/rhel.repo
[http]
name=LOCAL YUM server
baseurl = http://cu-omc1/rhel6.4
enabled=1
gpgcheck=0
注意:如果用CentOS的ISO会有两个光盘,两个地址用逗号分隔全部加到baseurl(http方式也一样):
1
2
3
4
5
6
[centos-local]
name=Centos Local
baseurl=file:///mnt/cdrom,file:///mnt/cdrom2
failovermethod=priority
enabled=1
gpgcheck=0
使用yum安装依赖
1
2
3
4
5
6
7
8
9
10
yum install -y gcc gd httpd php php-devel php-mysql php-pear php-common php-gd php-mbstring php-cli
yum install -y rrdtool
yum install -y apr*
# 编译Ganglia时加 --with-libpcre=no 可以不安装pcre
yum install -y pcre*
# yum install -y zlib-devel
(仅)编译安装Ganglia 官网有的不再推荐自己手动编译
下载下面的软件(yum没有这些软件):
安装:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
umask 0022 # 临时修改下,不然后面会遇到权限问题
rpm -ivh rrdtool-devel-1.3.8-6.el6.x86_64.rpm
# 如果yum可以安装的话:yum install -y libconfuse*
tar zxf confuse-2.7.tar.gz
cd confuse-2.7
./configure CFLAGS=-fPIC --disable-nls
make && make install
tar zxf ganglia-3.7.2.tar.gz
cd ganglia-3.7.2
./configure --with-gmetad --enable-gexec --enable-status --prefix=/usr/local/ganglia
# 可选项,用于指定默认配置位置 `-sysconfdir=/etc/ganglia`
make && make install
cp gmetad/gmetad.init /etc/init.d/gmetad
chkconfig gmetad on
# 查看gmetad的情况
chkconfig --list | grep gm
df -h # 把rrds目录放到最大的分区,再做个链接到data目录下
mkdir -p /data/ganglia/rrds
chown nobody:nobody /data/ganglia/rrds
ln -s /usr/local/ganglia/sbin/gmetad /usr/sbin/gmetad
gmetad -h # 查看默认的config位置。下面步骤AB 二选一 根据是否配置 sysconfdir 选项
# 步骤A
# cp gmetad/gmetad.conf /etc/ganglia/
# 步骤B
vi /etc/init.d/gmetad
/usr/local/ganglia/etc/gmetad.conf #修改原来的默认配置路径
cd ganglia-3.7.2/gmond/
ln -s /usr/local/ganglia/sbin/gmond /usr/sbin/gmond
cp gmond.init /etc/init.d/gmond
chkconfig gmond on
chkconfig --list gmond
gmond -h # 查看默认的config位置。
./gmond -t >/usr/local/ganglia/etc/gmond.conf
vi /etc/init.d/gmond
/usr/local/ganglia/etc/gmond.conf #修改原来的默认配置路径
配置
1
2
3
4
5
6
7
8
9
10
11
12
vi /usr/local/ganglia/etc/gmetad.conf
datasource "HADOOP" hadoop-master1
datasource "CU" cu-ud1
rrd_rootdir "/data/ganglia/rrds"
gridname "bigdata"
vi /usr/local/ganglia/etc/gmond.conf
cluster {
name = "CU"
udp_send_channel {
bind_hostname = yes
http://ixdba.blog.51cto.com/2895551/1149003
Ganglia的收集数据工作可以工作在单播(unicast)或多播(multicast)模式下,默认为多播模式。
单播:发送自己 收集 到的监控数据到特定的一台或几台机器上,可以跨网段
多播:发送自己收集到的监控数据到同一网段内所有的机器上,同时收集同一网段内的所有机器发送过来的监控数据。因为是以广播包的形式发送,因此需要同一网段内。但同一网段内,又可以定义不同的发送通道。
主机多网卡(多IP)情况下需要绑定到特定的IP,设置bind_hostname来设置要绑定的IP地址。单IP情况下可以不需要考虑。
多播情况下只能在单一网段进行,如果集群存在多个网段,可以分拆成多个子集群(data_source),或者使用单播来进行配置。期望配置简单点的话,配置多个 data_source 。
data_source "cluster-db" node1 node2
定义集群名称,以及获取集群监控数据的节点。由于采用multicast模式,每台gmond节点都有本集群内节点服务器的所有监控数据,因此不必把所有节点都列出来。node1 node2是or的关系,如果node1无法下载,则才会尝试去node2下载,所以它们应该都是同一个集群的节点,保存着同样的数据。
cluster.name
本节点属于哪个cluster,需要与data_source对应。
host.location
类似于hostname的作用。
udp_send_channel.mcast_join/host
多播地址,工作在239.2.11.71通道下。如果使用单播模式,则要写host=node1,单播模式下可以配置多个upd_send_channel
udp_recv_channel.mcast_join
参考思路 (未具体实践):多网段情况可以用单播解决,要是单网段要配置多个data_source(集群)那就换个多播的端口吧!
启动以及测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
service httpd restart
service gmetad start
service gmond start
[root@cu-omc1 ganglia]# netstat -anp | grep gm
tcp 0 0 0.0.0.0:8649 0.0.0.0:* LISTEN 916/gmond
tcp 0 0 0.0.0.0:8651 0.0.0.0:* LISTEN 12776/gmetad
tcp 0 0 0.0.0.0:8652 0.0.0.0:* LISTEN 12776/gmetad
udp 0 0 239.2.11.71:8649 0.0.0.0:* 916/gmond
udp 0 0 192.168.31.11:60126 239.2.11.71:8649 ESTABLISHED 916/gmond
unix 2 [ ] DGRAM 1331526917 12776/gmetad
[root@cu-omc1 ganglia]# bin/gstat -a
CLUSTER INFORMATION
Name: CU
Hosts: 0
Gexec Hosts: 0
Dead Hosts: 0
Localtime: Wed Jun 15 20:17:36 2016
There are no hosts up at this time
netstat -anp | grep -E "gmond|gmetad"
# 启动如果有问题,使用调试模式启动查找问题
/usr/sbin/gmetad -d 10
/usr/local/ganglia/bin/gstat -a
/usr/local/ganglia/bin/gstat -a -i hadoop-master1 查看master1上数据的情况
telnet localhost 8649 - 能抓取数据的配置deaf=no才有绑定到本机IP
telnet localhost 8651
问题:多播地址绑定失败
如果telnet8649没有数据,查看下route是否有 [hostname对应的IP] 到 [239.2.11.71] 的路由!(多网卡多IP的时刻,可能default的路由并非主机名对应IP的地址)
http://llydmissile.blog.51cto.com/7784666/1411239
http://www.cnblogs.com/Cherise/p/4350581.html
测试过程中可能会出现以下错误:Error creating multicast server mcast_join=239.2.11.71 port=8649 mcast_if=NULL family=‘inet4’. Will try again…,系统不支持多播,需要将多播ip地址加入路由表,使用route add -host 239.2.11.71 dev eth0命令即可,将该命令加入/etc/rc.d/rc.local文件中,一劳永逸
1
2
3
4
5
6
7
8
9
10
11
[root@hadoop-master4 ~]# gmond -d 10
loaded module: core_metrics
loaded module: cpu_module
loaded module: disk_module
loaded module: load_module
loaded module: mem_module
loaded module: net_module
loaded module: proc_module
loaded module: sys_module
udp_recv_channel mcast_join=239.2.11.71 mcast_if=NULL port=8649 bind=239.2.11.71 buffer=0
Error creating multicast server mcast_join=239.2.11.71 port=8649 mcast_if=NULL family='inet4'. Will try again...
环境的default route被清理掉了(或者是由于网关和本机不在同一网段)。需要手动添加一条到网卡的route。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@hadoop-master4 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.32.0 * 255.255.255.0 U 0 0 0 bond0
192.168.31.0 192.168.32.254 255.255.255.0 UG 0 0 0 bond0
link-local * 255.255.0.0 U 1006 0 0 bond0
[root@hadoop-master4 ~]# route add -host 239.2.11.71 dev bond0
[root@hadoop-master4 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
239.2.11.71 * 255.255.255.255 UH 0 0 0 bond0
192.168.32.0 * 255.255.255.0 U 0 0 0 bond0
192.168.31.0 192.168.32.254 255.255.255.0 UG 0 0 0 bond0
link-local * 255.255.0.0 U 1006 0 0 bond0
还有就是防火墙!!!!!!
安装GWeb
1
2
3
4
5
6
7
8
9
10
11
12
cd ~/ganglia-web-3.7.1
vi Makefile # 一次性配置好,不再需要去修改conf_default.php
GDESTDIR = /var/www/html/ganglia
GCONFDIR = /usr/local/ganglia/etc/
GWEB_STATEDIR = /var/www/html/ganglia
# Gmetad rootdir (parent location of rrd folder)
GMETAD_ROOTDIR = /data/ganglia
APACHE_USER = apache
make install
# 注意:内网还是需要改下 conf_default.php 一堆jquery的js。
# 如果Web不能访问,查看下防火墙以及SELinux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
htpasswd -c /var/www/html/ganglia/etc/htpasswd.users gangliaadmin
vi /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/ganglia">
# SSLRequireSSL
Options None
AllowOverride None
<IfVersion >= 2.3>
<RequireAll>
Require all granted
# Require host 127.0.0.1
AuthName "Ganglia Access"
AuthType Basic
AuthUserFile /var/www/html/ganglia/etc/htpasswd.users
Require valid-user
</RequireAll>
</IfVersion>
<IfVersion < 2.3>
Order allow,deny
Allow from all
# Order deny,allow
# Deny from all
# Allow from 127.0.0.1
AuthName "Ganglia Access"
AuthType Basic
AuthUserFile /var/www/html/ganglia/etc/htpasswd.users
Require valid-user
</IfVersion>
</Directory>
service httpd restart
如果图出不来,可以看看httpd的错误日志!!!!!!
如果在nginx做权限控制,一样很简单:
1
2
3
4
5
location /ganglia {
proxy_pass http://localhost/ganglia;
auth_basic "Ganglia Access";
auth_basic_user_file "/var/www/html/ganglia/etc/htpasswd.users";
}
集群配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd /usr/local
# for h in cu-ud{1,2} hadoop-master{1,2} ; do echo $h ; done
for h in cu-ud1 cu-ud2 hadoop-master1 hadoop-master2 ; do
cd /usr/local;
rsync -vaz ganglia $h:/usr/local/ ;
ssh $h ln -s /usr/local/ganglia/sbin/gmond /usr/sbin/gmond ;
scp /etc/init.d/gmond $h:/etc/init.d/ ;
ssh $h "chkconfig gmond on" ;
ssh $h "yum install apr* -y" ;
ssh $h "service gmond start" ;
done
# 不同的集群,gmond.conf的cluster.name需要修改
telnet hadoop-master1 8649
netstat -anp | grep gm
要是集群有变动,添加还好,删除的话,会存在原来的旧数据,页面会提示机器down掉了。可以删除rrds目录下对应集群中节点的数据,然后重庆gmetad/httpd即可。
参考
内容
1
2
3
4
5
6
7
8
9
10
11
防火墙规则设置
iptables -I INPUT 3 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -I INPUT 3 -p udp -m udp --dport 8649 -j ACCEPT
service iptables save
service iptables restart
关闭selinux
vi /etc/selinux/config
SELINUX=disabled
setenforce 0
实际应用中,需要监控的机器往往在不同的网段内,这个时候,就不能用gmond默认的多播方式(用于同一个网段内)来传送数据,必须使用单播的方法。
gmond可以配置成为一个cluster,这些gmond节点之间相互发送各自的监控数据。所以每个gmond节点上实际上都会有 cluster内的所有节点的监控数据。gmetad只需要去某一个节点获取数据就可以了。
web front-end 一个基于web的监控界面,通常和Gmetad安装在同一个节点上(还需确认是否可以不在一个节点上,因为php的配置文件中ms可配置gmetad的地址及端口),它从Gmetad取数据,并且读取rrd数据库,生成图片,显示出来。
gmetad周期性的去gmond节点或者gmetad节点poll数据。一个gmetad可以设置多个datasource,每个datasource可以有多个备份,一个失败还可以去其他host取数据。Gmetad只有tcp通道,一方面他向datasource发送请求,另一方面会使用一个tcp端口,发 布自身收集的xml文件,默认使用8651端口。所以gmetad即可以从gmond也可以从其他的gmetad得到xml数据。
对于IO来说,Gmetad默认15秒向gmond取一次xml数据,如果gmond和gmetad都是在同一个节点,这样就相当于本地io请求。同时gmetad请求完xml文件后,还需要对其解析,也就是说按默认设置每15秒需要解析一个10m级别的xml文件,这样cpu的压力就会很大。同时它还有写入RRD数据库,还要处理来自web客户端的解析请求,也会读RRD数据库。这样本身的IO CPU 网络压力就很大,因此这个节点至少应该是个空闲的而且能力比较强的节点。
多播模式配置
这个是默认的方式,基本上不需要修改配置文件,且所有节点的配置是一样的。这种模式的好处是所有的节点上的 gmond 都有完备的数据,gmetad 连接其中任意一个就可以获取整个集群的所有监控数据,很方便。
其中可能要修改的是 mcast_if 这个参数,用于指定多播的网络接口。如果有多个网卡,要填写对应的内网接口。
单播模式配置
监控机上的接收 Channel 配置。我们使用 UDP 单播模式,非常简单。我们的集群有部分机器在另一个机房,所以监听了 0.0.0.0,如果整个集群都在一个内网中,建议只 bind 内网地址。如果有防火墙,要打开相关的端口。
最重要的配置项是 data_source: data_source "my-cluster" localhost:8648
如果使用的是默认的 8649 端口,则端口部分可以省略。如果有多个集群,则可以指定多个 data_source,每行一个。
最后是 gridname 配置,用于给整个 Grid 命名
https://github.com/ganglia/gmond_python_modules
网址
–END