解决方案:Nginx高可用方案


关键词

  • KeepAlived(主服务器 和 备份服务器 故障时 IP 瞬间无缝交接)
  • VRRP协议(路由器组,提供虚拟IP,一个master和多个backup,组播消息,选举backup当master)
  • Nginx+keepalived 双机主主模式(俩公网虚拟IP,负载);双机主从模式(热备服务器)

需求:
由于业务扩展,网站的访问量不断加大,负载越来越高。现需要在web前端放置nginx负载均衡。

在生产环境下,Nginx作为流量的入口,如果Nginx不能正常工作或服务器宕机,将导致整个微服务架构的不可用。

所以结合keepalived对前端nginx实现HA高可用

一、Nginx & KeepAlived

Nginx 进程基于Master+Slave(worker)多进程模型,自身具有非常稳定的子进程管理功能。在Master进程分配模式下,Master进程永远不进行业务处理,只是进行任务分发,从而达到Master进程的存活高可靠性,Slave(worker)进程所有的业务信号都 由主进程发出,Slave(worker)进程所有的超时任务都会被Master中止,属于非阻塞式任务模型。

KeepAlived是Linux下面实现VRRP备份路由的高可靠性运行件。基于KeepAlived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。二者结合,可以构架出比较稳定的软件LB(Load Balance)方案。

KeepAlived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,KeepAlived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后KeepAlived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

KeepAlived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有Heartbeat 、Corosync、Pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如LVS、Haproxy、Nginx)一起工作来达到集群的高可用。

二、VRRP协议

VRRP全称 Virtual Router Redundancy Protocol,即”虚拟路由冗余协议“。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(VIP - Virtual IP,也就是路由器所在局域网内其他机器的默认路由),占有这个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)Nginx+keepalived 双机主从模式:
即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。

(2)Nginx+keepalived 双机主主模式:
即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。

四、基础环境准备

两台服务器:192.168.253.11(主), 192.168.253.12(从),每台服务器上分别安装Nginx 、KeepAlived。

cd /usr/local/openresty/nginx/sbin./nginx -s stop

(1)安装Nginx:

# 添加源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm# 安装Nginx
sudo yum install -y nginx# 启动Nginx
sudo systemctl start nginx.service# 浏览器访问测试
http://192.168.253.11/
http://192.168.253.12/

(2)安装KeepAlived可使用yum直接安装:

yum -y install keepalived

查看KeepAlived配置文件:

cat /etc/keepalived/keepalived.conf

接下来就是要对该配置文件进行修改,该配置文件在/etc/keepalived/路径下。在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,它是为lvs准备的。
(3)关闭防火墙(默认关闭)
(4)关闭selinux(如果不关闭,KeepAlived不生效)
临时关闭:

[root@localhost ~]# getenforce Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforcePermissive

永久关闭:

[root@localhost ~]# vim /etc/sysconfig/selinuxSELINUX=enforcing 改为 SELINUX=disabled重启服务reboot

五、配置主备模式

(1)修改主配置文件:

! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id master11
}# nginx挂了,实现vip自动漂移,使用如下脚本控制
vrrp_script check_nginx {script "/usr/local/nginx/nginx_check.sh"interval 2  # 机器宕机执行的次数weight 2
}# 当前实例配置
vrrp_instance VI_1 {state MASTER   # 主机interface ens33  # 绑定的网卡virtual_router_id 51   # 组id,需要一致priority 100  # 优先级advert_int 1  # 检查间隔,默认1s# 调用nginx挂了之后进行vip漂移的函数  track_script {check_nginx}authentication {auth_type PASSauth_pass 1111}# 配置vipvirtual_ipaddress {192.168.253.50/24 dev ens33 label ens33:1 scope global}
}

在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,我们这用不到,它是为lvs准备的。
(2)/usr/local/nginx/nginx_check.sh :

