利用keepalived实现nginx高可用

时间:2022-12-18 15:57:48


一、Keepalived与VRRP介绍

1.1 Keepalived介绍

       Keepalived基于VRRP协议,可以解决服务器的单点故障问题,通过与Nginx的配合实现Web服务的高可用。高可用的实现原理为:       

      两台主机同时安装好keepalived软件并启动服务,开始正常工作时,角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;

      当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;

       而当角色为Master的主机故障修复后,又会自动接管回他原来处理的工作,角色为Backup的主机则同时释放Master主机失效时他接管的工作。此时两台主机将恢复到启动时各自的原始角色及工作状态。

1.2 VRRP介绍

VRRP(虚拟路由冗余协议),它的出现就是为了解决静态路由的单点故障问题。VRRP通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的。

在一组虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广播包,此时Backup不会抢占Master。当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master。

二、环境介绍(基于Ubuntu 18.04)

角色

ip

要部署的软件

Master

192.168.8.106(node2)

Keepalived,nginx

Backup

192.168.8.107(node3)

Keepalived,nginx

三、部署过程

  1. 两台机器分别安装Keepalived和Nginx,安装过程省略
  2. 两台机器分别配置nginx的测试页面,便于区分

192.168.8.106:echo 'this is web1' > /usr/local/nginx/html/index.html
192.168.8.107:echo 'this is web2' > /usr/local/nginx/html/index.html

3.Master端部署Keepalived.conf:

! Configuration File for keepalived
global_defs {
router_id node2节点标识,通常为主机名
}
##定义脚本
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #脚本位置
interval 2 #检测时间间隔
weight -20 #这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-20,如果Master优先级设为100则由100 - 20 变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。
}
##定义虚拟路由名称
vrrp_instance VI_1 {
state MASTER #主节点为MASTER,备节点为BACKUP
interface ens33 #网卡
garp_master_delay 10
smtp_alert
virtual_router_id 50 #虚拟路由id(主备保持一致)
priority 100 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ##vrrp_script
}
virtual_ipaddress {
192.168.8.100 #虚拟ip(vip)
}
}

4.Backup端部署Keepalived.conf:

! Configuration File for keepalived
global_defs {
router_id node3 #节点标识,通常为主机名
}
##定义脚本
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #脚本位置
interval 2 #检测时间间隔
weight -20
}
##定义虚拟路由名称
vrrp_instance VI_1 {
state BACKUP ##备节点
interface ens33 #网卡
garp_master_delay 10
smtp_alert
virtual_router_id #50虚拟路由id(主备保持一致)
priority 90 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ##vrrp_script
}
virtual_ipaddress {
192.168.8.100 #虚拟ip(vip)
}
}

注意,两个keepalived要组成集群,需要满足以下条件:

virtual_router_id(路由器id)必须相同;

authentication(认证机制)里面的auth_type(认证方式)和auth_pass(密钥)配置必须一致

5.检测Nginx脚本(主备一致):

      先检查Nginx是否启动,如未启动则启动Nginx,休眠1s能有足够时间启动Nginx。之后再检测Nginx服务状态,如仍未启动则停止keepalived和nginx服务。脚本内容如下:

#!/bin/bash
nginx_check=`ps -ef | grep nginx`
if [[ $nginx_check != 0 ]];then
/usr/local/nginx/sbin/nginx
sleep 1
nginx_check=`ps -ef | grep nginx`
if [[ $nginx_check != 0 ]];then
systemctl stop keepalived
/usr/local/nginx/sbin/nginx -s stop
fi
fi

6.之后两台机器分别启动Nginx和Keepalived,测试过程如下:

(1)查看vip,发现vip是在192.168.8.106上(因为106机器的权重为100,大于107机器的90)。此时访问vip就转向106机器的nginx测试页面

利用keepalived实现nginx高可用

利用keepalived实现nginx高可用


(2)停止主节点106的Keepalived服务,发现vip已经切换到从节点192.168.8.107。此时再访问vip就转向107机器的nginx测试页面

利用keepalived实现nginx高可用

利用keepalived实现nginx高可用

(3)再次重新启动主节点106的keepalived,则vip又重新切换到主节点106上,访问vip也是主节点106的nginx测试页面。因为此时106机器的权重为100,而107机器为90。

利用keepalived实现nginx高可用

利用keepalived实现nginx高可用

(4)也可以测试在nginx出现问题的情况下,实现切换,这个时候只需要把nginx的配置文件进行修改,让其变得不可用,然后强杀掉nginx进程即可,发现也会实现vip自动切换服务器节点