Linux环境下实现nginx双机热备+集群搭建
说明:本案例模拟真实生产环境,模拟搭建6台linux服务器(CentOS7),6台linux服务器上需要安装nginx(本案例选用1.18.0版本),安装keepalived(本案例选用2.2.7版本)
一、nginx高可用方案介绍
- 什么是nginx的高可用?
nginx高可用就是部署配置两台以上的nginx服务器,正常情况下,主服务器进行工作,从服务器作为备用节点,等待主服务器宕机后,自动切换到备用服务器来接替主服务器继续工作 - 为什么要使用nginx的高可用?
首先,先从nginx的单体架构开始分析,nginx单体架构图如下所示:
nginx单体架构往往会存在单点故障或性能上的瓶颈,当nginx服务器宕机或者性能达到瓶颈时,整个应用将会无法使用
因此,需要引入nginx的高可用方案,来防止单点故障,解决nginx性能上的瓶颈问题
nginx高可用架构如下所示:
相比较nginx单体架构,nginx高可用架构引入了nginx+keepalived机制,高可用架构中至少需要部署两台nginx(主从),并且每一台nginx服务器上需要安装keepalived工具,keepalived通过VRRP(虚拟路由冗余协议)来进行工作,通过keepalived自身提供的健康检查功能,作为MASTER的keepalived持续向作为BACKUP的keepalived发送广播心跳包,当作为BAKCUP的keepalived获取不到来自MASTER的广播包时,就会认为主服务器上的keepalived宕机,之后会通过keepalived的选举机制,选举出新的MASTER节点,完成虚拟ip(vip)的漂移,由新选举出来的MASTER节点接管宕机的keepalived节点继续工作,当主服务器上的keepalived重新启动后,通过进行抢占式或者非抢占式的配置,来决定是从服务器上的keepalived节点继续工作还是主服务器抢占vip继续工作
当主服务器上的nginx宕机时,keepalived会通过配置,持续执行nginx的监控脚本,当发现主服务器上找不到nginx的进程时,就会执行监控脚本中的重启nginx的命令,如果还是监控不到nginx进程,就会重新计算主服务器上keepalived的权重,当主服务器上的权重小于从服务器上的权重时,就会进行vip的漂移,由从服务器上的keepalived节点继续工作,当主服务器上的nginx重新启动后,通过监控重新计算keepalived的权重,当主服务器上的权重大于从服务器上的权重时,主服务器上的keepalived节点又可继续进行工作
这种主从热备机制的高可用架构,虽然解决了单点故障的问题,但是却不能解决nginx性能上的瓶颈,从某种意义上来说,这种主从热备机制的高可用方案,依然属于单体架构,因为始终只有一台nginx在工作,当并发量很高的时候,依然会存在nginx性能上的瓶颈,因此需要通过nginx的水平扩展,通过引入主从热备+集群的方式,解决单点故障和弥补nginx性能上的瓶颈
主从热备+集群的高可用架构如下所示:
从上图可以看出,主从服务器之间通过keepalived实现主从热备,解决单点故障问题,通过集群部署的方式分担客户端发送来的请求,降低单体nginx所承受的负载,弥补nginx的性能瓶颈,真正实现nginx的高可用 - nginx的高可用方案
①双机热备机制(主从热备/双主热备)
②双机热备+集群机制
二、主从备份(双机热备)搭建
- 搭建前准备:
两台安装nginx、keepalived的linux服务器
服务器名称 | 服务器ip |
---|---|
server1 | 192.168.132.138 |
server2 | 192.168.132.141 |
- 本案例将192.168.132.138作为主节点,
cd
到keepalived核心配置文件所在目录下,执行vim keepalived.conf
命令编辑核心配置文件
vrrp_instance VI_1 {
state MASTER # 设置keepalived节点的初始化状态为MASTER
interface ens33
virtual_router_id 51
priority 100 # 设置keepalived节点的优先级
advert_int 1 # 设置vrrp包发送间隔,即多久进行一次master选举,主从节点需要设置相同
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 设置虚拟ip,即对外暴露地址
192.168.132.16
}
}
- 192.168.132.141作为从节点,对从节点上的keepalived核心配置文件进行编辑修改
vrrp_instance VI_1 {
state BACKUP # 设置keepalived节点初始换状态
interface ens33
virtual_router_id 51
priority 90 # 设置keepalived节点优先级,应小于keepalived主节点优先级
advert_int 1 # 设置vrrp包发送间隔,朱从节点需设置相同
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 设置虚拟ip,需与主节点设置一致
192.168.132.16
}
}
- 以上配置只是做了节点的主从配置,当keepalived主节点发生故障时,会发生虚拟ip(vip)漂移,keepalived从节点会接管主节点继续进行工作,当keepalived主节点恢复正常后,又会重新抢占vip进行工作,但是,当主节点服务器上的nginx发生故障时,整个应用还是无法正常使用,因此就需要通过keepalived配置检测nginx的健康状况,实现nginx主备服务器的自动切换
- 编写keepalived检测脚本
#!/bin/bash
A=`ps -C nginx --no-header | wc -l` # 声明检测nginx进程检测命令
if [ $A -eq 0 ];then # 如果nginx进程不存在
/usr/local/nginx/sbin/nginx # 启动nginx
sleep 2 # 睡眠2秒
if [ $A -eq 0 ];then # 重建检测nginx进程是否存在
exit 1 # 如果不存在,返回1
else
exit 0 # 如果存在,返回0
fi
fi
注:
①#!/bin/bash只能放在第一行,表示本脚本由/bin/路径的bash程序来解释,#后面不能有空格,否则keepalived执行检测脚本时会报错
②如果脚本返回1,则会自动进行priority+weight优先级计算
③检测脚本在主从节点服务器上都要存在
④脚本文件需要赋可执行权限chmod 777 脚本名称
5. 重新对主从keepalived节点进行配置,新增keepalived的脚本检测命令
# 声明nginx检测函数
vrrp_script nginx_check {
script /usr/local/nginx/sbin/nginx_check.sh # 指定检测脚本位置
interval 2 # 每2秒检测一次nginx的运行状态
weight -20 # 失败一次,进行一次priority+weight优先级计算
fail 2 # 如果脚本检测两次失败,则认为nginx发生故障
rise 1 # 如果脚本检测成功一次,则认为nginx恢复正常
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.132.16
}
track_script { # 声明需要进行检测的函数
nginx_check # 对应上面定义的nginx检测函数名称
}
}
-
主从节点服务器分别启动nginx和keepalived,浏览器访问配置的虚拟ip地址,发现是主节点服务器上的nginx给出的响应
-
在主节点服务器上,
kill
掉nginx进程,浏览器立即访问虚拟ip地址,会发现请求一直在loading,等待几秒钟后,浏览器重新请求,发现主节点服务器上的nginx又能给出响应了,执行ps -ef|grep nginx
命令发现存在nginx进程,说明主节点keepalived执行了nginx检测脚本,重启了nginx服务(脚本文件中sleep
指令和启动nginx指令交换位置,测试效果会更明显)
-
cd
到nginx执行文件目录下,执行mv
命令将nginx启动文件移动到其他目录下,再次kill
掉nginx进程,观察nginx进程的变化情况,因为nginx启动文件不在脚本声明的路径下,因此执行nginx检查脚本,不会在启动nginx服务,每执行失败一次,就会重新计算优先级,失败指定次数后,就会认为nginx服务发生故障,此时如果主节点优先级<从节点优先级,vip就会漂移到从节点服务器上,此时浏览器访问192.168.132.16虚拟ip,就会发现,是从节点服务器上nginx做出的响应
-
将nginx启动文件
mv
到原来执行文件所在目录下,keepalived主节点执行检测脚本时,会重启nginx服务,keepalived执行检测脚本成功指定次数后,就会认为主节点上nginx服务恢复正常,此时keepalived主节点就会抢占虚拟ip重新绑定的主节点所在服务器上,通过浏览器访问192.168.132.16虚拟ip,就会发现,主节点服务器上nginx又重新做出的响应
至此,nginx双机热备搭建完成
三、主从热备机制–抢占式和非抢占式模式配置验证
- 服务器准备:
192.168.132.138-------->nginx+keepalived(MASTER)
192.168.132.141-------->nginx+keepalived(BACKUP)
192.168.132.16---------->vip
- 抢占式
实际上,keepalived默认配置就是抢占模式,即MASTER服务器正常工作时,BACKUP服务器只作为备用节点等待,并不进行工作,当MASTER服务器宕机后,vip自动漂移到BACKUP服务器,由BACKUP服务器接替MASTER服务器继续工作,当MASTER服务器恢复正常后,通过抢占的方式,实现vip的再次漂移,此时MASTER服务器继续工作,BACKUP服务器仍作为备用节点等待
(1)分别启动138、141两台服务器上的keepalived和nginx
(2)启动成功后,浏览器访问192.168.132.16虚拟ip地址,发现是主节点138服务器上nginx返回的响应
(3)在138、141两台服务器上分别执行ip addr
命令,观察ens33网卡上ip的绑定情况,可以观察到,此时虚拟ip192.168.132.16绑定在138这台主服务器上
(4)kill
掉138服务器上的keepalived进程,再次在浏览器上访问192.168.132.16虚拟ip,可以发现此时,发送响应信息的是141服务器
(5)此时,再次执行ip addr
命令查看虚拟ip的绑定情况,发现vip已自动漂移到了141服务器
(6)重启138服务器上的keepalived服务,发现vip又重新漂移到了138服务器上
- 注:以下情况才会发生vip的抢占
①两台都为master时,server1的优先级大于server2,keepalived启动后,server1变为master,server2自动降为backup,server1宕机,server2接替工作,server1恢复,抢占vip继续工作,server2变为backup
②server1为master,server2为backup,并且server1的优先级大于server2,keepalived启动后,server1变为master,server2自动降为backup,server1宕机,server2接替工作,server1恢复,抢占vip继续工作,server2变为backup
③server1为master,server2为backup,并且server1优先级小于server2,keepalived启动后,server2变为master,server1自动降为backup,server2宕机,server1接替工作,server2恢复,抢占vip继续工作,server1变为backup
- 非抢占式
非抢占模式即当master节点宕机时,backup节点接替master节点继续工作,当master节点恢复正常后,并不会抢占backup节点上的vip,而是等待backup节点宕机后,再通过vip自动漂移,master节点重新进行工作,非抢占模式需要通过配置才能生效
(1)cd
到keepalived核心配置文件目录下,执行vim keepalived.conf
命令进行编辑,通过配置nopreempt
属性实现非抢占模式,master和backup都需要添加该属性
vrrp_instance VI_1 {
state MASTER # keepalived状态
interface ens33 # 网卡名称
virtual_router_id 51 # 虚拟路由id
priority 100 # 优先级
advert_int 1 #
nopreempt # 开启非抢占模式
# 认证
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip
virtual_ipaddress {
192.168.132.16
}
# nginx宕机后,进行vip漂移的函数
track_script {
nginx_check
}
}
(2)浏览器访问192.168.132.16虚拟ip,master服务器返回响应信息
(3)执行ip addr
命令,发现虚拟ip绑定在master服务器上
(4)关闭主服务器上的keepalived服务进程,再次执行ip addr
命令,发现虚拟ip已经漂移到了backup服务器上
(5)重新启动主服务器上的keepalived服务,执行ip addr命令,发现虚拟ip仍然绑定在backup服务器上
(6)关闭从服务器上的keepalived服务进程,发现虚拟ip重新漂移到了master服务器上
四、集群环境搭建
- 搭建前准备:(也可进行伪集群环境搭建)
六台安装nginx、keepalived的linux服务器
两台安装tomcat的linux服务器
服务器名称 | 服务器ip |
---|---|
server1 | 192.168.132.138 |
server2 | 192.168.132.139 |
server3 | 192.168.132.140 |
server4 | 192.168.132.141 |
server5 | 192.168.132.142 |
server6 | 192.168.132.143 |
tomcat1 | 192.168.132.144 |
tomcat2 | 192.168.132.145 |
其中,server1-----server4上部署的keepalived搭建双机热备,虚拟ip设置为192.168.132.16,server2-----server5上部署的keepalived搭建双机热备,虚拟ip设置为192.168.132.17,server3-----server6上部署的keepalived搭建双机热备,虚拟ip设置为192.168.132.18
server1–server6上部署的nginx做tomcat1和tomcat2的反向代理
-
分别启动server1–server6这六台服务器上的nginx和keepalived,通过观察六台服务器上虚拟ip的绑定情况和浏览器访问虚拟ip地址来测试双机热备是否搭建成功
-
启动tomcat1和tomcat2,server1–server6六台服务器上nginx配置的反向代理监听的端口为82,nginx负载均衡默认为轮询,通过浏览器访问虚拟ip192.168.132.16:82、192.168.132.17:82、192.168.132.18:82,测试集群环境下nginx的负载均衡,从而实现nginx真正意义上的高可用架构