`
huorongbj
  • 浏览: 19512 次
文章分类
社区版块
存档分类
最新评论

做了「负载均衡」就可以随便加机器了吗?这三招来帮你!

阅读更多

本文长度为3056字,预计读完需1.1MB流量,建议阅读8分钟。

 

阅读目录

 

        这篇是《分布式关注点系列》中「负载均衡」相关的内容最后一发了,后续也会继续讲「高可用」相关的其它主题,主要是限流、降级、熔断之类的吧,具体还没定。文末先附上之前发过的高可用相关文章,供你再温故一下。

 

        下面这个场景不知是否在你面前出现过。

 

开发Z哥对运维Y弟喊:“Y弟,现在系统好卡,刚上了一波活动,赶紧帮我加几台机器上去顶一下。”

 

Y弟回复说:“没问题,分分钟搞定”。

 

然后就发现数据库的压力迅速上升,DBA就吼了:“Z哥,你丫的搞什么呢?数据库要被你弄垮了”。

 

然后客服那边接框也爆炸了,越来越多的用户说刚登陆后没多久,操作着就退出了,接着登陆,又退出了,到底还做不做生意了。

 

        这些问题背后都是由于一个「Session丢失」问题导致的。

 

 

一、什么是Session丢失

 

        相信Session对大部分Coder来说应该都知道。它是为了将同一个用户的多次访问在系统中被识别为“同一个用户”而产生的概念。除此之外,还可以基于它来减少重复往DB或者远程服务处获取与该用户相关的信息,以起到提升性能的作用。

 

        在我们做了负载均衡的场景中,如果选择的负载策略是hash策略,那么会使得Session产生一个副作用,这个副作用就如上面举的案例那样,用户一旦由于某种原因从原先访问服务器A变成访问服务器B,就会出现“登陆状态丢失”、“缓存穿透”等问题

 

        为什么hash策略会出现这个问题呢?首先有必要先了解一下hash是如何进行的。hash策略就是下图这样的一个散列函数。在函数不变的情况下,A永远对应01,B对应04,C对应08。

 

▲图片来源于网络,版权归原作者所有

 

        以nginx中的ip_hash策略来举个例子。因为我们认为正常情况下用户的ip不会在短时间内发生变化,所以当我们选择使用ip_hash策略进行负载均衡时,意味着期望同一个用户能够一直访问到同一台服务器上,就像下图这样。

 

▲图中的hash函数是最简单的随意举例

 

        如此一来,我们只需要在这一台服务器上将这个用户相关的信息缓存在进程内,就能起到非常高性价比的提升性能的效果。

 

        这时,客户端与服务端之间的相当于建立了一个信任,相互认识。这个信任就是「Session」。

 

        但是,当我们加了一台服务器之后,事情就发生变化了。

 

▲图中的hash函数是最简单的随意举例

 

        这个时候我们原先的预期就被破坏了。因为用户与序号0节点的链接变成了与序号3的链接,所以产生了前面提到的「Session丢失」问题。与此同时,在序号0节点上做的进程内缓存都无效了,而在序号3节点上又没有用户相关的任何缓存,导致大量数据需要从下游的DB或者远程服务处获取。你要知道,一旦涉及到网络通信,性能必然明显下降,I/O、序列化都是耗时的工作。更重要的是,一旦同时有大量用户产生这个情况,由于后端的DB和远程服务瞬时无法承载激增的高密度请求,可能会导致它挂起。这还没完,如果当前程序没有一些故障隔离或者降级策略,还会进一步产生蝴蝶效应,导致整个大系统响应缓慢。可谓“一颗老鼠屎坏了一锅粥”。

 

 

二、nginx是如何来解决这个问题的

        既然以nginx举例,还是从nginx开始聊。通过在nginx中引入nginx-sticky-module模块可以来解决这个问题。解决的整个过程如下。

 

▲图片来源于网络,版本归原作者所有

 

        可以看到,当client第一次进入到nginx匹配节点的时候,在给它分配一个节点的同时,会将这个节点的唯一标识进行md5后写入到cookie中一并返回,如果下次再发起请求的时候发现带有这个cookie值,就直接转发到该值所对应的节点上去。这个机制被专业的称之为「Session保持」。

 

        虽然可以利用cookie来解决这个问题,但是cookie也有一个潜在的问题,如果客户端未开启cookie功能,这个机制就失效了。不过好在目前主流浏览器都是默认打开cookie的。

 

题外话:nginx是2004年发布的,在nginx-sticky-module出现之前的7年间也是nginx相比竞品HAProxy最大的一个短板,因为HAProxy支持Session保持。

 

 

三、Session保持的其它方案

        除了cookie之外,还有2种方式也可以最终达到类似的效果。分别被称为「Session复制」、「Session共享」。

 

01  Session复制

        这是最简单粗暴的方式。根据第一节的案例来看,导致问题的原因是节点3没有用户的Session。那么很容易想到,在节点3运行之前把Session相关的Cache数据复制过去呗。并且在多个节点之间持续保证数据的同步,也就是说,每一台节点上都存在每个用户的Session数据。

 

 

        实现的方案有很多,特别是不同的宿主程序都或多或少提供了一些切入点,甚至是拿来即用的方案,如Tomcat的Delta Manager和Backup Manager、Tomcat和IIS的Filter机制等等,这里就不展开了。

 

        此类方案的特点是

  • 优点:天然高可用,一部分节点宕机没事。因为每一个节点上存放着所有已连接用户的会话信息。

  • 缺点:因为每台计算机的内存是有上限的,仅适用于会话相关的数据大小较小的场景。并且,由于多个节点之间需要同步数据,需要额外解决数据一致性问题。与此同时,随着节点越多,损耗越大(延迟、带宽等),有广播风暴风险。

 

02  Session共享

        我们还可以通过将session信息存放到全局共享的存储介质中来达到一样的效果,如数据库、远程缓存等,这是一种中心化思想的解决方案。

 

        此类方案的特点是

  • 优点:不管节点怎么增加和减少,100%不会产生会话丢失。

  • 缺点:每次读写请求都需要增加额外共享储存调用,增加了网络I/O、序列化等操作,性能明显下降。另外,用作共享的存储介质除了增加了额外的维护成本外,还需要解决单点问题,以免产生系统性风险。

 

        同之前「Session保持」方案一起对比下各自的优缺点和适用场景。

 

        分别用一句话概括一下这3个方案:

  • Session 保持。原来在哪还是去哪。

  • Session 复制。不管在哪都有一样的数据。

  • Session 共享。所有节点共用一份数据。

 

 

        越大型的系统,最终都会往「Session共享」这个方案上走,因为只要再对这个共享存储做横向扩展,理论上就可以支撑无穷大的用户了。如Redis、一系列的NOSQL以及NEWSQL等。就像下面这样,集「规模大」、「高可用」、「效果好」于一身。

 

 

 

四、结语

        现在你应该清楚了Session丢失问题,也知道了如何去应对他。但是,我们还需要明白一个事实:严格来说「Session保持」本质上是破坏了做「负载均衡」的初衷。举个极端点的场景:一共有10个会话连在了节点A上,并且都是活动中状态。那么这个时候哪怕增加一个节点B上线,只要没有新的会话进来,节点B上的活动连接数永远是0,并没有起到分担压力的作用。

        但是,在系统的起步时期,其实用这样简单的方案也是极好的。

 

 

 

相关文章:

 

 

作者:Zachary(个人微信号:Zachary-ZF
微信公众号(首发):跨界架构师。<-- 点击查阅近期热门文章
定期发表原创内容:架构设计丨分布式系统丨产品丨运营丨一些深度思考
扫码加入小圈子 ↓

 

 

0
0
分享到:
评论

相关推荐

    ???????!!.zip_parallel processing_zip

    5. **负载均衡**:在并行处理中,负载均衡是确保各计算节点工作负载均匀分配的关键,以避免某些节点过载而其他节点空闲,从而提高整体效率。 6. **并行算法设计**:设计并行算法需要考虑数据划分、通信开销和同步...

    一台三层交换机做双链路负载均衡(20210906110707).pdf

    关于一台三层交换机做双链路负载均衡的解决方案 在讨论中,提出了使用一台三层交换机来实现双链路负载均衡的问题。该问题的主要目的是为了解决局域网内两个网段的用户可以同时通过两条Internet线路上网,并且在一条...

    天融信负载均衡配置手册

    负载均衡可以分为三种类型:应用负载均衡、链路负载均衡和全局负载均衡。 3.1 应用负载均衡 应用负载均衡是指将流量分布到多个应用服务器上,以提高应用系统的可用性和性能。应用负载均衡可以根据不同的应用场景...

    LVS+Keepalived高可用负载均衡集群

    随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司...我们利用LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。

    一台三层交换机做双链路负载均衡.pdf

    在这份文件中,关于如何使用一台三层交换机实现双链路负载均衡的内容,主要涉及到以下几个关键技术点: 1. **VLAN(Virtual Local Area Network,虚拟局域网)** VLAN是一种将一个物理网络分割成多个逻辑子网的...

    c#源码 Socket 负载均衡 实例

    总的来说,C#源码Socket负载均衡实例是一个有价值的教育资源,可以帮助开发者掌握网络编程和负载均衡的关键技术,提高其在实际项目中的应用能力。通过深入研究和实践,你可以更好地理解和运用这些技术,提升自己的IT...

    Nginx实现负载均衡 web均衡负载 webservice负载均衡 Nginx实现负载均衡配制全说明

    Nginx实现负载均衡 web均衡负载 webservice负载均衡 Nginx实现负载均衡配制全说明 为了多台后台的web、webservice服务能均衡负载,可以使用nginx进行处理 1)配置文件全配制ok 2)有两个完整的web服务做例子,可以...

    基于机器学习的自动负载均衡方法研究及应用.pdf

    本文的研究结果表明,基于机器学习的自动负载均衡方法可以有效地解决LTE网络中的负载均衡问题,提高系统的资源利用率和网络性能,为更多的用户提供具备QoS保障的服务。 在本文中,我们还讨论了基于机器学习的自动...

    1. Camstar负载均衡配置.docx

    在IT行业中,负载均衡是一种关键的技术,用于优化资源利用、提高服务可用性和响应时间,同时也能增强系统的容错能力。本文件"1. Camstar负载均衡配置.docx"显然是关于如何在Camstar系统中实现多服务器与同数据库的...

    a10负载均衡器简明运维操作手册.doc

    A10 负载均衡器运维操作手册 A10 负载均衡器是一种高性能的服务器负载均衡器,旨在提供高可用性和高性能的网络服务。为了确保 A10 负载均衡器的顺利运营,需要了解其基本硬件信息、登录方式、系统配置和维护等方面...

    oracle WEB服务负载均衡

    这一过程通常由专门的负载均衡器来完成,它可以是硬件设备也可以是软件程序。通过合理分配任务,不仅可以避免单一服务器过载,还能显著提高整体的服务质量和服务水平。 #### 三、MateSLB的功能特点 **1. 负载分担...

    nginx负载均衡实现

    当单台服务器难以应对高流量和并发请求时,负载均衡就显得尤为重要。通过将请求合理分配到多台服务器上处理,不仅能够提升整体系统的处理能力和稳定性,还能有效避免单点故障。 #### 二、负载均衡基本原理 负载...

    服务器负载均衡技术

    服务器负载均衡技术是一种网络优化策略,旨在通过将网络流量分散到多台服务器上,提高系统的稳定性和可用性,同时增强处理大规模并发请求的能力。负载均衡技术的核心思想是将客户端的请求均匀分配到服务器集群,避免...

    深信服负载均衡AD5.3用户手册

    ### 深信服负载均衡AD5.3用户手册知识点概览 #### 一、负载均衡基础概念 **1.1 负载均衡简介** 负载均衡(Load Balancing, LB)是一种网络技术,用于在多台服务器之间分配流量,以优化资源利用、最大化吞吐量、...

    nginx+redis负载均衡、session共享

    在构建高性能、高可用的Web服务时,"nginx+redis负载均衡、session共享"是一个常见的解决方案。这个方案结合了Nginx的反向代理和负载均衡能力,以及Redis的内存数据存储和分布式特性,用于处理高并发场景下的HTTP...

    nginx负载均衡加FastDfs

    【标题】:“nginx负载均衡加FastDfs” 在IT领域,服务器负载均衡是提升系统可用性和性能的关键技术,而Nginx与FastDFS的结合应用则是一个常见的解决方案。Nginx是一款高性能的HTTP和反向代理服务器,常用于实现...

    SAP 应用服务负载均衡的实现

    - **监控工具**: 可以使用AL08事务代码查看服务器登录情况,使用SMLG事务代码按F5键来查看各服务器的响应时间,以此判断是否需要调整负载均衡策略。 - **常见问题**: - **问题1**: 在客户端配置时,如果系统标识中...

    apache 负载均衡集群

    Apache 负载均衡集群是一种优化Web服务器性能和可靠性的技术。通过将工作负载分散到多个服务器上,这种集群能够确保即使单个服务器出现故障,系统仍能继续提供服务,从而提高了服务的可用性和响应速度。Apache 负载...

Global site tag (gtag.js) - Google Analytics