原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

目前HTTP协议,乃至WebSocket协议,乃至采用了MQTT协议的WebSocket协议,都不可避免的使用了Nginx。所谓病从口入,祸从口出。作为入口,Nginx承担的责任非常的重要。假如某个时刻不能用了,那可真是灾难。

如何保证Nginx的高可用呢?这是个问题。不论你用什么样的方案,到最后总是要归为单一,很让人苦恼。

所谓的高可用,无非两种方式。一种方式就是在组件自身上做文章,另外一种方式,就是加入一个中间层。我们通常希望在高可用的时候,同时还能够负载均衡,典型的猫和狗都想要,贪婪的很。

每当解决不了问题的时候,我们都会加入一个中间层,然后把希望寄托在这个新生的组件上。

如果这个中间层解决不了问题,我们就可以加入另外一个中间层。就这样一层套一层,到最后系统高可用架构就会变得非常复杂。

DNS保证高可用

第一种方式当然是要在DNS上做文章了。通过在DNS上,绑定多个Nginx的IP地址,即可完成高可用。不仅能够完成高可用,还能顺便完成负载均衡。

但这玩意有一个致命的问题,那就是故障的感知时间。

我们的浏览器在访问到真正的Nginx之前,需要把域名转化为真正的IP地址,DNS就是干解析这个动作的,每次需要耗费20-20ms不等。

为了加快解析速度,一般都会有多级的缓存。比如浏览器就有DNS的缓存;你使用的PC机上也有这样的缓存;IPS服务提供商,也会有缓存;再加上有的企业为了加速访问所自建的DNS服务器,中间的缓存层就更多了。

只有所有的缓存都不命中的情况下,DNS才会查询真正的IP地址。所以,如果有一台Nginx当机了,这个故障的感知能力就会特别的差。总有一部分用户的请求,会落在这台已经死亡的机器上。

硬件保证高可用

我们前面说了。解决不了的问题,就可以加中间层,即使这个中间层是硬件,比如F5

这种架构一般的企业玩不起,只有那些采购有回扣有油水的公司,才会喜欢这个。互联网中用的很少,就不过多介绍了。

当然,F5同样有单点的问题。虽然硬件肯定要比软件稳定上一点,但是总归是一个隐患。就像Oracle无论再厉害,它还是有出问题的时候,到时候备机是必须的。

有的厂商在卖硬件的时候,推荐你一次买3个!为啥呢?这也有理由。

你的一台硬件正在服务,有两台备份机器。当你服务的这台机器出现问题时,就可以选取备份机中的其中一台作为主机,另一台依然是备机,集群还是高可用的。

这理由真让人陶醉。按照这个逻辑,碰到傻子,我可以卖出100台!

主备模式

硬的不行,就要来软的。采用主备的模式,使用软件来完成切换过程。

如图,使用keepalived组件,通过VRRP协议,即可完成最简单的高可用配置。

我们把DNS的地址绑定在VIP上,当正在服务的Nginx发生问题,VIP会发生漂移,转移到另外一台Nginx上。

可以看到,备份的Nginx,正常情况下是无法进行服务的,它也叫做影子节点,只有主Nginx发生问题的时候才有用。如果你的节点非常多,这种模式下,会有非常大的浪费。

除了浪费,还有一个非常大的问题。那就是,单台Nginx无论性能多么牛X,总是有上限的。当网卡的流量达到顶峰,接下来何去何从呢?

这种模式肯定是不满足需求的。

简单组合模式

这个时候,我们就可以配合DNS解析,以及主备模式做文章了。如下图,DNS解析到两个VIP上,VIP本身也做了高可用。这样就能够缩短故障时间,同时也能够保证每个组件的高可用。

这种架构模式思路是非常清晰的,但依然存在影子节点的浪费。

LVS+KeepAlived+Nginx

LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器。现在 LVS 已经是 Linux 标准内核的一部分,从 Linux2.4 内核以后,已经完全内置了 LVS 的各个功能模块,无需给内核打任何补丁,可以直接使用 LVS 提供的各种功能。

