一. 理论知识了解
- nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重要的位置,如果nginx服务器宕(dang)机,后端web服务器将无法提供服务,为了解决这个问题,需要建立一个备份机。
- keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。keepalived工作流程,它可以对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址),域名会绑定到这个vip上面,vip动态绑定主备机,请求来的时候,会先到达vip,然后传到主服务器,然后传到tomcat集群上去。如下图,备份机时时刻刻会往主服务器发送心跳包,“你还活着么?”,当主服务器没有反馈的时候,vip会自动跳转到备用机上面,当主服务器修好后,它又会自动跳转到主服务器上。
- keepalived切换主备机是根据keepalived自身是否宕机来切换的,如果keepalived宕机了它就切换到备份机上,所以自己写个脚本,监听nginx是否宕机,如果nginx宕机就让keepalived也宕机了,这样就实现了主备之间的切换了。
二. 环境准备
- 两台centos7虚拟机
主:192.168.72.60 (CentOS_7_01)
备:192.168.72.244(CentOS_7_02) - 两台虚拟机中分别安装nginx
- 两台虚拟机中分别安装keepalived
三. 安装配置keepalived
- yum命令在两台虚拟机中安装keepalived
yum install keepalived –y
- 安装之后,在/etc/keepalived下有文件keepalived.conf
- 分别修改主备两台机器中的keepalived.conf文件(可以用如下配置直接替换)
(1)主:192.168.72.60(CentOS_7_01)
global_defs {
notification_email {
#指定keepalived在发生切换时需要发送email到的对象,
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
#指定发件人
notification_email_from Alexandre.Cassen@firewall.loc
#运行keepalived机器的一个标识,通常为主机hostname,此处需要在/etc/hosts中加入127.0.0.1 LVS_DEVEL的映射关系
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡,设置实例绑定的网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 150 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置认证
auth_type PASS #主从服务器验证方式
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_http_port #执行 Nginx 监控的服务
}
virtual_ipaddress { #设置vip
192.168.72.50/24 dev ens33 label ens33:1 // VRRP H 虚拟地址
}
}
(2)备:192.168.72.244(CentOS_7_02)
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_http_port #执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.72.50/24 dev ens33 label ens33:1 // VRRP H 虚拟地址
}
}
- 在/usr/local/src/目录下,加入nginx_check.sh检测脚本程序,该脚本程序如下
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
# 以下两行暂时先注掉,防止测试时,手动关闭nginx后,脚本又自动启动nginx
# /usr/local/nginx/sbin/nginx
# sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
修改脚本权限为可执行脚本
chmod 777 nginx_check.sh
./nginx_check.sh 确认该脚本是否可以执行,如果出现如下报错
/bin/bash^M: bad interpreter: No such file or directory
则执行以下命令,把文件转换为unix格式
dos2unix nginx_check.sh
注意:可能killall和dos2unix命令不可执行,则需要大家通过yum命令自行安装
5. 启动两台nginx与keepalived
启动 nginx :在nginx目录下执行 ./nginx
启动 keepalived :systemctl start keepalived.service
确认两台机器中有如下进程,则说明nginx与keepalived启动成功
四、测试keepalived是否绑定网卡成功
- 在主机CentOS_7_01中ip addr查看是否绑定上配置的虚拟IP
- 此时备用机CentOS_7_02中是没有绑定的虚拟IP的
- 手动./nginx -s stop去关闭主机CentOS_7_01中的nginx,然后再手动执行nginx_check.sh脚本去关闭主机所有的keepalived进程,会发现绑定的虚拟ip由主机CentOS_7_01移到了备用机CentOS_7_02中
- 说明keepalived主备高可用配置成功
五. 浏览器访问虚拟ip测试
- 浏览器输入虚拟ip: 192.168.72.50,访问nginx成功
2. 关闭主机CentOS_7_01的nginx,此时绑定的虚拟ip会从主机CentOS_7_01移到备用机CentOS_7_02上,再次访问192.168.72.50测试,一样可以访问通。
注意:
(1) 有时访问虚拟ip访问不通,检查是否关闭防火墙及关闭selinux模式
a). 临时关闭,不需要重启
setenforce 0
b). 永久关闭,需要重启
vim /etc/selinux/config
将第七行的 SELINUX=enforcing 改为 SELINUX=disabled,然后reboot重启
(2) 关闭主机CentOS_7_01的nginx后,立马再去访问192.168.72.50时可能会出现访问不到,失去响应
的情况,稍等1~2分钟再试,就可以访问通了(这个原因暂时不知道是为什么)