nginx集群和vip

需要两台以上的 Nginx 服务器对外提供服务,这样的话就可以解决其中一台宕机了,另外一台还能对外提供服务

但是如果是两台 Nginx 服务器的话,会有两个 IP 地址,用户该访问哪台服务器,用户怎么知道哪台是好的,哪台是宕机了的

一:Keepalived

Keepalived 软件由 C 编写的,最初是专为 LVS 负载均衡软件设计的,Keepalived 软件主要是通过 VRRP 协议实现高可用功能

VRRP(Virtual Route Redundancy Protocol)协议,翻译过来为虚拟路由冗余协议

VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP

而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,MASTER 实现针对虚拟路由器IP的各种网络功能。

其他设备不拥有该虚拟 IP,状态为 BACKUP,处了接收 MASTER 的 VRRP 状态通告信息以外,不执行对外的网络功能。

当主机失效时,BACKUP 将接管原先 MASTER 的网络功能(VIP漂移)

VRRP 把两个 Nginx 分成两个路由(VRRP 路由 1 和 VRRP 路由 2),并生成一个 Virtual 路由

用户访问的是 Virtual 路由,该路由会去访问两个 Nginx 生成的 VRRP 路由。

那么到底访问谁呢?VRRP 会给两个路由分配角色,一个是 Master(老大),另一个是 Backup(备份)

所以访问的是 Master 角色的路由,当 Master 角色路由宕机了,才会找到 Backup 备份路由

在这里插入图片描述
从上面的介绍信息获取到的内容就是 VRRP 是一种协议,那这个协议是用来干什么的?

选择协议

VRRP 可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。

其中的虚拟路由即 Virtual 路由是由 VRRP 路由群组创建的一个不真实存在的路由,这个虚拟路由也是有对应的 IP 地址。而且 VRRP 路由 1 和 VRRP 路由 2 之间会有竞争选择,通过选择会产生一个 Master 路由和一个 Backup 路由。

路由容错协议

Master 路由和 Backup 路由之间会有一个心跳检测,Master 会定时告知 Backup 自己的状态

如果在指定的时间内,Backup 没有接收到这个通知内容,Backup 就会替代 Master 成为新的 Master。

Master 路由有一个特权就是虚拟路由和后端服务器都是通过 Master 进行数据传递交互的,而备份节点则会直接丢弃这些请求和数据,不做处理,只是去监听 Master 的状态。

总结一下就是:

VIP 是虚拟路由,是专门给用户发送请求。

一旦用户发送请求到 VIP,VIP 就会发送给 Master(主)的 Nginx,如果 Master(主)Nginx 宕机了,才会发送给 Backup(备份) Nginx 路由

二:环境搭建

1:环境说明

VIP IPNginx IP主机名主/从
192.168.200.133(服务器 A)keepalived1Master
192.168.200.222
192.168.200.122(服务器 B)keepalived2Backup

确保服务器 A 和服务器 B 的 Nginx 配置保持一致。

2:准备keepalived

  • 步骤1:从官方网站下载 keepalived,官网地址 https://keepalived.org
  • 步骤2:将下载的资源上传到服务器,这里是 keepalived-2.0.20.tar.gz
  • 步骤3:在 /opt 目录下创建 keepalived 目录,方便管理资源
mkdir /opt/keepalived 
tar -zxf keepalived-2.0.20.tar.gz -C /opt/keepalived
cd /opt/keepalived/keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local   # 安装到 /usr/local 目录下,可修改
make && make install

两台 Nginx 服务器都要安装 keepalive。安装完成后,有两个文件需要我们认识下:

  • /etc/keepalived/keepalived.conf:keepalived 的系统配置文件,我们主要操作的就是该文件
  • /usr/local/sbin 目录下的 keepalived:这是系统配置脚本,用来启动和关闭 keepalived

3:配置文件介绍

打开 keepalived.conf 配置文件

这里面会分三部分:

  • 第一部分是 global 全局配置
  • 第二部分是 vrrp 相关配置
  • 第三部分是 LVS 相关配置。

这里主要是使用 keepalived 实现高可用部署,没有用到 LVS,所以我们重点关注的是前两部分。

# global全局部分
global_defs {
    
   notification_email {  # 通知邮件,当 keepalived 切换 Master 和 Backup 时需要发 email 给具体的邮箱地址
     tom@itcast.cn
     jerry@itcast.cn
   }
   notification_email_from kele@youngkbt.com   # 设置发件人的邮箱信息
   
   smtp_server 192.168.200.1   # 指定 smpt 服务地址
   
   smtp_connect_timeout 30   # 指定 smpt 服务连接超时时间
   
   router_id LVS_DEVEL   # 运行 keepalived 服务器的一个标识,可以用作发送邮件的主题信息
   
   # 默认是不跳过检查。检查收到的 VRRP 通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的 master 路由器,则不执行检查(跳过检查)
   vrrp_skip_check_adv_addr
   
   vrrp_strict    # 严格遵守 VRRP 协议
  
   vrrp_garp_interval 0   # 在一个接口发送的两个免费 ARP 之间的延迟。可以精确到毫秒级。默认是 0
   
   vrrp_gna_interval 0  # 在一个网卡上每组消息之间的延迟时间,默认为 0
}

