Today I was debugging a problem I had with keepalived not discovering that a real server behind a virtual IP it manages, had died.
The problem was really strange because the check was very, very simple
real_server 192.168.1.65 3306
{
TCP_CHECK
{
connect_port 3306
bindto 192.168.1.65
connect_timeout 2
}
}
This configuration was created after reading keepalived.conf man pages, that talk about these 3 options for the TCP_CHECK, without going in deeper details. So I assumed that bindto IPADDR
has to be used to indicate to which IP address we should connect to do the check. But I was wrong, because with this configuration if the real server behind dies, keepalived doesn’t notice anything at all. This is because the “bindto” option, I guess, is used to choose to which local (to the LVS director) IP address bind to check the external IP:port.
So, changing the configuration to looks like this:
real_server 192.168.1.65 3306
{
TCP_CHECK
{
connect_port 3306
connect_timeout 2
}
}
fixed the problem. Keepalived is a great product and works quite well, but it’s documentation is a bit disappointing.
Hi — I know this is a super old thread, but just for anyone who stumbles across it:
The bindto parameter is not for setting the IP address of the server you are checking. Its so you can control which interface you use to perform the check.
So, if you have an interface eth0 with IP address 192.168.1.1, and eth1 on 192.168.1.2, and you want to check another server on 192.168.1.3, but you specifically want to check it from your eth1 interface, you would use:
bindto 192.168.1.2
That way, if eth1 fails OR connectivity to 192.168.1.3 fails, then the check fails.
JP