Oct 24 2008

keepalived failover机制的一些探讨

Category: 技术ssmax @ 14:21:56

一般来说keepalived failover它自动实现了的,不用什么设置,在vip和本机真实ip不同的情况下,这个默认的实现方式是能够工作的,但是当vip就是本机真实ip的时候,默认的设置就不能工作了,看了一下文档,估计就是vrrp的包发不出去,一般使用keepalived 都有内外网两个网卡,其实我们只要设置一下vrrp发的网卡和使用ip,就可以解决这个问题。

这个是master的配置,vip就是eth0上面的真实ip。

vrrp_instance LVS_GZ80 {
state MASTER
interface eth0
mcast_src_ip 172.31.31.80
lvs_sync_daemon_inteface eth1
virtual_router_id 55
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass ooxx
}
virtual_ipaddress {
x.x.55.80
}
}

下面就是backup机的设置
vrrp_instance LVS_GZ229 {
state BACKUP
interface eth0
mcast_src_ip 172.31.31.229
lvs_sync_daemon_inteface eth1
virtual_router_id 55
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass ooxx
}
virtual_ipaddress {
x.x.55.80
}
}

这样子设置,当master的keepalived服务fail了以后,我们能看到backup马上抢到了vip(也是master的真实ip),并且backup机器进入master state,log如下:
Oct 24 13:18:03 localhost Keepalived_vrrp: VRRP_Instance(LVS_GZ229) Transition to MASTER STATE
Oct 24 13:18:04 localhost Keepalived_vrrp: VRRP_Instance(LVS_GZ229) Entering MASTER STATE
Oct 24 13:18:04 localhost Keepalived_vrrp: VRRP_Instance(LVS_GZ229) setting protocol VIPs.
Oct 24 13:18:04 localhost Keepalived_healthcheckers: Netlink reflector reports IP x.x.55.80 added
Oct 24 13:18:04 localhost Keepalived_vrrp: VRRP_Instance(LVS_GZ229) Sending gratuitous ARPs on eth0 for x.x.55.80

当master的keepalived重新起来的时候,vrrp包能发送到backup机上面,backup就把vip重新让出来了。
backup上面可以看到如下log
Oct 24 13:18:22 localhost Keepalived_vrrp: VRRP_Instance(LVS_GZ229) Received higher prio advert
Oct 24 13:18:22 localhost Keepalived_vrrp: VRRP_Instance(LVS_GZ229) Entering BACKUP STATE
Oct 24 13:18:22 localhost Keepalived_vrrp: VRRP_Instance(LVS_GZ229) removing protocol VIPs.

如果没有这样设置的话,当master重新抢到ip之后,backup机并不能从master state进入backup state,在master上的keepalived服务再次fail了以后(master并不是死机,只是服务死了,master仍然占用vip),backup认为自己一直在master状态,并不会发gratuitous ARP包,这样到vip的请求还是回到原来的master。
这种情况下,典型的就是切换恢复以后不能看到上面的log,backup机器仍然运行在master模式。

10 Responses to “keepalived failover机制的一些探讨”

  1. jackbillow says:

    上面说的,你实现了吗?没有任何问题吗?

  2. jackbillow says:

    我这样做时,不成功。
    启动keepalived后,vip在两边都有,都绑定在两边。出现挣用。

  3. jackbillow says:

    yhc_hai@hotmail.com
    有空可以探讨一下。

  4. ssmax says:

    我的服务器是这样子的,eth0接外网,其中一台的真实ip是vip,eth1接内网,内网是交换机,主机之间都是同一个内网的,然后广播的keepalived包就按内网的来发,如果还是抢ip的话你看看priority 有没有设置错,master的应该priority比较大,而且先开master再开backup,应该就不会抢了。

  5. jackbillow says:

    我的机器环境和你一样的,优先没有设置错误。
    你的master机器只直接把vip配置上吗?先到ifcfg-eth0文件里面?

  6. jackbillow says:

    我的机器环境和你一样的,优先没有设置错误。
    你的master机器是直接把vip配上吗?就是说直接把vip配置到ifcfg-eth0文件里面?启动时机器,但不启动keepalived,机器的eth0就有vip这个ip吗?

  7. ssmax says:

    我的机器是这样的
    eth0就一个ip,是lvs的真实ip也是vip
    eth1是内网的ip
    开机的时候不启动keepalived,eth0也会有vip的,因为这个本来就是它的ip,设置好了的,debian在/etc/network/interfaces
    redhat好像就是ifcfg-eht0之类的。sysconfig里面好像。

  8. andre.ease says:

    sb了吧 哈哈

  9. jjj_K says:

    你好:
    你的BACKUP 上的ETH1 和MASTER上的都是用同一个IP 吗 /
    就是设置的VIP?? 我好象不成功 啊

  10. ssmax says:

    我的设置是这样的:
    lvs master : eth0 外网ip + vip(s) / eth1 192.168.x.1 / lo 127.0.0.1
    lvs backup : eth0 外网ip + vip(s) / eth1 192.168.x.2 / lo 127.0.0.1
    负载均衡后台: eth0 外网ip / eth1 192.168.x.3-254 / lo 127.0.0.1 + vip(s)

    每个内网ip和外网ip都不一样,而vip就是一个(或一堆)相同的虚拟ip
    lvs master 和 backup 在lvs生效的时候就会自动把vip加到eth0里面的了。

    eth0是在公网交换机上面,eth1是在内网交换机上面
    一般lvs只有大访问量的时候才会用到,所以最好隔离公网和内网交换机,内网的可以搞到千兆,那样子从lvs到后台机器的速度就可以保证了。。

    另外所有 【负载均衡后台】 都要设置sysctl.conf
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.eth0.arp_announce = 2
    net.ipv4.conf.eth0.arp_ignore = 1

    保证不会响应vip的arp请求。

Leave a Reply