keepalived学习笔记

Keepalived是一个开源(遵循 GPLv2 协议)的、基于 VRRP 协议的轻量级服务高可用和负载均衡方案,提供避免服务器单点故障和请求分流的能力。它为 Nginx 扩展了高可用能力,共同组成完整的 Web 服务集群模式(高可用+负载均衡)

VRRP(Virtual Route Redundancy Protocol)协议,翻译过来为虚拟路由冗余协议。VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP,而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,MASTER实现针对虚拟路由器IP的各种网络功能。其他设备不拥有该虚拟IP,状态为BACKUP,除了接收MASTER的VRRP状态通告信息以外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。Master路由和Backup路由之间会有一个心跳检测,Master会定时告知Backup自己的状态,如果在指定的时间内,Backup没有接收到这个通知内容,Backup就会替代Master成为新的Master(如果有多个BACKUP,那么会选举其中一个优先级高的作为MASTER)。Master路由有一个特权就是虚拟路由和后端服务器都是通过Master进行数据传递交互的,而备份节点则会直接丢弃这些请求和数据,不做处理,只是去监听Master的状态。

image-20220704074545925

如上图Keepalived实现Nginx负载均衡的原理就是在两个Nginx节点中引入虚拟IP的概念(每台Nginx都安装Keepalived并都配置同一个虚拟IP),其中一台Nginx宕机,那么虚拟Ip将会飘移到另一台Nginx上去,而客户端就是通过这个虚拟IP来访问Nginx的。

一、安装

1
2
3
4
5
6
7
8
9
10
11
#安装编译依赖
yum -y install gcc curl openssl-devel libnl3-devel net-snmp-devel
#下载keepalived源码包
wget https://keepalived.org/software/keepalived-2.0.20.tar.gz
#解压到指定目录
mkdir /opt/keepalived
tar -zxvf keepalived-2.0.20.tar.gz -C /opt/keepalived/
#对keepalived进行配置,编译和安装
cd /opt/keepalived/keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local
make && make install

二、配置

1
2
#编辑keepalived配置文件
vim /etc/keepalived/keepalived.conf

服务器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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
! Configuration File for keepalived

global_defs {
#通知邮件,当keepalived发生切换时需要发email给具体的邮箱地址
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
#设置发件人的邮箱信息
notification_email_from Alexandre.Cassen@firewall.loc
#指定smpt服务地址
smtp_server 192.168.200.1
#指定smpt服务连接超时时间
smtp_connect_timeout 30
#运行keepalived服务器的一个标识(每个服务的不一样),可以用作发送邮件的主题信息
router_id keepalived1
#默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)
vrrp_skip_check_adv_addr
#注释掉严格遵守VRRP协议,否则无法正常使用虚拟ip,如ping
#vrrp_strict
#在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0
vrrp_garp_interval 0
#在一个网卡上每组na消息之间的延迟时间,默认为0
vrrp_gna_interval 0
}

vrrp_instance VI_1 {
#有两个值可选MASTER主 BACKUP备(可以都设置为BACKUP,让keepalived自己根据priority值大小自己选举MASTER)
state MASTER
#vrrp实例绑定的网卡接口名称(可以通过ifconfig命令查看),用于发送VRRP
interface ens33
#指定VRRP实例ID(相同虚拟ip的多个服务该值要相同),范围是0-255
virtual_router_id 51
#指定优先级,优先级高的将成为MASTER
priority 100
#指定发送VRRP通告的间隔,单位是秒
advert_int 1
authentication {
#指定认证方式。PASS简单密码认证(推荐)
auth_type PASS
#指定认证使用的密码,最多8位
auth_pass 1111
}
#虚拟IP地址设置虚拟IP地址(需要和以上网卡接口的真实ip在同一网段),供用户访问使用,可设置多个,一行一个
virtual_ipaddress {
192.168.60.222
}
}

以上配置中没有特别需求的话,最简单就是修改router_id、vrrp_strict、state、interface、priority、virtual_ipaddress三处地方即可。

服务器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
31
32
33
! Configuration File for keepalived

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id keepalived2
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
#BACKUP节点设置比MASTER的小
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.60.222
}
}

防火墙配置:

1
2
firewall-cmd --permanent --add-protocol=vrrp
firewall-cmd --reload

三、使用

1. 启动

1
/usr/local/sbin/keepalived

2. 测试

测试效果如下:

通过查看MASTER节点服务器的所有ip时,能够发现在MASTER节点的网卡接口ens33中多出了192.168.60.222这个虚拟ip地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost nginx-1.14.0]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:34:1d:18 brd ff:ff:ff:ff:ff:ff
inet 192.168.60.101/24 brd 192.168.60.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.60.222/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe34:1d18/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost nginx-1.14.0]#

而通过查看BACKUP节点服务器的所有ip时,不会出现虚拟ip地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost nginx-1.14.0]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:be:9b:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.60.102/24 brd 192.168.60.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:febe:9b55/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost nginx-1.14.0]#

3. 关闭

为了验证MASTER节点宕机或者出现故障时,原本的MASTER节点失去虚拟ip,而BACKUP节点上将获得虚拟ip(发生了IP飘移),可以通过在原本的MASTER节点中关闭keepalived:

1
2
3
4
5
6
7
#关闭
ps -ef | grep keepalived
kill -9 进程号

#使用killall来杀掉进程会更方便
yum install psmisc -y
killall keepalived

4. 脚本

keepalived的作用其实也就是给多个服务器中加入唯一的虚拟IP,但关注到具体业务的话,还存在许多问题,比如做Nginx高可用的情况下,假设有两个Nginx节点,其中一台Nginx出现故障不可用,而其所在的服务器还在正常运行,所以其对应的keepalived程序也正常运行,很显然这是不会发生了IP飘移的。而我们的目的是Nginx出现故障不可用时其对应的keepalived也应该要跟着关掉,这样虚拟ip才会飘移到BACKUP节点。

keepalived允许我们通过编写脚本对业务进程进行检测监控。

1
vim /etc/keepalived/ck_nginx.sh

内容如下:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
#注意nginx的安装路径
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
#需要安装psmisc:yum install psmisc -y
killall keepalived
fi
fi
1
2
#为脚本文件设置执行权限
chmod 755 /etc/keepalived/ck_nginx.sh

将脚本添加到keepalived配置文件中

1
vim /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
#加入以下vrrp_script
vrrp_script ck_nginx {
#执行脚本的位置
script "/etc/keepalived/ck_nginx.sh"
#执行脚本的周期,秒为单位
interval 2
#权重的计算方式
weight -20
}

vrrp_instance VI_1 {
state MASTER
interface ens33
...
...
virtual_ipaddress {
192.168.200.111
}
#加入以下track_script
track_script {
ck_nginx
}
}

6. 日志

1
tail -f /var/log/messages


----------- 本文结束 -----------




如果你觉得我的文章对你有帮助,你可以打赏我哦~
0%