当前位置: 首页 > 科技观察

HA(HighAvailability)像洋娃娃,像胖子,一层一层剥去

时间:2023-03-14 19:26:38 科技观察

目前的HTTP协议,甚至WebSocket协议,甚至使用MQTT协议的WebSocket协议,都免不了要用到Nginx.所谓病从口入,祸从口出。作为一个入口,Nginx的职责是非常重要的。如果在某个时候它不起作用,那将是一场灾难。如何保证Nginx的高可用?这是个问题。不管你用什么样的plan,最后总是归为一个,很苦恼。所谓高可用无非就是两种方式。一种方式是在组件本身做文章,另一种方式是加一个中间层。我们通常希望能够在高可用的同时进行负载均衡。典型的猫狗两样都想要,而且非常贪婪。每当我们解决不了问题的时候,我们就会加一个中间层,然后把希望寄托在这个新生的组件上。如果这个中间层还不能解决问题,我们可以再加一个中间层。这样一层层往下,最后系统的高可用架构就会变得非常复杂。DNS保证高可用的第一种方式当然是在DNS上做文章。可以通过在DNS上绑定多个NginxIP地址来实现高可用。不仅可以实现高可用,还可以顺便实现负载均衡。但是这东西有一个致命的问题,那就是感知失败的时间。我们的浏览器在访问真实的Nginx之前,需要将域名转换为真实的IP地址。DNS负责解析这个动作,每次需要20-20ms。为了加快解析速度,一般会有多级缓存。例如,浏览器有DNS缓存;您使用的PC也有这样的缓存;IPS服务提供商也有缓存;更多的。只有当所有的缓存都没有命中时,DNS才会查询真实的IP地址。所以如果一个Nginxcrash了,这个故障的感知会特别差。总会有一些用户请求落在这台死机上。硬件保证了我们前面说的高可用。对于无法解决的问题,可以加一个中间层,即使这个中间层是硬件,比如F5。这种结构的企业是吃不起的。只有那些有返利和有利可图的采购的公司才会喜欢这样。网上很少用到,就不过多介绍了。当然F5也有单点问题。虽然硬件肯定比软件稳定一点,但始终是一个隐患。就像Oracle,再强大也有问题,那时候就需要一台备份机。有的厂家卖硬件的时候,建议你一次买3个!为什么?这是有原因的。您的一个硬件正在使用中,并且您有两台备用机器。当你服务的机器出现问题时,你可以选择其中一台备机作为master,另一台仍然是备机,集群仍然是高可用的。原因令人陶醉。按照这个逻辑,我要是遇到傻子,我能卖100台!主备模式不够硬,只好来软了。采用主备模式,通过软件完成切换过程。如图所示,使用keepalived组件和VRRP协议即可完成最简单的高可用配置。我们将DNS地址绑定到VIP。当服务的Nginx出现问题时,VIP就会漂移,转移到另一个Nginx上。可见备份的Nginx在正常情况下无法提供服务。它也被称为影子节点,只有在主Nginx出现问题时才有用。如果你有很多节点,这种模式会有很多浪费。除了浪费,还有一个非常大的问题。也就是不管单个Nginx有多强大,总有一个上限。当网卡流量达到峰值后,接下来应该怎么办呢?这种模式肯定不符合需求。简单组合模式这时候我们可以配合DNS解析,在主备模式上做文章。如下图,DNS解析为两个VIP,VIP本身也是高可用的。这样既可以缩短故障时间,又可以保证各个组件的高可用。这种架构模型思路很清晰,但是还是存在影子节点的浪费。LVS+KeepAlived+NginxLVS是LinuxVirtualServer的缩写,即Linux虚拟服务器。现在LVS已经是Linux标准内核的一部分。从Linux2.4内核开始,已经完全内置了LVS的各种功能模块,可以直接使用LVS提供的各种功能,无需对内核打任何补丁。LVS工作在OSI模型的第4层:传输层,如TCP/UDP,所以无法识别7层网络的HTTP协议。也就是说,我们不能利用HTTP协议的某些内容来控制路由,它的路由切入级别较低。如下图所示,由LVS搭建的服务器集群系统由三部分组成:前端负载均衡层,LoadBalancer用于表示中间的服务器集群层,ServerArray用于表示底层数据共享存储层,采用SharedStorage表示DR(directlyRouting)模式,可以将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。是目前使用最广泛的方式(资料不详,fullnat模式也被广泛使用)。因此,通过DNS负载均衡和LVS负载均衡,可以实现二层负载均衡和高可用。如图所示,DNS可以将请求绑定到VIP上。因为LVSDR模式的效率非常高,网卡需要非常大量的请求才会达到瓶颈(只有ingress流量才能走LVS),所以一般通过LVS做nginx负载均衡就可以了。如果LVS还有瓶颈,那就可以在DNS上做文章了。有哪些挑战?事实上,我们上面提到的大部分解决方案都在同一个机房??。如果有多个机房,如何让用户选择最快的节点,如何保证负载均衡,又是一个大问题。另外可以看到数据包是层层转发协调的,涉及到各种负载均衡算法。如何维持会话也是一个挑战。一般四层会话会通过IP地址来实现,七层会话会通过cookie或header信息来实现。开发者一般接触不到这种入门级的东西,但一旦遇到,可能会手忙脚乱。本文由xjjdog根据已有的一些经验整理而成。希望在贵公司需要一些高可用的解决方案时,能对您有所帮助。什么是计划?你只需要哄你的领导,让他觉得他同意就可以了。至于做不做,怎么做,那是后话。君不见,说了半天,很多公司其实一个nginx就能跑遍天下。作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。我的个人微信xjjdog0,欢迎加好友进一步交流。