Keepalived简介
概述
Keepalived一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
keepalived的作用
Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。
安装
- 下载软件包
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
| [root@localhost ~]# tar -zxvf keepalived-2.2.4.tar.gz
|
- 编译安装
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注册为系统服务
- 首先进到keepalived软件包目录
1
| cd /root/keepalived-2.2.4/keepalived/etc
|
- 复制keepalived对应的文件到系统服务对于的目录
1 2
| cp init.d/keepalived /etc/init.d/ cp sysconfig/keepalived /etc/sysconfig/
|
- 重新加载系统服务并启动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配置
- 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
|
- 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
|
测试
- 访问虚拟ip192.168.10.21
我们可以看到页面显示的内容是192.168.10.11的内容 因为他是master
- 我们把master 也就是192.168.10.11的keepalived关闭也模拟一下机器故障 让backup:192.168.10.12自动提升为master 继续提供web服务
1
| [root@localhost ~]# systemctl stop keepalived
|
- 我们在访问虚拟ip
可以看到backup:192.168.10.12 也就是备用机 已经变成master了
- 我们在去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
|
- 我们先去/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发生故障的话 会自动切换到备用机
- 配置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脚本 }
|
- 重启keepalived
1
| systemctl restart keepalived
|
测试
测试一
我们去master机器模拟一下nginx挂掉
看配置的脚本能不能自动实现自动重启
- 关闭master的nginx
发现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发生故障的话 会自动切换到备用机
我们在访问虚拟ip:192.168.10.21
可以看到已经切换到备用机了!
我们在把nginx名字改回来
再去访问虚拟ip
会发现192.168.10.11已经变回master了