keepalived学习笔记

Keepalived是一个用于实现虚拟路由冗余协议(Virtual Router Redundancy Protocol,VRRP)的开源软件。它旨在提供高可用性和故障恢复能力,用于确保在主服务器发生故障时自动将流量切换到备份服务器。

“高可用”(High Availability,HA)是指系统或服务能够在面对硬件故障、软件故障、网络故障或其他不可预见的事件时,仍能够持续提供正常的运行和可用性。在一个高可用系统中,故障的部分可以被无缝地替代,用户不会感知到服务中断或降级。

Keepalived通过创建一个冗余的虚拟IP(Virtual IP,VIP)地址,使多个服务器共享同一个VIP地址。这些服务器中的一个被配置为主服务器(Master),负责接收和处理所有流量,而其他服务器则处于备份状态(Backup)。主服务器负责将流量传递给后端的真实服务器(Real Servers),备份服务器监控主服务器的状态,并在主服务器发生故障时接管流量。

Keepalived使用VRRP协议来协调主备服务器之间的状态。VRRP是一种网络协议,定义了主服务器的选举和状态转换过程,以及客户端请求的转发。主服务器通过周期性的VRRP广播来宣告自己的存在和状态,并通过VRRP消息协议与备份服务器进行通信,以确保一致性和可靠性。

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
12
13
#安装编译依赖
yum -y install gcc curl openssl-devel libnl3-devel net-snmp-devel
#下载keepalived源码包
wget https://keepalived.org/software/keepalived-2.0.20.tar.gz
#解压源码包
tar -zxvf keepalived-2.0.20.tar.gz
#进入源码包解压目录
cd keepalived-2.0.20
#生成Makefile文件
./configure --prefix=/opt/keepalived
#可以通过指定--sysconf来指定配置文件的安装路径,如:./configure --prefix=/opt/keepalived --sysconf=/etc
#编译并安装
make && make install

二、配置

1
2
#编辑keepalived配置文件
vim /opt/keepalived/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
global_defs {
#运行keepalived服务器的一个标识(每个服务的不一样),可以用作发送邮件的主题信息
router_id keepalived1
}

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(注意:BACKUP节点的优先级应该要比MASTER的小)
priority 100
#指定发送VRRP通告的间隔,单位是秒
advert_int 1
authentication {
#指定认证方式。PASS简单密码认证(推荐)
auth_type PASS
#指定认证使用的密码,最多8位
auth_pass 1111
}
#虚拟IP地址设置虚拟IP地址(需要和以上interface网卡接口的真实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
global_defs {
router_id keepalived2
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.60.222
}
}

keepalived 备节点配置和主节点差不多,只需要修改router_id、state、priority 即可。

三、使用

1. 启动

1
2
3
4
5
6
#启动运行keepalived(通过-f指定配置文件,如果不指定则默认使用的配置文件路径为:/etc/keepalived/keepalived.conf)
/opt/keepalived/sbin/keepalived -f /opt/keepalived/etc/keepalived/keepalived.conf

#防火墙配置
firewall-cmd --permanent --add-protocol=vrrp
firewall-cmd --reload

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
$ 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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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

3. 关闭

验证情景: MASTER 节点宕机或者出现故障时,原本的 MASTER 节点会自动失去虚拟ip,而在 BACKUP 节点上将自动获得虚拟 IP(发生了 IP 飘移)。

操作方式:在原本的MASTER节点中关闭 keepalived,然后查看 MASTER 和 BACKUP 节点的虚拟 IP 情况。

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 /opt/keepalived/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 /opt/keepalived/etc/keepalived/ck_nginx.sh

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

1
vim /opt/keepalived/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%