Keepalived+Nginx双机热备实验

发布时间 2023-11-06 11:41:12作者: hmiking

前言

  • 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网卡上
    在这里插入图片描述

欢迎关注我的CSDN个人博客知乎