Keepalived+Nginx双机热备实验
前言
- Keepalived是一款高可用性的服务,它可以帮助您在云服务器上实现负载均衡和故障转移。该服务通过VRRP协议实现了主备节点之间的故障切换和负载均衡。
- VRRP是一种虚拟路由器冗余协议,它能够在网络中的节点故障时自动将工作负载转移到备用节点上,从而保证网络的高可用性。Keepalive软件与VRRP协议结合使用,可以实现更加可靠和稳定的高可用性。
- Keepalived的主要功能包括管理LVS负载均衡软件、实现对LVS集群节点健康检查的功能、作为系统网络服务的高可用功能以及作为高可用故障切换转移原理。当Keppalived服务正常工作时,主Master节点会不断地向备节点发送心跳消息,告诉备Backup节点自己还活着。当主Master节点发生故障时,备节点会调用自身的接管程序,接管主Master节点的IP资源及服务。当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
一、Keepalived的工作过程
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
二、Keepalived+Nginx双机热备实验
1、基础环境
机器 | 主备 | IP地址 |
---|---|---|
nginx-1 | 主 | 192.168.222.143 |
nginx-2 | 备 | 192.168.222.167 |
客户端/windows | / | 192.168.222.1 |
1.1、关闭防火墙和selinux
nginx-1和nginx-2的配置如下:
[root@nginx-1 ~]# systemctl stop firewalld
[root@nginx-1 ~]# systemctl disable firewalld
[root@nginx-1 ~]# setenforce 0
[root@nginx-1 ~]# getenforce
Disabled
2、安装nginx
配置好阿里的yum源,使用yum安装nginx。
nignx-1和nginx-2配置如下:
nginx-1:
[root@nginx-1 ~]# yum install nginx -y
[root@nginx-1 ~]# nginx -v
nginx version: nginx/1.20.1
[root@nginx-1 ~]# systemctl enable nginx # 设置开机自启
[root@nginx-1 ~]# systemctl start nginx # 启动nginx
nginx-2:
[root@nginx-2 ~]# yum install nginx -y
[root@nginx-2 ~]# nginx -v
nginx version: nginx/1.20.1
[root@nginx-2 ~]# systemctl enable nginx # 设置开机自启
[root@nginx-2 ~]# systemctl start nginx # 启动nginx
2.1、nginx的一些默认配置文件路径
- /etc/nginx/nginx.conf # nginx的默认配置文件
- /etc/nginx/conf.d # nginx的自定义配置文件
- /usr/share/nginx/html/ # nginx的默认网页存放目录
- /var/log/nginx/ # nginx的日志文件存放目录
2.2、对nginx的网页页面进行修改
修改nginx的默认页面文件,以便客户端测试查看效果
nginx-1和nginx-2的配置如下:
nginx-1配置:
[root@nginx-1 ~]# cd /usr/share/nginx/html/
[root@nginx-1 html]# ls
404.html en-US img nginx-logo.png
50x.html icons index.html poweredby.png
[root@nginx-1 html]# echo "<h1>This is nginx-1</h1>" > index.html
[root@nginx-1 html]# cat index.html
<h1>This is nginx-1</h1>
nginx-2配置:
[root@nginx-2 ~]# cd /usr/share/nginx/html/
[root@nginx-2 html]# ls
404.html en-US img nginx-logo.png
50x.html icons index.html poweredby.png
[root@nginx-2 html]# echo "<h1>This is nginx-2</h1>" > index.html
[root@nginx-2 html]# cat index.html
<h1>This is nginx-2</h1>
3、安装Keepalived
nginx-1和nginx-2 使用yum安装
[root@nginx-1 ~]# yum install keepalived -y
[root@nginx-2 ~]# yum install keepalived -y
3.1、修改配置文件
默认的配置文件在/etc/keepalived目录下
[root@nginx-1 ~]# cd /etc/keepalived/
[root@nginx-1 keepalived]# ls
keepalived.conf
[root@nginx-1 keepalived]# cp keepalived.conf keepalived.conf.bak # 配置文件内容很多,可以备份以防万一
3.2、分别修改nginx-1和nginx-2的配置文件
nginx-1(主)配置:
[root@nginx-1 keepalived]# > keepalived.conf
[root@nginx-1 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
vrrp_mcast_group4 224.100.100.100 # 指定一个广播地址
}
# 加入周期性检测nginx服务脚本的相关配置
vrrp_script check_nginx{
script "/etc/keepalived/check_nginx.sh" # 心跳执行的脚本,检测nginx是否启动
interval 1 # 检测脚本执行的间隔,单位是秒
}
vrrp_instance VI_1 {
state MASTER # 标识状态为MASTER
interface ens33 # 修改网卡名称
virtual_router_id 51 # 定义组vriid,同一组virtual_router_id必须相同
priority 100 # 优先级,MASTER权重要高于BACKUP
advert_int 1 # MASTER 与 BACKIP 负载均衡器之间同步检查的时间间隔,单位是秒
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.222.220 # 设置虚拟IP地址
}
track_script{
check_nginx
}
}
重启服务
[root@nginx-1 keepalived]# systemctl restart keepalived
nginx-2(备)配置:
由于主备的配置是一样的,只需要修改部分参数,可以通过scp命令把nginx-1的配置文件传到nginx-2上
[root@nginx-1 keepalived]# scp keepalived.conf 192.168.222.167:`pwd`
keepalived.conf 100% 1044 887.9KB/s 00:00
[root@nginx-2 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
vrrp_mcast_group4 224.100.100.100 # 指定一个广播地址
}
# 加入周期性检测nginx服务脚本的相关配置
vrrp_script check_nginx{
script "/etc/keepalived/check_nginx.sh" # 心跳执行的脚本,检测nginx是否启动
interval 1 # 检测脚本执行的间隔,单位是秒
}
vrrp_instance VI_1 {
state BACKUP # 标识状态为MASTER
interface ens33 # 修改网卡名称
virtual_router_id 51 # 定义组vriid,同一组virtual_router_id必须相同
priority 99 # 优先级,MASTER权重要高于BACKUP
advert_int 1 # MASTER 与 BACKIP 负载均衡器之间同步检查的时间间隔,单位是秒
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.222.220 # 设置虚拟IP地址
}
track_script{
check_nginx
}
}
重启服务
[root@nginx-2 keepalived]# systemctl restart keepalived
3.3、查看ip
此时通过ip a去查看两台nginx服务器,只有nginx-1主备是有虚拟ip地址,只有等nginx-1宕机后,才会转移到nginx-2上
nginx-1:
nginx-2:
3.4、编写nginx存活脚本
- 由于keepalived是通过内核转发请求判断主备服务器是否在线,而nginx是应用程序,它有进程意外退出的可能性,不涉及内核,所以nginx挂了keepalived并不能作出相应的判断来切换备服务器,这时需要使用一个脚本来实时监控nginx进程是否存在,如果不存在则重启开启,重启开启不了杀掉当前主机中的keepalived服务来实现故障切换。开启keepalived后脚本自动执行
#在/etc/keepalived目录下创建nginx存活检测脚本
[root@localhost keepalived]# vim check_nginx.sh
#!/bin/bash
#检测nginx是否存活脚本
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then #如果nginx没有启动就启动nginx
systemctl start nginx #重启nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移
killall keepalived
fi
fi
给脚本执行权限
[root@localhost keepalived]# chmod 755 check_nginx.sh
并把脚本传入nginx-2服务器上
[root@nginx-1 keepalived]# scp check_nginx.sh 192.168.222.167:`pwd`
check_nginx.sh
4、客户端测试
4.1、分别对两台nginx服务器进行访问
4.2、对VIP进行访问
看到的结果是nginx-1的服务器,因为nginx-1服务器是master主服务器
4.3、故障测试
- 模拟服务器故障,如果nginx-1服务器突然宕机后,让keepalived实现自动故障转移,让客户端访问的页面到backup服务器上
- 此时再次尝试访问刷新VIP查看结果
此时访问的页面是nginx-2服务器提供的,VIP也已经到nginx-2服务器的ens33网卡上
本文来自博客园,作者:hmiking,转载请注明原文链接:https://www.cnblogs.com/oldit/p/17811959.html