dpvs icon indicating copy to clipboard operation
dpvs copied to clipboard

keepalived的vip检查似乎有问题

Open silveric10 opened this issue 3 years ago • 5 comments

tools/keepalived/keepliaved/check/ipvswrapper.c 这个接口

static void
update_vsge_alive_count(virtual_server_group_entry_t *vsge, const virtual_server_t *vs, bool up)
{
	unsigned *alive_p;

	if (vsge->is_fwmark) {
		if (vs->af == AF_INET)
			alive_p = &vsge->fwm4_alive;
		else
			alive_p = &vsge->fwm6_alive;
	}
	else if (vs->service_type == IPPROTO_TCP)
		alive_p = &vsge->tcp_alive;
	else if (vs->service_type == IPPROTO_UDP)
		alive_p = &vsge->udp_alive;
	else
		alive_p = &vsge->sctp_alive;

	if (up)
		(*alive_p)++;
	else
               (*alive_p)--; // 这个值可能本身已经是0了,再去做--导致溢出,后面的clear diff vip的检查就会失败,导致已失效的vip没有成功清除掉
}

silveric10 avatar Aug 12 '20 08:08 silveric10

可否给一个能够复现这个问题的配置实例?

ywc689 avatar Aug 14 '20 10:08 ywc689

比如定义一个 virtual_server_group vip_group_1_80 { 1.1.1.1 80 } 之后修改keepalived.conf 将这个vip group修改成 virtual_server_group vip_group_1_80 { 2.2.2.2 80 }

然后 “kill -s 1 $(cat /var/run/keepalived.pid)” 一般都能复现,通过./ipvsadm -ln 可以看到 1.1.1.1还在,但是telnet确实是发现已经停止服务了

silveric10 avatar Aug 17 '20 02:08 silveric10

@silveric10 Hi,想请问一下你们的VIP ,dpip addr是通过什么方式添加的,quorum_up/down 里面配置的是dpip addr add/del命令,还是脚本,如果是脚本,那是否传VIP参数呢?

azura27 avatar Aug 25 '20 01:08 azura27

@silveric10 Hi,想请问一下你们的VIP ,dpip addr是通过什么方式添加的,quorum_up/down 里面配置的是dpip addr add/del命令,还是脚本,如果是脚本,那是否传VIP参数呢?

你好,我们的配置都是通过脚本手动配的,在dpvs起来之后一次性配置进去,包括VIP和local ip. Keepalived.conf配置文件里面没有用到quorum

silveric10 avatar Aug 25 '20 02:08 silveric10

我用你提供的测试用例在 DPVS v1.9.0 上没有复现这个问题。对比了 keepalived v2.0.9 的原始代码,DPVS keeplived 没有修改 update_vsge_alive_count 这个接口。

ywc689 avatar Jan 05 '22 08:01 ywc689