Keepalived的安装与配置

简介

  • Keepalived是一个免费开源的,使用C编写的路由软件,主要提供负载均衡(Loadbalancing)和高可用(High-Availability)的功能。
  • 负载均衡的实现依赖于Linux虚拟服务内核模块(IPVS),而高可用则通过VRRP协议实现多台机器之间的故障转移服务。

安装

  • Keepalived主站不提供任何Linux发行包,只提供源代码与代码库,大多数Linux发行版都提供了Keepalived的软件包。
  • 相关地址:Keepalived for LinuxGitHub

CentOS系统

  • 使用yum安装keepalived
1
$ yum install -y keepalived

Ubuntu系统

  • 使用apt安装keepalived
1
$ apt install -y keepalived

All

  • 获取Keepalived的版本信息:
1
$ keepalived -v

配置

参数详解

  • 配置文件路径:/etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Configuration File for keepalived

vrrp_script SCRIPT_NAME {
script "PATH"
interval NUM
weight NUM
}

vrrp_instance INSTANCE_NAME {
state BACKUP
interface INTERFACE
virtual_router_id ROUTER_ID
priority PRIORITY
nopreempt
advert_int NUM
unicast_src_ip SRC_IP
unicast_peer {
PEER_IP
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
VIP[/PREFIX]
}
track_script {
SCRIPT_NAME
}
}
  • SCRIPT_NAME:检查的业务服务是否正常的脚本名称。
  • script:检查业务的命令或者自定义脚本的路径,需要返回0(成功)或非0(失败)。
  • interval:执行脚本的间隔时间。
  • weight:权重,权重值可正可负。
    • +:为正时,当检查结果为0时,相应优先级priority增加权重值。
    • -:为负时,当检查结果为非0时,相应优先级priority减少权重值。
    • 其余结果保持原优先级priority不变。
  • INSTANCE_NAME:自定义VRRP实例的名称,建议设置为与服务相关的名称。
  • state:状态参数,设置节点类型,可选值为MASTERBACKUP
  • interface:监听的网络接口名称,如:eth0ens33
  • virtual_router_id:用于区分多个InstanceVRRP组播,取值范围:[0, 254]。
  • priority:节点的优先级,用于选举Master节点,取值范围:[1, 254]。
  • nopreempt:非抢占模式,允许较低priority作为MASTER
  • advert_int:发送VRRP包的间隔时间,即选举MASTER的间隔。
  • unicast_src_ip:定义发送VRRP单播报文的源地址,即本机IP(默认为组播模式)。
  • unicast_peer:定义接收VRRP单播报文的对端地址。
  • authentication:认证区域。
    • auth_type:认证类型,推荐使用PASS
    • auth_pass:认证密码,最多识别8位;
  • virtual_ipaddress:自定义允许外界访问的虚拟IP(VIP)。
    • VIP:虚拟IP,多个节点必须设置为一样的。
    • PREFIX:定义子网掩码的位数,默认为32,可省略。

配置示例

  • 节点1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Configuration File for keepalived

vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 3
weight -2
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 57
priority 101
nopreempt
advert_int 1
unicast_src_ip 172.18.10.11
unicast_peer {
172.18.10.22
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.10.100
}
track_script {
check_nginx
}
}
  • 节点2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Configuration File for keepalived

vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 3
weight -2
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 57
priority 100
nopreempt
advert_int 1
unicast_src_ip 172.18.10.22
unicast_peer {
172.18.10.11
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.10.100
}
track_script {
check_nginx
}
}
  • 检查Nginx服务的脚本:
1
$ vim /etc/keepalived/check_nginx.sh
1
2
3
4
5
6
7
8
#!/bin/bash

nginx_status=$(systemctl is-active nginx)

if [[ "${nginx_status}" == "inactive" ]]; then
systemctl stop keepalived
exit 0
fi
1
$ chmod +x /etc/keepalived/check_nginx.sh

在VM上使用

现象描述
  • 若需要在VM上使用Keepalived,双节点都使用的是BACKUP模式,但是还可能出现双Master的情况。
  • 具体原因如下:
    • VM已经启动成功时,可能此时网络还互不相通;
    • 由于Keepalived是自启动的,双方都检测到自身的unicast_peer是无法连通的;
    • 双方都启动成功,都配置的是BACKUP模式并配置了nopreempt,但是双方都认为对方挂掉了;
    • 双方自行升级自身的身份为Master,当网络互相连通时,nopreempt参数不再起作用;
    • 由于双方都是Master身份,只能通过priority来选举产生主从节点,导致VIP的非正常漂移;
解决方法
  • 取消Keepalived的自启动;
  • Keepalived的启动放入rc.local中,具体的脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
count=30
peer_ip=$(cat /etc/keepalived/keepalived.conf | grep -A 1 unicast_peer | tail -n 1)
while [ ${count} -gt 0 ]
do
ping -w 2 -c 1 ${peer_ip} >/dev/null 2>&1
if [ $? -eq 0 ]; then
break
fi
sleep 1
count=$((count-1))
done
systemctl start keepalived

有你就有世界,感谢有你,昕!
0%