之前讲了Nginx 如何实现负载均衡,以及如何实现动静分离。我们知道,Nginx服务在整个平台系统中, 处于非常重要的位置,Nginx的高可用影响到整个系统的稳定性。如果Nginx服务器宕机,整个后端web服务将无法提供服务,影响非常严重。
所以,接下来就来介绍Nginx + keepalived 实现高可用的方案。
一、什么是高可用
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过系统架构设计,减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。Nginx作为系统的核心基础服务,它的可用性至关重要。
为了屏蔽Nginx服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。
二、Nginx高可用方案
目前,比较流行的实现Nginx高可用方案就是:keepalived+nginx实现主备方案。这是国内企业中最为普遍的一种高可用方案。
所谓,双机热备其实就是指一台服务器在提供服务时,另一台为某服务的备用状态;当主服务器不可用时,另外备份服务器会获取到主服务器的IP,自动顶替主服务器的功能。
1、什么是keepalived
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
2、keepalived工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。
3、keepalived+nginx实现主备过程
下图是keepalived + nginx 实现主备的过程。
从上图可以看到,主Nginx健康时,系统所有的请求通过主Nginx 转发到Tomcat服务器集群。当主Nginx 宕机后,会立马切换到备Nginx ,由备Nginx 提供转发服务。这样就保证系统的正常运行。
三、环境准备
1、两天Nginx服务器和两台web服务器
两台nginx,一主一备:192.168.101.3和192.168.101.4
两台tomcat服务器:192.168.101.5、192.168.101.6
2、安装keepalived
分别在主备nginx上安装keepalived,这里就讲解keepalived的安装了。
3、配置虚拟IP(vip:192.168.101.100)
四、配置Nginx高可用
1、配置主nginx
修改主nginx下/etc/keepalived/keepalived.conf文件,配置主Nginx。
#全局配置 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.101.100 #可以多个虚拟IP,换行即可 } }
2、配置备nginx
修改备nginx下/etc/keepalived/keepalived.conf文件,配置备Nginx
配置备nginx时需要注意:需要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致
#全局配置 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 BACKUP #标示状态为MASTER 备份机为BACKUP interface eth0 #设置实例绑定的网卡 virtual_router_id 51 #同一实例下virtual_router_id必须相同 priority 99 #MASTER权重要高于BACKUP 比如BACKUP为99 advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置认证 auth_type PASS #主从服务器验证方式 auth_pass 8888 } virtual_ipaddress { #设置vip 192.168.101.100 #可以多个虚拟IP,换行即可 } }
五、测试验证
配置完keepalived和nginx之后,接下来我们验证Nginx的双机备份设置是否成功。
1、启动主备nginx,以及keepalived。
service keepalived start ./nginx
2、启动之后,主Nginx正常工作,分别查看主nginx和 备nginx的eth0设置,如下图所示:
我们可以看到:vip(192.168.101.100)绑定在主nginx的eth0上。说明此时主Nginx 正常。访问http://192.168.101.100,Nginx可以正常访问。
3、将主nginx服务停止或将主nginx关机(相当于模拟宕机),再次查看主nginx和备nginx的eth0设置,如下图所示:
我们可以看到:vip(192.168.101.100)已经漂移到备nginx 服务器上。再次访问http://192.168.101.100,发现虽然主Nginx单击,但是系统依然可以访问。说明Nginx实现了双机热备份,达到了高可用的目的。
最后
以上,keepalived+nginx 系统高可用的解决方案介绍完了,看上去复杂,其实配置还是比较简单的。
推荐阅读:
Nginx极简入门(八)Nginx性能监控及性能状态参数详解!
Nginx极简入门(六)配置Nginx负载均衡,提高系统并发性能!