LVS工作在OSI模型的第4层:传输层,比如TCP/UDP,所以像7层网络的HTTP协议,它是识别不出来的。也就是说,我们不能拿HTTP协议的一些内容来控制路由,它的路由切入层次更低一些。

如下图,LVS 架设的服务器集群系统有三个部分组成:

  • 最前端的负载均衡层,用 Load Balancer 表示

  • 中间的服务器集群层,用 Server Array 表示

  • 最底端的数据共享存储层,用 Shared Storage 表示

DR(直接路由)模式可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈,是目前采用最为广泛的方式(数据不详,fullnat模式使用也比较广泛)。

所以,配合DNS的负载均衡,加上LVS的负载均衡,可以实现双层的负载均衡和高可用。

如图,DNS可以将请求绑定在VIP上。由于LVS DR模式的效率非常高,网卡要达到瓶颈也需要非常大的请求量(只有入口流量才走LVS),所以一般通过LVS做nginx的负载均衡就足够了。如果LVS还有瓶颈,那么就可以在DNS上再做文章。

还有哪些挑战?

其实,我们上面谈到的这些方案,大多数是在同机房的。如果在多个机房,如何让用户选择最快的节点、如何保证负载均衡,又是一个大的问题。另外,你可以看到数据包经过层层的转发和协调,还有多种负载均衡算法参与其中,如何保持会话,也是一个挑战。一般的,四层会话会通过IP地址去实现,七层会话会通过cookie或者头信息等去实现。

开发人员一般情况下接触不到这么入口级的东西,但一旦遇到了,可能会受忙脚乱。本文是xjjdog根据一些即有的经验进行整理,希望你在公司需要一些高可用方案的时候,能够助你一臂之力。

什么叫方案?你只需要 当时 把你的领导哄好,让他感觉很认同的样子就行了。至于要不要做,具体怎么做,那都是后面的事。君不见,扯了这么半天,很多企业其实一个nginx,就可以走天下。

