文章目录
- 前言
- 参考目录
- 环境说明
- 实现说明
- 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。
实现说明
- 有两台机器,当客户端请求访问时,访问的是由 Keepalived 配置自定义的虚拟IP(vip 192.168.10.200),而非机器真实IP。
- 默认情况下,vip 指向的是主机(192.168.10.128),只有当异常情况下主机服务不可用时,才会指向备用机(192.168.10.129)。
- 异常情况一:主机 Keepalived 不可用时,vip 会指向备用机。
- 异常情况二:主机 Nginx 不可用时,vip 无法自动检测到该异常,需要 Nginx 检测脚本定时检测 Nginx 情况,如果检测到 Nginx 出现异常无法启动,则会杀死 Keepalived 进程,使 vip 指向备用机。
Nginx 安装
这一步骤在此不再赘述。
为了方便查看,在 html 文件夹下的 index.html 文件加上了本机的IP,如下图:
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
主机:
备用机:
设置开机启动
chkconfig keepalived on
访问测试
使用虚拟IP访问,会指向主机。
异常情况一:Keepalived 不可用
主机 Keepalived 不可用时,虚拟IP会指向备用机。
关闭主机 Keepalived
systemctl stop keepalived
查看IP:
ip addr
IP没有虚拟地址只有真实地址。
访问测试:指向备用机
使用虚拟IP访问,会指向备用机。
查看备用机 Keepalived 状态
查看IP:
ip addr
IP有虚拟地址。
查看 Keepalived 状态:
systemctl status keepalived
重新开启主机 Keepalived
虚拟IP会重新指向主机,因为主机权重比备用机高,主机 Keepalived 重启时会重新进行选举。
异常情况二:Nginx 不可用
在视频里面这种情况有提及,但是没有做具体实现。
在前文说明中已经概况了这一实现的方式,所以这里不再赘述。
关闭主机 Nginx
访问测试:无法使用虚拟IP访问
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 状态。