Keepalived学习笔记

Keepalived简介

概述

Keepalived一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

keepalived的作用

Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。

安装

  1. 下载软件包
1
2
3
keepalived官网下载地址:  https://www.keepalived.org/download.html

[root@localhost ~]# wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz --no-check-certificate
  1. 解压
1
[root@localhost ~]# tar -zxvf keepalived-2.2.4.tar.gz
  1. 编译安装
1
2
3
4
5
6
7
8
cd  keepalived-2.2.4

./configure --prefix=/usr/local/keepalived --sysconf=/etc #软件安装到/usr/local/keepalived 配置文件配置到/etc
make && make install


[root@localhost ~]# whereis keepalived
keepalived: /etc/keepalived /usr/local/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
24
25
26
27
28
1 global_defs {
2 #路由id:当前安装keepalived节点主机的标识符,全局唯一的
3 router_id keep_21
4 }
5
6
7 #计算机节点
8 vrrp_instance VI_1 {
9 # 表示的状态,当前的主节点 MASTER/BACKUP
10 state MASTER
11 # 当前实例绑定的网卡
12 interface ens32
13 # 保证主备节点一致
14 virtual_router_id 51
15 # 优先级/权重,谁的优先级高,在MASTER挂掉以后,谁就能成为MASTER
16 priority 100
17 # 主备之间同步检查的时间间隔,默认1s
18 advert_int 1
19 # 认证授权的密码,防止非法节点的进入
20 authentication {
21 auth_type PASS
22 auth_pass 1111
23 }
24 # 虚拟的ip
25 virtual_ipaddress {
26 192.168.10.21
27 }
28 }

启动keepalived

1
2
3
4
5
[root@localhost ~]# cd /usr/local/keepalived/sbin
[root@localhost sbin]# ./keepalived #启动keepalived


[root@localhost ~]# ip addr #查看ip

我们这里会看到ens32网卡会多出一个ip,就是我们刚刚配置的keepalived配置文件里面设置的虚拟ip

keepalived注册为系统服务

  1. 首先进到keepalived软件包目录
1
cd /root/keepalived-2.2.4/keepalived/etc
  1. 复制keepalived对应的文件到系统服务对于的目录
1
2
cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
  1. 重新加载系统服务并启动keepalived
1
2
3
4
systemctl -daemon-reload #重新加载系统服务#重新加载系统服务

systemctl start keepalived.service #启动keepalived
ps aux |grep keepalived #查看keepalived进程

keepalived实现双机主备高可用

实现环境

虚拟ip/vip:192.168.10.21

nginx-keepliaved-master:192.168.1.11
index.html主页内容为keepalived-nginx-192.168.10.11

nginx-keepliaved-backup:192.168.1.12
index.html主页内容为keepalived-nginx-192.168.10.12

keepalived配置

  1. nginx-keepliaved-master机器配置
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
24
25
26
27
28
1 global_defs {
2 #路由id:当前安装keepalived节点主机的标识符,全局唯一的
3 router_id keep_11
4 }
5
6
7 #计算机节点
8 vrrp_instance VI_1 {
9 # 表示的状态,当前的主节点 MASTER/BACKUP
10 state MASTER
11 # 当前实例绑定的网卡
12 interface ens32
13 # 保证主备节点一致
14 virtual_router_id 51
15 # 优先级/权重,谁的优先级高,在MASTER挂掉以后,谁就能成为MASTER
16 priority 100
17 # 主备之间同步检查的时间间隔,默认1s
18 advert_int 1
19 # 认证授权的密码,防止非法节点的进入
20 authentication {
21 auth_type PASS
22 auth_pass 1111
23 }
24
25 virtual_ipaddress {
26 192.168.10.21
27 }
28 }
1
systemctl restart keepalived

  1. nginx-keepliaved-backup机器配置
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
24
25
26
27
28
1 global_defs {
2 #路由id:当前安装keepalived节点主机的标识符,全局唯一的
3 router_id keep_12
4 }
5
6
7 #计算机节点
8 vrrp_instance VI_1 {
9 # 表示的状态,当前的主节点 MASTER/BACKUP
10 state BACKUP
11 # 当前实例绑定的网卡
12 interface ens32
13 # 保证主备节点一致
14 virtual_router_id 51
15 # 优先级/权重,谁的优先级高,在MASTER挂掉以后,谁就能成为MASTER
16 priority 100
17 # 主备之间同步检查的时间间隔,默认1s
18 advert_int 1
19 # 认证授权的密码,防止非法节点的进入
20 authentication {
21 auth_type PASS
22 auth_pass 1111
23 }
24
25 virtual_ipaddress {
26 192.168.10.21
27 }
28 }
1
systemctl restart keepalived