作者简介:小姐姐味道  (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

推荐阅读:

一图解千愁,jvm内存从来没有这么简单过!
失联的架构师,只留下一段脚本
架构师写的BUG,非比寻常
nginx工程师,需要上承天命,下召九幽
实力解剖一枚挖矿脚本,风骚操作亮瞎双眼
又一P1故障,锅比脸圆
传统企业的人才们,先别忙着跳“互联网”!
面试官很牛,逼我尿遁
又一批长事务,P0故障谁来背锅?
一天有24个小时?别开玩笑了!
《程序人生》杀机!
可怕的“浏览器指纹”,让你在互联网上,无处可藏
2w字长文,让你瞬间拥有「调用链」开发经验
996的乐趣,你是无法想象的
作为高级Java,你应该了解的Linux知识(非广告)
必看!java后端,亮剑诛仙(最全知识点)
学完这100多技术,能当架构师么?(非广告)
Linux上,最常用的一批命令解析(10年精选)
数百篇「原创」文章,助你完成技术「体系化」


HA(高可用)就像套娃,像胖子,剥掉一层还有一层相关推荐

  1. HA高可用集群与RHCS集群套件

    一.HA基本概念 linux高可用集群(HA)原理详解:https://blog.csdn.net/xiaoyi23000/article/details/80163344 负载均衡.集群.高可用(H ...

  2. 大数据实操篇 No.11-Flink on Yarn集群HA高可用部署及使用

    第1章 简介 1.1 概要介绍 Flink on Yarn的HA高可用模式,首先依赖于Yarn自身的高可用机制(ResourceManager高可用),并通过Yarn对JobManager进行管理,当 ...

  3. 主机 HA 高可用知识梳理和经验分享

    目录 1.什么是主机高可用 2.主机高可用主流解决方案 3.主机HA能做什么 4.主机HA高可用定义和切换流程 5.HA三种经典工作方式 6.主机HA的核心组件和实现原理 7.哪些场景不适合主机HA ...

  4. VMware vSphere 7 服务器ESXi虚拟化HA高可用解决方案

    一.    服务器虚拟化方案简介 服务器虚拟化是什么 将服务器物理资源抽象成逻辑资源,让一台物理服务器变成多台相互隔离的虚拟服务器.采用云计算数据中心解决方案后,可以让硬件资源利用率更好.能耗更低:从 ...

  5. HA 高可用之V1版

    HA(High Available), 高可用性群集,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点.通常把正在执行业务的称为活动节点,而作为活动节点的一个备份的 ...

  6. 【视频】详解HDFS的HA高可用原理

    详解HDFS的HA高可用原理

  7. HA高可用完全分布式集群 HDFS搭建

    HDFS HA 需要 设置静态IP.安装 jdk.设置ssh无密码登录.安装zookeeper.安装hadoop. 在Hadoop2.X之前,Namenode是HDFS集群中可能发生单点故障的节点,每 ...

  8. 红帽436——HA高可用集群之概念篇

    一.集群概念: 集群:提高性能,降低成本,提高可扩展性,增强可靠性,任务调度室集群中的核心技术. 集群作用:保证业务不断 集群三种网络:业务网络,集群网络,存储网络 二.集群三种类型: HA:高可用集 ...

  9. Storm集群开启HA高可用

    Storm开启HA高可用,包括Nimbus和UI开启两个及以上的进程. 基于已经安装好的Storm集群,开启关键节点角色的HA高可用. Storm安装请参考Storm集群安装Version1.0.1 ...

  10. MyCat双机HA高可用集群搭建_HAProxy安装和配置---MyCat分布式数据库集群架构工作笔记0028

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 前面我们说了mycat部署HA高可用的架构,这里我们来实现它 首先我们去装HAProxy 下载了H ...

最新文章

  1. 关于struts2的开始学习
  2. 查画图linux进程,分享|6 款面向 Linux 用户的开源绘图应用程序
  3. php鼠标经过显示文本,jQuery实现鼠标单击网页文字后在文本框显示的方法
  4. 实现一个简单的文件上传进度条
  5. Java笔试题之《流行的框架与新技术》
  6. 数据结构源码笔记(C语言):Josephus问题之顺序表
  7. 对称二叉树—leetcode101
  8. stm32f4xx 的EXTI使用的一般步骤
  9. [react] 说说你对声明式编程的理解?
  10. mysql 事务 select_mysql 多个select需要放入一个事务吗?
  11. Linux 学习步骤(从入门到精通)
  12. Protel 99 SE 的坑
  13. PHPWAMP_IN3新特性,一键内网穿透,一键生成app,一键IIS高承压
  14. 人工智能实验——八数码难题
  15. matlab sil,丰田使用高精度发动机模型和SIL+M前置开发发动机控制系统
  16. 微信公众号微信网页开发网页授权/回调自定义参数问题处理方法。
  17. [Python]一个简单的QQ截图
  18. Git提交项目到GitHub完整流程
  19. mysql数据库基础语句讲解
  20. 印象笔记Android怎样创建md,LocalNote,让你像使用本地文件一样使用印象笔记(支持 markdown 格式)...

热门文章

  1. java读取excel的maven_JAVA如何读取Excel数据
  2. 未能加载文件或程序集“log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”或它的某一个依赖项
  3. android qq登录测试用例,QQ登录测试用例
  4. 学术明星Michael Jordan解读:思维层与数据科学革命的关系
  5. 《宏景国际教育》嘿,同学,你的母校喊你回来考北美精算师!
  6. 大数据时代与工业4.0
  7. linux 基础 基础命令及解压
  8. 中国通信工业协会区块链专委会轮值主席于佳宁:区块链发展的“政策红利期”即将来临
  9. 3D点云形状分类简介
  10. 用户场景在产品设计中的作用