从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地址并不固定,还是采用组播的方式比较靠谱一点。