测试

  1. 访问虚拟ip192.168.10.21
    我们可以看到页面显示的内容是192.168.10.11的内容 因为他是master
    1.png
  2. 我们把master 也就是192.168.10.11的keepalived关闭也模拟一下机器故障 让backup:192.168.10.12自动提升为master 继续提供web服务
1
[root@localhost ~]# systemctl stop keepalived
  1. 我们在访问虚拟ip
    可以看到backup:192.168.10.12 也就是备用机 已经变成master了
    2.png
  2. 我们在去master:192.168.10.11 模拟一下 机器故障已经被修复好了 测试一下访问虚拟ip的时候页面会是什么内容
1
[root@localhost ~]# systemctl start keepalived

keepalived配置nginx自动重启

实现场景

基于上个实验做好的环境

上次实验我们可以发现我们配置的只是keepalived发生故障,我们才切换主备机器. 但是如果是nginx服务发生故障的话 我们就不能使用了

所以现在这个实验做的是keepalived配置nginx自动重启

配置

如果你用的是centos7安装最小化的请安装以下软件包 因为下面的shell脚本需要killall命令

1
centos7精简安装后,使用中发现没有killall命令。 安装这个包即可: yum install psmisc
  1. 我们先去/etc/keepalived下 创建一个名字为check_nginx_alive.sh 内容为以下

然后还需要配置以下权限:

1
chmod 755 check_nginx_alive.sh
1
2
3
4
5
6
7
8
9
10
vim /etc/keepalived/check_nginx_alive.sh

test=`ps -C nginx --no-header |wc -l`
if [ $test -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi

这个shell脚本是意思是:
查找nginx进程 如果没有找到nginx进程 就运行nginx
然后在进行查找nginx进程有没有开启
没有开启的话 就结束keepalived进程

因为keepalived发生故障的话 会自动切换到备用机

  1. 配置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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
global_defs {
#路由id:当前安装keepalived节点主机的标识符,全局唯一的
router_id keep_11
}


vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive.sh"
interval 2 #每隔两秒运行上一行脚本
weight 10 #如果脚本运行成功,则升级权重+10
}



#计算机节点
vrrp_instance VI_1 {
# 表示的状态,当前的主节点 MASTER/BACKUP
state MASTER
# 当前实例绑定的网卡
interface ens32
# 保证主备节点一致
virtual_router_id 51
# 优先级/权重,谁的优先级高,在MASTER挂掉以后,谁就能成为MASTER
priority 100
# 主备之间同步检查的时间间隔,默认1s
advert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}

track_script {
check_nginx_alive #追踪nginx脚本
}


virtual_ipaddress {
192.168.10.21
}
}

其实我们添加的内容就是这两个

1
2
3
4
5
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive.sh"
interval 2 #每隔两秒运行上一行脚本
weight 10 #如果脚本运行成功,则升级权重+10
}
1
2
3
track_script {
check_nginx_alive #追踪nginx脚本
}
  1. 重启keepalived
1
systemctl restart keepalived

测试

测试一

我们去master机器模拟一下nginx挂掉
看配置的脚本能不能自动实现自动重启

  1. 关闭master的nginx
1
nginx -s stop

发现keepalived的配置已经自动运行shell脚本重启nginx了

但是只要我们速度快结束nginx进程的同时 快速刷新 还是能看到报错的 但是不影响

测试二

上面的测试一我们已经看到关闭nginx keepalived确实会帮我们自动执行shell脚本重启nginx

我们测试二测试的是nginx重启不了的场景

我们模拟一下nginx重启不了的场景:
我们把/usr/local/nginx/sbin/nginx 这个文件改名为其他

1
2
cd /usr/local/nginx/sbin
mv nginx nginx_bak

然后我们用已经改好名的nginx 重启关闭一下
这样的话 我们之前写的脚本启动nginx程序的命令 就会报错了 因为找不到nginx命令位置 所以他会结束keepalived全部进程

keepalived发生故障的话 会自动切换到备用机

1
./nginx_bak -s stop

我们在访问虚拟ip:192.168.10.21

可以看到已经切换到备用机了!

我们在把nginx名字改回来

1
mv nginx_bak nginx

再去访问虚拟ip

会发现192.168.10.11已经变回master了