Winse Blog

走走停停, 熙熙攘攘, 忙忙碌碌, 不知何畏.

安装配置Ganglia(2)

前一篇介绍了全部手工安装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 #修改原来的默认配置路径

配置

  • Ganglia配置
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
  • httpd登录密码配置
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

Comments