keepalived实现socket server 热机备份
环境:CentOS6.5 x86_64
Keepalived:1.2.14
在使用Keepalived进行负载均衡的备份的时候,由于负载均衡是自己用socket写的,绑定的自然是本地的IP,这时使用Keepalived配置进行热机备份的时候,却无法正常通信。
又研究了一下Keepalived对Linux下Httpd服务的支持:
使用Httpd服务在本地监听一个端口(LISTEN Port),这个时候并没有绑定IP,所以当用其他机子访问用Keepalived设置的VIP的时候(http://VIP:Port),可以正常跳转到Httpd中所设置的html;但当设置加上本机地址时(LISTEN IP:Port),使用http://VIP:Port访问时,无法正常跳转到Httpd中所设置的html。由此可知,在使用VIP访问的时候,Keepalived(VRRP)并没有将VIP转换为真实的IP。
又写了个简单的Socket Server和Client,实现Client向Server发消息,Server回传。在使用Keepalived进行热备的时候,Server也不能直接bind本地地址,这个时候Client和Server无法通信;当将Server直接bind所设置的VIP的时候才可以通信,但是这样的话无法在两台机子上无法同时运行Server(IP:Port都一样,会报错:Address already used)。
解决方案:
Server在绑定IP的时候,采用另一种方式:sockaddr.sin_addr.s_addr = htonl(INADDR_ANY)
INADDR_ANY:INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。
这样就可以实现TCP和UDP Server的热备。