NGINX 作为反向代理服务器可以实现负载均衡,同时也可以作为静态文件服务器,它的特点就是并发支持大,单机可同时支持 3 万并发,现在很多网站都把 NGINX 作为网关入口来统一调度分配后端资源。但是如果 NGINX 宕机了,就会导致整个后台服务无法使用;或者当并发量真的非常大时,达到十万级别时,一台 NGINX 还是有极限的,所以这个时候就需要针对 NGINX 进行主从备份保证服务高可用、集群来分担并发压力。目前,NGINX 在这两块主要有以下几种解决方案,我分别给大家介绍以下
NGINX 主从备份
NGINX 实现主从备份目前主流方案是 Keepalived+Nginx 实现双机热备。
Keepalived 介绍:
Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,类似的工具还有 heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如 lvs、haproxy、nginx)一起工作来达到集群的高可用。
VRRP 协议:
VRRP 全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将 N 台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个 master 和多个 backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟 IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个 IP 的 master 实际负责 ARP 相应和转发 IP 数据包,组中的其它路由器作为备份的角色处于待命状态。master 会发组播消息,当 backup 在超时时间内收不到 vrrp 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master,保证路由器的高可用。
在 VRRP 协议实现里,虚拟路由器使用 00-00-5E-00-01-XX 作为虚拟 MAC 地址,XX 就是唯一的 VRID (Virtual Router IDentifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播 IP 地址 224.0.0.18 来定时发送通告消息。每个 Router 都有一个 1-255 之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低 master 的优先权可以让处于 backup 状态的路由器抢占(pro-empt)主路由器的状态,两个 backup 优先级相同的 IP 地址较大者为 master,接管虚拟 IP。
具体实现原理:
1)Master 没挂,则 Master 占有 vip 且 nginx 运行在 Master 上
2)Master 挂了,则 backup 抢占 vip 且在 backup 上运行 nginx 服务
3)如果 master 服务器上的 nginx 服务挂了,则 vip 资源转移到 backup 服务器上
4)检测后端服务器的健康状态
Master 和 Backup 两边都开启 nginx 服务,无论 Master 还是 Backup,当其中的一个 keepalived 服务停止后,vip 都会漂移到 keepalived 服务还在的节点上
NGINX 和 keepalived 安装配置
网上安装配置比较多,还有编写脚本实现互相监控、报警等,可自行查阅。
NGINX 分布式集群
如果有多台 NGINX 想实现负载均衡,
1、每台 nginx 都有公网地址,在域名处设置同个域名多个指向,最简单实现轮洵。但故障切负会慢一点。
2、一台公网 nginx 通过 upstream 功能,轮洵、ip、url 多方式分发到内网多台 nginx。但公网的 nginx 如果 down 机的话,内网全段。
3、一对公网 nginx 加三个公网 ip,通过 keepalive 实现高可用,再 upstream 到内网(就是我们刚刚上一节讲的主从备份)。
一般来说,上面 1、2、3 种方法基本可以解决,建议用 2 或 3;
如果并发量真的巨大的话,一般就要借助硬件 F5 等设备做负载均衡, 跟 DNS、CDN 等服务商合作做域名解析转发、缓存配置,这也是目前各大互联网公司的做法。