一般用不上,用上找破头。今天公司生产环境搭了一套keepalived,由三台主机组成,Master IP:10.8.5.110,Backup1 IP:10.8.5.111,Backup2 IP:10.8.5.112。搭建很顺利,但是……发现vIP始终访问不了。登录服务器后发现,vIP在三台主机上都存在。这不脑裂了么,防火墙关了,各主机间都能正常互访,配置文件检查无误,这是为什么?突然想到个问题keepalived是使用VRRP协议来做的,它默认是通过224.0.0.18组播地址进行互相通信。现在的情况应该是它们之间的组播地址无法访问,导致了三个keepalived互相无法协商,三台主机各自认为自己是主,所以vIP就在三台主机上都存在了。
那么问题来了,怎么测试组播地址是否可用。一般都是使用ping来进行测试网络通断。但是组播地址是特殊地址,ping是搞不定的。翻了翻以前的记录,找到了可以使用socat来测试。
首先执行ip maddr show查看本机上是否已存在组播组,因为是生产环境,所以这里就不拍照了。在我三台主机的信息里都有224.0.0.18。那么说明这个以224.0.0.18的组播组已经建立了。
下面随便找一台主机作为组播服务端,这里就用Master做为组播服务端。在服务端执行如下命令:
socat -u UDP4-RECVFROM:11220,ip-add-membership=225.0.0.18:10.8.5.110 STDOUT
上面的命令表示在地址为10.8.5.110的接口监听组播地址225.0.0.18,UDP端口11220发来的组播消息。这个端口可以自己定,测试嘛,想写啥都行,只要在合法端口范围,别冲突就行。
然后以10.8.5.111作为组播客户端,向服务端发送组播消息。命令如下:
echo "test"| socat - UDP4-DATAGRAM:225.0.0.18:11220,broadcast
如果服务端可以收到test,那么说明组播组是可以互访的。如果没有收到消息,那么就去排查安全组、防火墙之类的数据报过滤组件吧。
大概就是这么个思路,希望可以帮到需要的人。