keepalived

简介:

keepalived服务是一个高可用服务,用于解决服务器单点故障,保证服务器能执行高可用。一般keepalived于lvs一起使用,本身其就有检查lvs的状态功能。

keepalived基于VRRP协议,VRRP是虚拟路由器冗余协议,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

keepalived配置完毕以后,根据配置文件内容,会将多个服务器定义为一组实例,生成一个或多个虚拟IP和虚拟MAC地址,一般为一个主节点和一个(或多个)备用节点,正常情况下其VIP(虚拟IP)和对应MAC地址会在主节点中监听并向外提供服务,当主节点出现故障时,其备用节点就会监听其IP代替主节点提供服务(如有多个备用节点会根据其优先级大小对比)。所以对用户来说,即使挂掉一个或多个服务器仍能正常访问到,也就实现了高可用。

1.安装

安装一般有两种方式,yum或者源码安装,yum安装的话阿里云或者国内常见源都有keepalived的包,如果是源码安装就需要去官方下载

官方地址:https://keepalived.org/

yum安装:

1
2
3
yum list keepalived

yum -y install keepalived

源码安装:

1
2
3
4
5
6
7
tar -xvf keepalived-2.2.1.tar.gz

cd keepalived-2.2.1

./configure --prefix=/usr/local/keepalived

make&&make install

2.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
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
! Configuration File for keepalived
global_defs { #全局定义部分
notification_email { #设置报警邮件地址,可设置多个
acassen@firewall.loc #接收通知的邮件地址
}
notification_email_from test0@163.com #设置 发送邮件通知的地址
smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
smtp_connect_timeout 30 #设置 连接 smtp server的超时时间
router_id LVS_DEVEL #主机标识,用于邮件通知
vrrp_skip_check_adv_addr
vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。
}
vrrp_sync_group {
group{
VI_1
VI_2
}
}
vrrp_script chk_nginx_service { #VRRP 脚本声明
script "/etc/keepalived/chk_nginx.sh" #周期性执行的脚本
interval 3 #运行脚本的间隔时间,秒
weight -20 #权重,priority值减去此值要小于备服务的priority值
fall 3 #检测几次失败才为失败,整数
rise 2 #检测几次状态为正常的,才确认正常,整数
user keepalived_script #执行脚本的用户或组
}

vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
interface ens33 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.130
}
track_script { #脚本监控状态
chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
}
notify_master "/etc/keepalived/start_haproxy.sh start" #当前节点成为master时,通知脚本执行任务
notify_backup "/etc/keepalived/start_haproxy.sh stop" #当前节点成为backup时,通知脚本执行任务
notify_fault "/etc/keepalived/start_haproxy.sh stop" #当当前节点出现故障,执行的任务;
}

virtual_server 192.168.119.130 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}

vrrp_instance VI_2 { #vrrp 实例部分定义,VI_1自定义名称
state BACKUP #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备)
interface ens33 #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 52 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 90 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.131
}
}

virtual_server 192.168.119.131 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 #同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}

配置段分为几大块:

global_def:

该配置段为全局配置段,一般用于配置邮件发送或keepalived协议相关配置。

这个配置段可不配置,一般不会影响正常使用

vrrp_script:

用于定义检测脚本,定义了以后需在vrrp_instance中指定该脚本。

vrrp_instance:

定义一个虚拟路由器实例,在其中需定义该服务器的实例状态(master or backup),路由器id,绑定的网卡等信息,多个服务器就是通过该配置段来判断是否为同一个虚拟路由器,是主还备。

virtual_server:

定义了lvs的相关配置,

real_server则是定义了lvs对应的后端服务器的配置信息

tcp_check是keepalived对后端的健康检查方式

vrrp_sync_group :
group模块将多实例绑定起来,当其中一个实例挂掉时,另一个实例也会随之挂掉。

3.实例

一共有四台服务器

其中两台服务器是lvs+keepalived

还有两台服务器是web服务器(nginx)

这里要实现的效果为前端两台lvs调度器实现高可用,通过lvs调度器分发到后端web服务器上。

实验拓扑图及服务器ip如下:

image.png

因为有四台服务器,这里就称为server1-server4

server1和server2是lvs+keepalived的服务器,所以有两张网卡,一张是外网网卡,一张是内网网卡,用于与用户通信和转发到后端web服务器

server3和server4是web服务器,只有一张网卡,为内网网卡

