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也宕机了,这样就实现了主备之间的切换了。
高可用环境搭建:
两台虚拟机每台上面都安装一个keepalived、nginx、tomcat,并且实现tomcat反向代理
keepalived安装步骤: nginx反向代理:
配置主nginx上的keepalived:
两台虚拟机随便指定一台为主nginx,修改主nginx下/etc/keepalived/keepalived.conf文件
ifconfig查出来的是eth几上面的interface就写几
下面这是每行配置的意思,上面的截图是我实际配的
! Configuration File for keepalived
#全局配置
global_defs {
notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个
XXX@XXX.com
}
notification_email_from XXX@XXX.com #指定发件人
#smtp_server XXX.smtp.com #指定smtp服务器地址
#smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #运行keepalived机器的一个标识
}
vrrp_instance VI_1 {
state MASTER #标示状态为MASTER 备份机为BACKUP
interface eth0 #设置实例绑定的网卡
virtual_router_id 51 #同一实例下virtual_router_id必须相同
priority 100 #MASTER权重要高于BACKUP 比如BACKUP为99
advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置认证
auth_type PASS #主从服务器验证方式
auth_pass 8888
}
virtual_ipaddress { #设置vip
192.168.137.129 #可以多个虚拟IP,换行即可
}
}
修改备份机nginx下/etc/keepalived/keepalived.conf文件
配置备nginx时需要注意:需要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致
进行测试:
主备nginx都启动keepalived及nginx:
1、service keepalived start
2、./nginx
查看主nginx的eth1设置: /sbin/ip add show eth1
vip绑定在主nginx的eth1上。
查看备nginx的eth2设置:
vip没有绑定在备nginx的eth2上。
把window下hosts文件把虚拟ip配置域名就可以了
通过访问虚拟ip就可以通过keepalived访问到主的nginx上,我主nginx下配置的tomcat为8080,备nginx配置的8181
keepalived是通过查看keepalived的进程在不在来判断切换主备nginx,所以现在把主nginx的keepalived关闭掉,发现129ip已经不绑定了,我130的ip是主nginx,131ip是备nginx
发现keepalived已经移动到备nginx上了
再访问的时候发现切换到8181tomcat了
然后把主nginx的keepalived启动,等一会儿发现keepalived又回到主nginx上了
备nginx上就没有keepalived了
现在我们要做的是当nginx主宕机的时候,切换到备nginx,但是keepalived它是通过keepalived的进程在不在来切换,所以我们需要写个脚本来监控nginx进程是否存在,如果nginx不存在就将keepalived进程杀掉。
这样就做到了当主nginx宕机时,keepalived就自动切换了。
编写check_nginx.sh脚本 进入到/etc/keepalived/目录下:
1、cd /etc/keepalived/
2、vim check_nginx.sh
#!/bin/bash
# 如果进程中没有nginx则将keepalived进程kill掉
A=`ps -C nginx --no-header |wc -l` ## 查看是否有 nginx进程 把值赋给变量A
if [ $A -eq 0 ];then ## 如果没有进程值得为 零
service keepalived stop ## 则结束 keepalived 进程
fi
脚本测试:
将nginx停止,将keepalived启动,执行脚本:sh /etc/keepalived/check_nginx.sh
发现当nginx关闭的时候,执行这个脚本,它就会把keepalived进程关闭,说明好用
修改主nginx的keepalived.conf,添加脚本定义检测:就是时时刻刻检查nginx是否存活,如果宕机就执行那个脚本把keepalived进程删掉。
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
#smtp_server 192.168.200.1
#smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nginx {
script "sh /etc/keepalived/check_nginx.sh" ##监控脚本
interval 2 ##时间间隔,2秒
weight 2 ##权重
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 8888
}
track_script {
check_nginx #监控脚本
}
virtual_ipaddress {
192.168.64.138
}
}
回到负载均衡高可用的初始状态,保证主、备上的keepalived、nginx全部启动。
停止主nginx服务
观察keepalived日志:
tail -f /var/log/keepalived.log
发现当nginx一停止,keepalived自动关闭进程
keepalived已经切换到备机上来了