# 在/usr/local下新建目录nginx
mkdir nginx
# 新建文件
touch nginx_check.sh
# 编辑内容
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`   #查看nginx进程是否存在
#if [ $A -eq 0 ];then              /usr/sbin/nginx         #重启nginxif [ $A -eq 0 ];then   #nginx重启失败exit 1 # keepalived执行脚本,返回非0结果,ip漂移elseexit 0 # keepalived执行脚本,返回0,ip不漂移fi
#else
#  exit 0
#fi

需要给nginx_check.sh文件加可执行权限:

chmod +x nginx_check.sh

(3)修改从机keepalived.conf配置文件:

! Configuration File for keepalived
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id backup
}vrrp_script check_nginx {script "/usr/local/nginx/nginx_check.sh"interval 2weight 2
}vrrp_instance VI_1 {state BACKUP  # 从机interface ens33virtual_router_id 51  # 组id,需要一致priority 99   # 优先级advert_int 1# 调用nginx挂了之后进行vip漂移的函数    track_script {check_nginx}authentication {auth_type PASSauth_pass 1111}# 配置vipvirtual_ipaddress {192.168.253.50/24 dev eth0 label ens33:1 scope global}
}

同样需要在/usr/local/nginx/路径下放上nginx_check.sh脚本文件。
(4) 启动nginx、keepalived

#主从启动
sudo systemctl restart nginx.service#主从启动
systemctl start keepalived

(5)访问测试
为效果明显,可以修改Nginx首页,将主从IP地址放置首页以便区分。

访问http://192.168.253.50 or curl 192.168.253.50

查看Nginx日志:

cd  /var/log/nginx/
cat  access.log

查看主服务器keepalived日志:

Keepalived默认所有的日志都是写入到/var/log/message ,
你可以使用命令 tail -f /var/log/messages|grep Keepalived 进行查看

查看ens33网卡信息:

ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
pfifo_fast state UNKNOWN group default qlen 1000inet 192.168.253.11/24 brd 192.168.253.255 scope
global noprefixroute ens33 inet 192.168.253.50/24 scope global secondary ens33:1
#VIP已漂移到主机,vip只能选择一个机器进行绑定

(6)停掉主服务器的nginx
通过浏览器访问:http://192.168.253.50
查看主机KeepAlived日志:

tail -f /var/log/messages|grep Keepalived
# 强制停止
pkill -9 nginx# 查看Nginx进程
ps -ef | grep nginx# 等待几秒后再次查看Nginx进程,发现已经通过检查脚本自启
# 因为在keepalived脚本中,进行了nginx重启操作

则会执行脚本nginx_check.sh进行nginx启动!

  • 如果master上的nginx服务挂了,则nginx会自动重启,重启失败后会自动关闭keepalived,这样vip资源也会转移到slave上。
  • master和slave两边都开启nginx服务,无论master还是slave,当其中的一个keepalived服务停止后,vip都会漂移到keepalived服务还在的节点上;
  • 如果要想使nginx服务挂了,vip也漂移到另一个节点,则必须用脚本或者在配置文件里面用shell命令来控制。(nginx服务宕停后会自动启动,启动失败后会会致使vip资源漂移到另一台机器上)

解决方案:Nginx高可用方案相关推荐

  1. 生产环境:Nginx高可用方案

    准备工作: 192.168.16.128 192.168.16.129 两条虚拟机.安装好Nginx 安装Nginx 更新yum 源文件: 安装Nginx: 操作命令: 什么是高可用? 高可用HA(H ...

  2. nginx高可用方案:keepalived+nginx vip 动态位移

    文章目录 一.部署总览+常用命令 1. 部署总览 2. 常用命令 二.软件安装配置 2.1. 安装keepalived 2.2. 安装nginx 2.3. 配置静态文件 三.测试 3.1. 启动ngi ...

  3. 算法高级(15)-LVS的负载均衡策略及LVS+KeepAlived+Nginx实现高可用方案

    前面讲的nginx负载均衡,是属于网络七层负载,今天讲另外一种负载均衡技术LVS,它是基于网络四层进行负载,性能很好,通常在大型项目中,我们会同时使用四层和七层负载. 一.LVS简介 LVS是Linu ...

  4. 【网站架构】Nginx负载均衡宕机怎么办?Nginx性能调优、集群、高可用方案

    ​ 大家好,欢迎来到停止重构的频道. 本期,我们讨论Nginx的性能调优. Nginx一般是作为网站系统的反向代理或负载均衡,但这里有一个问题,负载均衡可以绑定多个后端服务器. 一个后端服务器宕机后, ...

  5. 高可用系列文章之三 - NGINX 高可用实施方案

    前文链接 高可用系列文章之一 - 概述 - 东风微鸣技术博客 (ewhisper.cn) 高可用系列文章之二 - 传统分层架构技术方案 - 东风微鸣技术博客 (ewhisper.cn) 四 NGINX ...

  6. 基于mycat高可用方案——数据库负载

    引言 传统企业级应用一般采取单台数据库,吞吐所有应用的读写,随着互联网的高速发展,以及微服务架构越来越普及,往往采用分库分表来支撑高速增长的大量业务数据吞吐.分库分表主要有两种方式:水平分表和垂直分库 ...

  7. 基于mycat高可用方案——数据库负载(基于阿里云)

    引言 传统企业级应用一般采取单台数据库,吞吐所有应用的读写,随着互联网的高速发展,以及微服务架构越来越普及,往往采用分库分表来支撑高速增长的大量业务数据吞吐.分库分表主要有两种方式:水平分表和垂直分库 ...

  8. 【7W字长文】使用LVS+Keepalived实现Nginx高可用,一文搞懂Nginx

    往期文章一览 分布式会话与单点登录SSO系统CAS,包含完整示例代码实现 [15W字长文]主从复制高可用Redis集群,完整包含Redis所有知识点 使用LVS+Keepalived实现Nginx高可 ...

  9. Nginx 高可用秘籍

    什么是高可用? 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. 如果一个系统能够一直提供服务,那么这个可用性 ...

最新文章

  1. 自然语言处理数据集免费资源开放(附学习资料)
  2. php mysql ajax 分页_ajax+php+mysql无刷新分页代码(1/2)_PHP教程
  3. 【深度学习】——如何处理输入图像大小不一样的情况
  4. 第二阶段团队绩效考核报告
  5. 字典添加数据_MATLAB自动化——EXCEL与数据字典管理(一)
  6. 纯干货 | UI界面中按钮设计CTA按钮\订阅按钮
  7. oracle的sid
  8. 【优化预测】基于matlab贝叶斯网络优化LSTM预测【含Matlab源码 1329期】
  9. java移位运算符有哪些_java中有三种移位运算符
  10. html 倒计时,jQuery倒计时插件
  11. javascript跨域
  12. vncview用法_vnc远程桌面怎么使用(最新vncviewer使用教程)
  13. hdf heg 批量拼接_MODIS处理工具MRT已被HEG代替
  14. Rhombus 使用 Wolfspeed SiC 加快电动汽车充电速度
  15. arcgis的python安装包_用Python使用arcgis中站点包arcpy
  16. 为什么有人会说「感谢拼多多」,让一贫如洗的我还能活下去?
  17. linux shell脚本 字符串、整数、小数判断
  18. 试题 历届试题 青蛙跳杯子
  19. 人工智能会话代理在医疗保健中的有效性:系统综述
  20. Deep Supervision:深度监督(2014)+DHM

热门文章

  1. Datrium公司以几近疯狂的方式提升速度表现
  2. ZOJ2724_Windows Message Queue(STL/优先队列)
  3. Android内存泄漏的各种原因详解
  4. MyBatis学习总结(4)——解决字段名与实体类属性名不相同的冲突
  5. 关于垂直切分Vertical Sharding的粒度
  6. windows7修改双系统启动项名称、先后顺序、等待时间
  7. 虚拟寄存器,虚拟堆栈与真实寄存器,真实堆栈如何对应
  8. 从零开始学MVC3——创建项目
  9. 单调栈 、 队列学习
  10. 前端开发要注意的浏览器兼容性问题整理