VRRP 部分可以包含以下四个子模块:vrrp_script & vrrp_sync_group & garp_group & vrrp_instance

下面会用到第一个(vrrp_script)和第四个(vrrp_instance)

3.1:vrrp_instance

vrrp_instance 模块内容

# 设置 keepalived 实例的相关信息,VI_1 为 VRRP 实例名称
vrrp_instance VI_1 {
    state MASTER  		  # 有两个值可选 MASTER 主,BACKUP 备
    interface ens33		  # vrrp 实例绑定的接口,用于发送 VRRP 包[当前服务器使用的网卡名称]
    virtual_router_id 51  # 指定 VRRP 实例 ID,范围是 0-255
    priority 100		  # 指定优先级,优先级高的将成为 MASTER
    advert_int 1		  # 指定发送 VRRP 通告的间隔,单位是秒。这里是心跳检查的时间
    authentication {	  # vrrp 之间通信的认证信息
        auth_type PASS	  # 指定认证方式。PASS 简单密码认证(推荐)
        auth_pass 1111	  # 指定认证使用的密码,最多 8 位
    }
    virtual_ipaddress {   # 虚拟 IP 地址 => 设置虚拟 IP 地址,供用户访问使用,可设置多个,一行一个
        192.168.200.222
    }
}
3.2:服务器配置

keepalived的具体配置内容如下:(上面是服务器A,下面是服务器B)

! Configuration File for keepalived

global_defs {
   notification_email {
        tom@itcast.cn
        jerry@itcast.cn
   }
   notification_email_from zhaomin@itcast.cn
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id keepalived2
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.222
    }
}
! Configuration File for keepalived

global_defs {
   notification_email {
        tom@itcast.cn
        jerry@itcast.cn
   }
   notification_email_from zhaomin@itcast.cn
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id keepalived2
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.222
    }
}
3.3:启动测试

启动 keepalived 之前,先使用命令 ip a,查看 192.168.200.133 和 192.168.200.122 这两台服务器的 IP 情况

在这里插入图片描述
分别启动两台服务器的 keepalived

cd /usr/local/sbin
./keepalived

再次通过 ip a 查看 IP

在这里插入图片描述
先级高于服务器 B。

3.4:vrrp_script

keepalived 只能做到对网络故障和 keepalived 本身的监控,即当出现网络故障或者 keepalived 本身出现问题时,进行切换。

但是这些还不够,我们还需要监控 keepalived 所在服务器上的其他业务,比如 Nginx

如果 Nginx 出现异常了,而 keepalived 却保持正常,是无法完成系统的正常工作的

因此需要根据业务进程的运行状态决定是否需要进行主备切换,这个时候,我们可以通过编写脚本对业务进程进行检测监控

首先我们要知道 keepalived 的 vrrp_script 的配置模板:

vrrp_script 脚本名称
{
    script "脚本位置"
    interval 3 # 执行时间间隔
    weight -20 # 动态调整 vrrp_instance 的优先级
}

编写脚本,这里的脚本名是 ck_nginx.sh,位置在 /etc/keepalived 路径下

#!/bin/bash
num=`ps -C nginx --no-header | wc -l`  # 查询 Nginx 的进程数

if [ $num -eq 0 ];then       	       # 如果 Nginx 的进程数等于 0
/usr/local/nginx/sbin/nginx			   # 则可执行文件 nginx,启动 Nginx 服务

sleep 2								   # 阻塞 2 秒 

if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then  # 再次查询 Nginx 的进程数
	killall keepalived		# 如果 Nginx 的进程数不等于 0,则杀死 keepalived 进程
fi
fi

这个脚本其实就是判断 Nginx 是否启动还是宕机了,如果没有启动,则重新启动。重新启动后再次查看 Nginx 是否启动成功,如果没有启动,说明 Nginx 宕机了,则杀死 keepalived 进程,这样,另一台服务器的 Nginx 就晋升为 Master

为脚本文件设置权限

chmod 755 /etc/keepalived/keepalived.conf

将脚本添加到 Master 服务器 A 的 keepalived 的配置文件里

vrrp_script ck_nginx {
   script "/etc/keepalived/ck_nginx.sh" # 执行脚本的位置
   interval 2		# 执行脚本的周期,秒为单位
   weight -20		# 权重的计算方式
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 10
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.111
    }
    track_script {
      ck_nginx
    }
}
  • 如果效果没有出来,可以使用 tail -f /var/log/messages 查看日志信息,找对应的错误信息
  • 两个 Nginx 启动后,关闭 Master 的 Nginx,通过 ip a 查看 Backup 的 Nginx 的IP,是否晋升为 Master
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