LVS+Keepalived 主备机之间客户连接列表同步问题

局域网拓扑结构:

Client1:192.168.1.151
Client2:192.168.1.152

LVS1(master):192.168.1.131
LVS2(backup):192.168.1.132

RealServer1:192.168.1.141
RealServer2:192.168.1.142
RealServer3:192.168.1.143

所有机器的操作系统均为:CentOS 6.0 x86_64
kernel-2.6.32-71.el6.x86_64
ipvsadm-1.25-10.el6.x86_64
keepalived-1.2.7-3.el6.x86_64
测试程序:Client向VIP(192.168.1.160)的5000端口持续发送UDP协议数据包
期望目标:在两台LVS多次切换(模拟failover)中,对方都可以继续保持Client与RealSever之间的连接通路。

LVS中的keepalived配置文件如下:
# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
router_id LVS_STUN

vrrp_sync_group VGM {
group {
VI_TEST
}
}
}

vrrp_instance VI_TEST {
state MASTER # 备机此处为BACKUP
interface eth0
lvs_sync_daemon_interface eth0
virtual_router_id 51
mcast_src_ip 192.168.1.131 # 备机此处为192.168.1.132
priority 100 # 备机此处为99
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.160 dev eth0 label eth0:0
}
}

virtual_server 192.168.1.160 5000 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 360
protocol UDP

real_server 192.168.1.141 5000 {
weight 1
MISC_CHECK {
connect_timeout 6
misc_path "/root/testlvs.sh 192.168.1.141"
}
}

real_server 192.168.1.142 5000 {
weight 1
MISC_CHECK {
connect_timeout 6
misc_path "/root/testlvs.sh 192.168.1.142"
}
}

real_server 192.168.1.143 5000 {
weight 1
MISC_CHECK {
connect_timeout 6
misc_path "/root/testlvs.sh 192.168.1.143"
}
}
}

两台LVS的Timeout (tcp tcpfin udp)为:
# ipvsadm -l --timeout
Timeout (tcp tcpfin udp): 900 120 300

一、LVS1和LVS2均正常工作时

LVS1先启动keepalived后,角色自动为Master,通过ipvsadm -lcn看到如下信息:
[root@LVS1 ~]# ipvsadm -lcn
IPVS connection entries
pro expire state source virtual destination
UDP 04:59 UDP 192.168.1.152:42433 192.168.1.160:5000 192.168.1.142:5000
UDP 04:59 UDP 192.168.1.151:34127 192.168.1.160:5000 192.168.1.143:5000
UDP 05:56 UDP 192.168.1.152:0 192.168.1.160:5000 192.168.1.142:5000
UDP 05:52 UDP 192.168.1.151:0 192.168.1.160:5000 192.168.1.143:5000

主机的连接列表中的expire列在非0端口行(上面两行)中为5分钟,此时间应该对应“ipvsadm -l --timeout”中的udp时间;0端口(下面两行)中为6分钟,此时间应该对应keepalived配置文件中的“persistence_timeout 360”,但此6分钟在逐渐减少后又会自动恢复为1分钟(此1分钟时间不知哪里可以设置?),因此这些0端口的连接项在主机中一直存在;

然后启动LVS2的keepalived后,角色自动为Backup,看到如下信息:
[root@LVS2 ~]# ipvsadm -lcn
IPVS connection entries
pro expire state source virtual destination
UDP 04:38 UDP 192.168.1.151:34127 192.168.1.160:5000 192.168.1.143:5000
UDP 04:42 UDP 192.168.1.152:42433 192.168.1.160:5000 192.168.1.142:5000
UDP 02:38 UDP 192.168.1.151:0 192.168.1.160:5000 192.168.1.143:5000
UDP 02:42 UDP 192.168.1.152:0 192.168.1.160:5000 192.168.1.142:5000

备机的连接列表中的expire列在非0端口行(上面两行)中为5分钟,此时间应该对应“ipvsadm -l --timeout”中的udp时间;0端口(下面两行)中为3分钟(此3分钟时间不知哪里可以设置?),但此3分钟在逐渐减少后又会自动恢复,因此这些0端口的连接项在备机中一直存在;

二、当LVS1宕机后(如模拟直接关机),LVS2自动转换为新的Master

由于两边之前的连接列表内容同步,因此在切换LVS后,Client依然保持和先前的RealServer的连接通路;但此时在LVS2上查看“ipvsadm -lcn”如下:
[root@LVS2 ~]# ipvsadm -lcn
IPVS connection entries
pro expire state source virtual destination
UDP 04:59 UDP 192.168.1.151:34127 192.168.1.160:5000 192.168.1.143:5000
UDP 04:59 UDP 192.168.1.152:42433 192.168.1.160:5000 192.168.1.142:5000

原先0端口的两行记录在3分钟倒计时逐渐减少后将不再恢复直至消除。是否有方法在不断开Client的连接情况下可以生成同样链路的0端口记录?
虽然此时Client与RealServer之间的连接通路还会继续保持。

三、在LVS1恢复系统后,自动将LVS2的Master角色切换过来,LVS2重新转换为Backup
此时在LVS1上查看,发现Client与RealServer之间的连接通路重新分配了(不希望发生此类问题!!!)
[root@LVS1 ~]# ipvsadm -lcn
IPVS connection entries
pro expire state source virtual destination
UDP 04:59 UDP 192.168.1.152:34501 192.168.1.160:5000 192.168.1.143:5000
UDP 05:13 UDP 192.168.1.151:0 192.168.1.160:5000 192.168.1.142:5000
UDP 04:59 UDP 192.168.1.151:42650 192.168.1.160:5000 192.168.1.142:5000
UDP 05:13 UDP 192.168.1.152:0 192.168.1.160:5000 192.168.1.143:5000

在LVS2上查看,也更新了0端口的两行连接记录
[root@LVS2 ~]# ipvsadm -lcn
IPVS connection entries
pro expire state source virtual destination
UDP 02:27 UDP 192.168.1.152:0 192.168.1.160:5000 192.168.1.143:5000
UDP 02:28 UDP 192.168.1.151:0 192.168.1.160:5000 192.168.1.142:5000
UDP 04:27 UDP 192.168.1.152:34501 192.168.1.160:5000 192.168.1.142:5000
UDP 04:28 UDP 192.168.1.151:42650 192.168.1.160:5000 192.168.1.143:5000

因此如何保证在第二次切换LVS时,也能保持原有的Client与RealServer之间的连接通路?

汇总问题:
1.LVS Master上的persistence_timeout倒计时完成后,出现的1分钟倒计时从何而来?能否自行设置?
2.LVS Backup上的0端口记录的3分钟倒计时从何而来?能否自行设置?
3.在LVS2转换为新的Master后,如何保持0端口的记录始终存在?
4.在LVS1恢复后再次转换为Master后,能否保持原先的0端口记录而不要重新分配?

说明:可以不使用固定的Master和Backup角色。

Forums:

Grazi for mainkg it nice and EZ.

Learning a ton from these neat arelcits.