文章目录

  • 前言
  • 参考目录
  • 环境说明
  • 实现说明
  • Nginx 安装
  • Keepalived 安装
  • yum 安装
  • 修改配置 `keepalived.conf`
  • 启动服务
  • 设置开机启动
  • 访问测试
  • 异常情况一:Keepalived 不可用
  • 关闭主机 Keepalived
  • 访问测试:指向备用机
  • 查看备用机 Keepalived 状态
  • 重新开启主机 Keepalived
  • 异常情况二:Nginx 不可用
  • 关闭主机 Nginx
  • 访问测试:无法使用虚拟IP访问
  • Nginx 检测脚本 `nginx_check.sh`


前言

对于 Nginx 高可用场景,学习到了 Nginx + Keepalived 实现 HA(High-Availability) 双机热备的相关内容,在虚拟机中完成了简单的实现以及测试,本文是对实现过程的记录。

环境说明

  • Linux 环境(CentOS 8)虚拟机两台。
  • 主机IP:192.168.10.128,备份机IP:192.168.10.129。
  • Nginx 版本 1.17.3。

实现说明

Jar项目nginx双节点_Nginx

  1. 有两台机器,当客户端请求访问时,访问的是由 Keepalived 配置自定义的虚拟IP(vip 192.168.10.200),而非机器真实IP。
  2. 默认情况下,vip 指向的是主机(192.168.10.128),只有当异常情况下主机服务不可用时,才会指向备用机(192.168.10.129)。
  3. 异常情况一:主机 Keepalived 不可用时,vip 会指向备用机。
  4. 异常情况二:主机 Nginx 不可用时,vip 无法自动检测到该异常,需要 Nginx 检测脚本定时检测 Nginx 情况,如果检测到 Nginx 出现异常无法启动,则会杀死 Keepalived 进程,使 vip 指向备用机。

Nginx 安装

这一步骤在此不再赘述。

为了方便查看,在 html 文件夹下的 index.html 文件加上了本机的IP,如下图:

Jar项目nginx双节点_Nginx_02

Keepalived 安装

yum 安装

yum install keepalived

修改配置 keepalived.conf

配置文件位置:

/etc/keepalived/keepalived.conf

此处只保留了主要配置,其他配置可以查看参考目录自行添加。

主机配置:

! Configuration File for keepalived

# 主要是配置故障发生时的通知对象以及机器标识
global_defs {
	# 标识本节点的字条串,通常为 hostname,但不一定非得是 hostname
    router_id lb128
}

# vrrp_instance 用来定义对外提供服务的VIP区域及其相关属性; myserver 实例名称自定义
vrrp_instance myserver {
	# 初始状态,MASTER | BACKUP
	# 一旦其他机器启动,将进行选举,具有最高优先级的机器将变为MASTER。
	# 所以这里的配置并不重要。
    state MASTER
	
	# 监听的实际网口
    interface ens160
	
	# 组播ID,通过224.0.0.18可以监听到现在已经存在的VRRP ID,最好不要跟现有ID冲突
    virtual_router_id 51
	
	# 权重为100,权重数字越大就越高
	# 如果不指定 Master 或者 BACKUP,那 priority 最高的就是 Master
    priority 100
	
	# 发送组播包的间隔时间,默认为1秒
    advert_int 1
	
	# 这个是验证类型为 PASS(简单密码),密码为 1111
    authentication {
        auth_type PASS
        auth_pass 1111
    }
	
	# 虚拟IP地址
    virtual_ipaddress {
        192.168.10.200
    }
}

备份机配置:

! Configuration File for keepalived

# 主要是配置故障发生时的通知对象以及机器标识
global_defs {
	# 标识本节点的字条串,通常为 hostname,但不一定非得是 hostname
    router_id lb129
}

# vrrp_instance 用来定义对外提供服务的VIP区域及其相关属性; myserver 实例名称自定义
vrrp_instance myserver {
	# 初始状态,MASTER | BACKUP
	# 一旦其他机器启动,将进行选举,具有最高优先级的机器将变为MASTER。
	# 所以这里的配置并不重要。
    state BACKUP
	
	# 监听的实际网口
    interface ens160
	
	# 组播ID,通过224.0.0.18可以监听到现在已经存在的VRRP ID,最好不要跟现有ID冲突
    virtual_router_id 51
	
	# 权重为100,权重数字越大就越高
	# 如果不指定 Master 或者 BACKUP,那 priority 最高的就是 Master
    priority 50
	
	# 发送组播包的间隔时间,默认为1秒
    advert_int 1
	
	# 这个是验证类型为 PASS(简单密码),密码为 1111
    authentication {
        auth_type PASS
        auth_pass 1111
    }
	
	# 虚拟IP地址
    virtual_ipaddress {
        192.168.10.200
    }
}

注意事项:

  • router_id 可以自定义。
  • myserver 实例名称可以自定义。
  • interface ens160 是我本机的网卡名称,需要根据自身的情况进行修改,查看命令:ip addr

启动服务

配置完成后启动服务查看状态:

# 启动
systemctl start keepalived
# 查看状态
systemctl status keepalived

主机:

Jar项目nginx双节点_IP_03

备用机:

Jar项目nginx双节点_nginx_04

设置开机启动

chkconfig keepalived on

Jar项目nginx双节点_nginx_05

访问测试

使用虚拟IP访问,会指向主机。

Jar项目nginx双节点_keepalived_06

异常情况一:Keepalived 不可用

Jar项目nginx双节点_keepalived_07


主机 Keepalived 不可用时,虚拟IP会指向备用机。

关闭主机 Keepalived

systemctl stop keepalived

Jar项目nginx双节点_nginx_08


查看IP:

ip addr

Jar项目nginx双节点_IP_09


IP没有虚拟地址只有真实地址。

访问测试:指向备用机

使用虚拟IP访问,会指向备用机。

Jar项目nginx双节点_Nginx_10

查看备用机 Keepalived 状态

查看IP:

ip addr

Jar项目nginx双节点_Nginx_11


IP有虚拟地址。

查看 Keepalived 状态:

systemctl status keepalived

Jar项目nginx双节点_keepalived_12

重新开启主机 Keepalived

虚拟IP会重新指向主机,因为主机权重比备用机高,主机 Keepalived 重启时会重新进行选举。

异常情况二:Nginx 不可用

Jar项目nginx双节点_IP_13


在视频里面这种情况有提及,但是没有做具体实现。

在前文说明中已经概况了这一实现的方式,所以这里不再赘述。

关闭主机 Nginx

Jar项目nginx双节点_IP_14

访问测试:无法使用虚拟IP访问

Jar项目nginx双节点_Nginx_15


Keepalived 正常,所以 vip 无法指向备用机。

Nginx 检测脚本 nginx_check.sh

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -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

首先查看 nginx 是否运行(ps -C nginx --no-header |wc -l),如果没有启动则执行命令启动(/usr/local/nginx/sbin/nginx),休眠 2s 再进行判断,如果还是无法启动则杀掉 keepalived 进程。

赋予脚本权限:

chmod 777 /etc/keepalived/nginx_check.sh

脚本执行:

sh /etc/keepalived/nginx_check.sh

定时执行脚本:

# 打开定时任务配置文件
crontab -e

# 在配置文件中写入定时任务的操作(每分钟执行一次,输出错误日志)
*/1 * * * * sh /etc/keepalived/nginx_check.sh 2> /usr/local/logs/keepalived/error.log

脚本启动后即可监控 Nginx 状态。