使用两台本地虚拟机,实现 Keepalived+Nginx实现双机主备、双主热备高可用集群架构
本文根据B站up的教学视频以及参考相应博文实现。
虚拟机安装Nginx教程:VMware虚拟机安装Nginx详细步骤
虚拟机安装Keepalived: 推荐使用yum安装,更加简便
#安装相关依赖
yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
#yum命令安装keeplived
yum install -y keepalived
#初始化及启动
systemctl start keepalived //启动keepalived
systemctl enable keepalived //加入开机启动keepalived
systemctl restart keepalived //重新启动keepalived
systemctl status keepalived //查看keepalived状态
使用 yum 安装 keepalived 的配置文件在 /etc/keepalive/ 目录下
先不要启动keepalived,后续修改完配置文件后在进行启动
先运行两台虚拟机的nginx 这里我修改了一下nginx的默认启动页的H5文件,便于后期测试
到此为止,我们相应的准备工作准备好了,接下来就进行集群的相关配置
keepalived.conf配置文件代码:
! Configuration File for keepalived
global_defs {
#路由id:当前安装keepalived节点主机的标识符,全局唯一
router_id keep_102
}
vrrp_instance VI_1 {
# 表示的状态,当前的128服务器为nginx的主节点,MASTER/BACKUP
state MASTER
# 当前实例绑定的网卡
interface ens33
# 保证主备节点一致
virtual_router_id 51
# 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 100
# 主备之间同步检查的时间间隔,默认1s
advert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.200
}
}
我们可以看到当前102号机器上的keepalived服务已经启动成功了;
查看ip,发现多了一个200的ip,这就是我们在配置文件里面的配置的虚拟ip。
由于我们在配置文件中配置的是主节点,所以当前虚拟ip在主机这边,等会的103机器也就是备用机是没有这个200的虚拟ip的。
! Configuration File for keepalived
global_defs {
#路由id:当前安装keepalived节点主机的标识符,全局唯一
router_id keep_103
}
vrrp_instance VI_1 {
# 表示的状态,当前的129服务器为nginx的主节点,MASTER/BACKUP
state BACKUP
# 当前实例绑定的网卡
interface ens33
# 保证主备节点一致
virtual_router_id 51
# 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 80
# 主备之间同步检查的时间间隔,默认1s
advert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.200
}
}
我们可以看到当前103备用节点上的keepalived启动成功了。
查看ip,只有原先的103,这就是之前所说的我们在103号的keepalived.conf文件里配置的是BACKUP(备用)角色,所以当前的虚拟ip200是在主机那边,当主机挂掉以后,虚拟ip才会飘到103机器上。
我们先访问 192.168.200.200 (虚拟ip)
发现最终指向的102这台机器,也就是我们的主节点。
此时我们停止102主节点机器上的keepalived服务
然后重新访问虚拟ip: 192.168.200.200
我们发现虚拟ip指向了备用节点上的nginx服务器,也就是103机器
此时我们查看一下102和103号机器上的ip
我们发现原先在102机器上的虚拟ip, 跑到了103机器上
到此为止Keepalived + Nginx 双主备集群架构简单搭建到此为止。
在这次简单的测试中,
我们将虚拟ip通过keepalived的配置文件 绑定到102机器上,此时 192.168.200.200 等价于 192.168.200.102
访问192.168.200.200和192.168.200.102都能访问到我们102机器上的nginx默认页,
当102机器上的的keepalived服务停止,此时这个虚拟ip会飘到备用机上(103机器)。此时 192.168.200.200 等价于 192.168.200.102,保证用户的正常访问不受影响。
当然,在实际的生产环境中我们配置的会更加详细,这里我提供一个思路:
书写一个shell脚本或者lua脚本:监听nginx进程,如果监控到nginx进程挂了,就尝试重启三次,如果还不行,就kill掉keepalived的进程;并且在keealived的配置文件里邮件服务,当当前机器的keepalived服务挂掉的时候,可以通过发邮件的方式提示维护人员。与此同时,备用机开始启用,虚拟ip飘到备用机上。这个脚本可以写在系统的cron中,并设置的执行频率,一分钟一次(具体看业务场景);这样即使一台nginx挂掉以后,部署的服务也能正常的运行。
从本质上来讲 keepalived和nginx关系不大,但是通过我上诉的脚本,就可以将keepalived和nginx很好的联系起来。
首先,我们将nginx主备集群恢复到处死状态,分别重启102和103两台机器的keepalived
接着我们在102这个主节点上配置相应的脚本文件:
check_nginx_alive_or_not.sh脚本文件代码
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
#判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ]; then
systemctl restart nginx.service
# /usr/local/nginx/sbin/nginx
#等待5秒钟,再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
sleep 5
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
添加运行权限
chmod +x /etc/keepalived/check_nginx_alive_or_not.sh
192.168.200.102(主节点)的keepalived.conf配置文件代码:
! Configuration File for keepalived
global_defs {
#路由id:当前安装keepalived节点主机的标识符,全局唯一
router_id keep_102
}
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 10 #每隔10秒运行上一行的脚本
weight -10 # 如果脚本运行成功,则权重-10
}
vrrp_instance VI_1 {
# 表示的状态,当前的128服务器为nginx的主节点,MASTER/BACKUP
state MASTER
# 当前实例绑定的网卡
interface ens33
# 保证主备节点一致
virtual_router_id 51
# 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 100
# 主备之间同步检查的时间间隔,默认1s
advert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx_alive # 追踪 nginx脚本
}
virtual_ipaddress {
192.168.200.200
}
}
首先,重启102主节点上的keepalived服务并查看状态
然后手动关闭102主节点上的nginx服务,并访问192.168.200.200
最后,等待10s,keepalived服务会去调用我们刚刚书写的shell脚本尝试重启nginx,如果启动不了会把自己的进程也给kill掉,并发送报警邮件给维护人员(发邮件功能暂时未实现)