怎么实现双机热备Nginx高可用呢?
一、背景
在一般的系统架构中,往往是采用一台Nginx做负载均衡,这台Nginx可能负责着转发多台Tomcat的请求。这就有一个问题,如果这台Nginx服务器挂了,那就等于整个系统都挂了。
所以就需要引入一种机制,将Nginx集群化,同时保证有多台Nginx在运行,一台挂了,另外一台还能继续提供服务。要实现Nginx的高可用,就不得不提LVS+Keepalived。
Lvs+Keepalived:Lvs负责将外网请求交由集群中的Nginx进行处理;keepalived则监控lvs群组,根据监控情况,若lvs群组中的master出现宕机情况,则将宕机服务器从ipvsadm移除掉,即将VIP漂移到backup机上。实现了分布式系统高可用。
二、环境准备
系统:Centos7
MASTER 192.168.1.124:安装Lvs+Keepalived
BACKUP 192.168.1.126:安装Lvs+Keepalived
192.168.1.127:安装Nginx
192.168.1.128:安装Nginx
虚拟ip(VIP):192.168.1.110,对外提供服务的ip,也可称作浮动ip
image.png
三、安装Nginx
1、参考安装教程:
https://www.jianshu.com/p/b58b2767a92d
分别为192.168.1.127、192.168.1.128安装Nginx
2、Nginx配置
假设我们现在的项目是前后端分离的项目,Nginx负责转发到前端项目上。现在我新建一个简单的前端html页面,放在下面的文件位置,然后由Nginx去访问(两台Nginx文件位置一样,只是为了验证访问的是哪台Nginx,html内容有些许区别,)
image.png
在/etc/nginx/conf.d目录下,修改default.conf,加入以下内容
location /demo {
root /root/server/vue/demo/; #项目路径
index /demo.html;
}
配置完后,重启Nginx即可
systemctl restart nginx #重启Nginx
如果安装配置成功,运行后应该能访问到新建的demo.html页面,我的效果如下。
image.png
四、配置Master主机(此处我的主机是:192.168.1.124)
1、前提配置
开放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
关闭SELINUX,修改/etc/sysconfig/selinux,永久生效
SELINUX=enforcing 改为 SELINUX=disabled
修改文件关闭SELINUX需要重启机器才能生效,如果不方便重启,可以临时用命令修改,立即生效,但是重启后就会失效。所以我们可以先修改文件(但是不立即重启),然后再用命令执行立即生效,这样等下次有其他需求重启的时候,SELINUX关闭也就永久生效了。
setenforce 0
防火墙开启vrrp 协议支持
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
2、安装Keepalived
执行命令安装
yum -y install keepalived
配置/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
#notification_email { #email 通知
#acassen@firewall.loc #设置报警邮件地址,可以设置多个,每行一个。
#failover@firewall.loc
#sysadmin@firewall.loc
#}
#notification_email_from Alexandre.Cassen@firewall.loc #设置邮件的发送地址
#smtp_server 192.168.200.1 #设置smtp server地址
#smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id LVS_DEVEL #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
interface ens33 #网卡名,用ip a命令可以查看
virtual_router_id 51 #虚拟路由标识,主备两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 ##设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass 1111 #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置vip
192.168.1.110 #可以多个虚拟IP,换行即可
}
}
virtual_server 192.168.1.110 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
delay_loop 6 ##健康时间检查,单位秒
lb_algo rr #负载均衡调度算法wlc|rr,和您将使用的LVS的调度算法保持原则一致
lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
persistence_timeout 50 #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。
#有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
#需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作
#那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.1.127 80 { #真实服务器,此处为Nginx服务器
weight 1 #设置权重,数字越大权重越高
TCP_CHECK { #设置检查方式,可以设置HTTP_GET | SSL_GET
connect_timeout 3 #超时时间,秒。如果在这个时间内没有返回,则说明一次监测失败
nb_get_retry 3 #设置多少次监测失败,就认为这个真实节点死掉了
delay_before_retry 3 #重试间隔
}
}
real_server 192.168.1.128 80 { #真实服务器,此处为Nginx服务器
weight 1 #设置权重,数字越大权重越高
TCP_CHECK { #设置检查方式,可以设置HTTP_GET | SSL_GET | TCP_CHECK
connect_timeout 3 #超时时间,秒。如果在这个时间内没有返回,则说明一次监测失败
nb_get_retry 3 #设置多少次监测失败,就认为这个真实节点死掉了
delay_before_retry 3 #重试间隔
}
}
}
3、安装ipvsadm
执行命令安装。安装ipvsadm在此处只是为了查看LVS的转发情况
yum -y install ipvsadm
查看lvs状态
ipsvadm
五、配置Slave主机(此处我的主机是:192.168.1.126)
1、安装Keepalived
安装同上Master
配置有些许改变
state MASTER 改为:state BACKUP
priority 100 改小为:priority 99
六、配置两台真实主机(此处为两台Nginx)
1、 两台真实Nginx服务器上为回环地址lo:0绑定VIP地址、ARP广播
新建脚本文件realserver.sh,分别在两台真实服务器(192.168.1.127、192.168.1.128)上执行
#!/bin/bash
#description: Config realserver
VIP=192.168.1.110
/etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
执行
chmod +x realserver.sh #赋予权限
chmod +x /etc/rc.d/init.d/functions
./realserver.sh start #执行
另外这个脚本的修改重启后就会失效,所以我们需要将这个脚本设置为开机自启动。
chmod +x /etc/rc.d/rc.local
修改rc.local
vi /etc/rc.d/rc.local
加入以下文件最后追加以下内容即可
/etc/rc.d/init.d/realserver.sh start
realserver.sh启动成功后,可以看到192.168.1.127主机上的回环地址已经绑定上了VIP。
image.png
七、启动keepalived
启动192.168.1.124、192.168.1.126的keepalived
#启动Keepalived
systemctl start keepalived
设置开机自启动
#keepalived设置开机启动
systemctl enable keepalived
其他参考命令
#Keepalived 相关操作命令
#关闭Keepalived
systemctl stop keepalived
#重启Keepalived
systemctl restart keepalived
#查看状态Keepalived
systemctl status keepalived
在Master主机上查看vip是否绑定上
ip addr
可以看到Marster:192.168.1.127的ens33网卡上已经绑定了Vip
image.png
查看keepalived日志
tail -f /var/log/messages
八、试验
1.正常情况
正常情况下,lvs会把请求转发到两个nginx服务上,如下图
image.png
image.png
2.关闭一台keepalived,模拟一台keepalived主机挂掉。
关闭master
systemctl stop keepalived
可以看到master192.168.1.124解绑vip,backup接管了vip
Master
BackUp
页面可以正常访问
image.png
image.png
3.关闭一台Nginx
我们先把上面刚刚关闭的一台keepalived开启,然后再试验关闭Nginx
systemctl start keepalived
开启后正常情况应该是vip重新回到master。
接着关闭192.168.1.127上面的nginx
systemctl stop nginx
可以看到lvs只有一台机器可以转发了
ipvsadm
image.png
访问页面,也只有一台机器的页面了
image.png
如果此时把192.168.1.127上面的nginx开启,那么又会自动恢复集群正常的情况了。
作者:linjiajiam
来源:https://www.jianshu.com/p/6b64a78b6424
欢迎关注“Java引导者”,我们分享最有价值的Java的干货文章,助力您成为有思想的Java开发工程师!