从Ganglia故障说起

ganglia是现在市面上比较流行的一个集群健康状态监控系统。它能够提供一整套的图形化报表用以完整的监控集群中各个节点的CPU/内存/网络以及其他需要监控的信息。

这次呢是我们搭建的一套环境,通过ganglia监控,但看似所有的配置都正确,可ganglia的前端主机(web-front)始终无法得到应有的数据。

简单介绍下我们的环境:总共有10台主机的集群,通过eth0与外网相连(10.0.0.0/8网段),通过eth1连接内部的管理网络(192.168.0.0/24网段,DHCP)。ganglia front-end工作在管理网络上,同样通过eth1获得集群中主机的健康信息。
集群中的主机通过组播方式将数据发送给front-end。

首先,从组播开始说。ganglia的组播实现是通过向一个固定的ip:239.2.11.71 发送信息从而达到全网广播的目的。对于这个ip的解释如下:

        IP地址: 239.2.11.71
        所在区域: IANA保留地址 用于多点传送 
        该区域的IP段: 225.0.0.0 - 239.255.255.255

即所有向这个IP发送的消息都被视作向全网端所有的主机发送广播信息。这个应该很好理解。但往往很多情况下有个问题会被忽略,那就是:从哪个NIC向外广播?

这个问题的回答取决于你的路由配置:

~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.239.149.1    0.0.0.0         UG    0      0        0 eth0
10.239.149.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.0.1     0.0.0.0         255.255.255.0   U     0      0        0 eth1

很明显的是,如果我向239.2.11.71发送信息的话,系统会义无反顾的使用eth0通讯。其实本来我打算贴tracepath 239.2.11.71命令的结果,可由于这个地址由于是个组播地址,事实上是不会收到响应的。

既然问题已经找到,那解决起来也是很轻松的,跟解决其他的路由问题完全一样。

~# route add 239.2.11.71 eth1
~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.239.149.1    0.0.0.0         UG    0      0        0 eth0
10.239.149.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.0.1     0.0.0.0         255.255.255.0   U     0      0        0 eth1
239.2.11.71     0.0.0.0         255.255.255.255 UH    0      0        0 eth1

对于ubuntu用户来说如果想要让这条路由每次启动后都能自动生效,那就需要在/etc/network/interface配置的末尾加上一条配置:

up route add 239.2.11.71 eth1

自此,问题解决!当然,如果你用过一段时间的ganglia,你会说对于这个情况,更简单的方法是将组播模式改成单播模式。强制指定数据的接收者就不会有这么奇怪的问题了。但这个方法对于eth1连接的DHCP网络来说,由于IP地址并不固定,还是采用组播的方式比较靠谱一点。

你可能感兴趣的:(网络和安全)