这里因为机器较多,就采用ansible批量部署了,ansible可以使用yum直接安装(epel源)

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
yum -y install epel-release
yum -y install ansible
vim /etc/ansible/hosts
####添加下面的信息
[lvs]
10.10.10.105
10.10.10.187
[lvs:vars]
ansible_ssh_pass=admin
[ngx]
192.168.34.137
192.168.34.136
[ngx:vars]
ansible_ssh_pass=admin
####
#其中10.10.10.105和10.10.10.187是lvs+keepalived服务武器
#192.168.34.136和192.168.34.137为web服务器
sed -i 's/^#host_key_checking = False/host_key_checking = False/g' /etc/ansible/ansible.cfg

ansible准备工作就做好,下面开始用ansible安装服务器需要用到的软件#需准备好yum源
ansible lvs -m yum -a "state=installed name=ipvsadm"
ansible lvs -m yum -a "state=installed name=keepalived"
ansible ngx -m yum -a "state=installed name=nginx"
ansible 192.168.34.136 -m shell -a "echo 192.168.34.136 > /usr/share/nginx/html/index.html"
ansible 192.168.34.137 -m shell -a "echo 192.168.34.137 > /usr/share/nginx/html/index.html"
ansible ngx -m systemd -a "name=nginx enabled=yes state=started"

此时开始配置keepalived
编辑配置文件vim /etc/keepalived/ansible.cfg
####这个配置为10.10.10.105的配置文件,改服务器做为keepalived主服务器,state为master且为抢占模式
global_defs {
router_id 99
}
vrrp_sync_group 145 {
group {
VI_1
VI_2
}
}
vrrp_instance VI_1 {
state MASTER
priority 150
advert_int 1
authentication {
}
virtual_ipaddress {
10.10.10.106
vrrp_instance VI_2 {
state MASTER
interface ens37
advert_int 1
authentication {
! Configuration File for keepalived

global_defs {
router_id 99
}
vrrp_sync_group 145 {
group {
VI_1
VI_2
}
}
vrrp_instance VI_1 {
state MASTER
priority 150
advert_int 1
authentication {
}
virtual_ipaddress {
10.10.10.106
vrrp_instance VI_2 {
state MASTER
priority 150
interface ens37
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.34.145
}
}
virtual_server 10.10.10.106 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind NAT #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.34.137 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.34.136 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
####
10.10.10.187的配置于105大致相似,只需要改一下几个点
vrrp_instance VI_1和VI_2
state=MASTER改为state=BACKUP
priority=150改为priority=100
改完后keepalived就配置完毕了,lvs安装即可,无需手动配置lvs的配置都会通过virtual_server和real_server自动配置上。
此时重启keepalived即可(如没启动便直接启动)
systemctl restart keepalived
最后因为nat的lvs需要后端服务器将其默认路由指定到前端lvs的DIP上,所以还需要写一条路由
ansible ngx -m shell -a "route add default gw 192.168.34.145"
此时便配置完成了。

测试:

然后是测试环节,首先是访问测试

image.png

image.png

访问没有问题说明lvs负载均衡和后端nginx是正常运行且能正常访问的

这时再测试keepalived

在10.10.10.105(MASTER)服务器上关闭一块网卡或关闭keepalived

nmcli c down ens33

此时,其虚拟ip就飘逸到BACKUP服务器上去了

image.png

此时再访问测试

image.png

还是可以访问说明keepalived的ip飘逸成功了。关闭一个lvs+keepalived服务器时,另一个会直接替代其对外提供服务器,也就实现了高可用服务器。

需要注意的点:

1.在keepalived中配置lvs时(virtual_server 和 real_server),指定的lvs模式(NAT,TUNL,DR)的准备工作需要提前做好,例如nat需要调度器有内外两个网卡且后端服务器默认路由地址要指定到DIP。因其keepalived仅仅只会将ipvsadm配置上,其lvs相关环境以及必要配置还是需要手动去配置。

2.在抢占模式中可以通过检测脚本(需手动写)来控制其实例的优先级数值,在非抢占模式中需要加上nopreempt的配置,且非抢占模式中不需要priority优先级配置。

抢占模式与非抢占模式的区别为:

在抢占模式中当主节点挂掉以后备用节点会立刻顶替主节点的位置,而当主节点又重新正常上线后主节点会将备用节点的虚拟ip抢占过来,而非抢占模式时当备用节点顶替主节点后,主节点再上线时其主节点这时并不会去抢占其虚拟ip。

非抢占模式要求:

  1. 两个节点的state都必须配置为BACKUP
  2. 两个节点都必须加上配置 nopreempt

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!