一、「负载均衡」是什么

正如题图所示的这样,由一个独立的统一入口来收敛流量,再做二次分发的过程就是「负载均衡」,它的本质和「分布式系统」一样,是「分治」。

如果大家习惯了开车的时候用一些导航软件,我们会发现,导航软件的推荐路线方案会有一个数量的上限,比如3条、5条。因此,其实本质上它也起到了一个类似「负载均衡」的作用,因为如果只能取Top3的通畅路线,自然拥堵严重的路线就无法推荐给你了,使得车流的压力被分摊到了相对空闲的路线上。

在软件系统中也是一样的道理,为了避免流量分摊不均,造成局部节点负载过大(如CPU吃紧等),所以引入一个独立的统一入口来做类似上面的“导航”的工作。但是,软件系统中的「负载均衡」与导航的不同在于,导航是一个柔性策略,最终还是需要使用者做选择,而前者则不同。

怎么均衡的背后是策略在起作用,而策略的背后是由某些算法或者说逻辑来组成的。比如,导航中的算法属于「路径规划」范畴,在这个范畴内又细分为「静态路径规划」和「动态路径规划」,并且,在不同的分支下还有各种具体计算的算法实现,如Dijikstra、A*等。同样的,在软件系统中的负载均衡,也有很多算法或者说逻辑在支撑着这些策略,巧的是也有静态和动态之分。

二、常用「负载均衡」策略图解

下面来罗列一下日常工作中最常见的5种策略。

1、轮询

这是最常用也最简单策略,平均分配,人人都有、一人一次。大致的代码如下。

2、加权轮询

在轮询的基础上,增加了一个权重的概念。权重是一个泛化后的概念,可以用任意方式来体现,本质上是一个能者多劳思想。比如,可以根据宿主的性能差异配置不同的权重。大致的代码如下:

这段代码的过程如下图的表格。"()"中的数字就是自增数,代码中的cur_weight。

值得注意的是,加权轮询本身还有不同的实现方式,虽说最终的比例都是2:1:2。但是在请求送达的先后顺序上可以所有不同。比如「5-4,3,2-1」和上面的案例相比,最终比例是一样的,但是效果不同。「5-4,3,2-1」更容易产生并发问题,导致服务端拥塞,且这个问题随着权重数字越大越严重。例子:10:5:3的结果是「18-17-16-15-14-13-12-11-10-9,8-7-6-5-4,3-2-1」

在此我向大家推荐一个Java学习交流群。交流学习群号:874811168 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,一起学习,一起进步,目前受益良多。

3、最少连接数

这是一种根据实时的负载情况,进行动态负载均衡的方式。维护好活动中的连接数量,然后取最小的返回即可。大致的代码如下。

4、最快响应

这也是一种动态负载均衡策略,它的本质是根据每个节点对过去一段时间内的响应情况来分配,响应越快分配的越多。具体的运作方式也有很多,上图的这种可以理解为,将最近一段时间的请求耗时的平均值记录下来,结合前面的「加权轮询」来处理,所以等价于2:1:3的加权轮询。

题外话:一般来说,同机房下的延迟基本没什么差异,响应时间的差异主要在服务的处理能力上。如果在跨地域(例:浙江->上海,还是浙江->北京)的一些请求处理中运用,大多数情况会使用定时「ping」的方式来获取延迟情况,因为是OSI的L3转发,数据更干净,准确性更高。

5、Hash法

hash法的负载均衡与之前的几种不同在于,它的结果是由客户端决定的。通过客户端带来的某个标识经过一个标准化的散列函数进行打散分摊。

上图中的散列函数运用的是最简单粗暴的「取余法」。

题外话:散列函数除了取余之外,还有诸如「变基」、「折叠」、「平方取中法」等等,此处不做展开,有兴趣的小伙伴可自行查阅资料。

另外,被求余的参数其实可以是任意的,只要最终转化成一个整数参与运算即可。最常用的应该是用来源ip地址作为参数,这样可以确保相同的客户端请求尽可能落在同一台服务器上。

三、常用「负载均衡」策略优缺点和适用场景

我们知道,没有完美的事物,负载均衡策略也是一样。上面列举的这些最常用的策略也有各自的优缺点和适用场景,我稍作了整理,如下。

这些负载均衡算法之所以常用也是因为简单,想要更优的效果,必然就需要更高的复杂度。比如,可以将简单的策略组合使用、或者通过更多维度的数据采样来综合评估、甚至是基于进行数据挖掘后的预测算法来做。

四、用「健康探测」来保障高可用

不管是什么样的策略,难免会遇到机器故障或者程序故障的情况。所以要确保负载均衡能更好的起到效果,还需要结合一些「健康探测」机制。定时的去探测服务端是不是还能连上,响应是不是超出预期的慢。如果节点属于“不可用”的状态的话,需要将这个节点临时从待选取列表中移除,以提高可用性。一般常用的「健康探测」方式有3种。

1、HTTP探测

使用Get/Post的方式请求服务端的某个固定的URL,判断返回的内容是否符合预期。一般使用Http状态码、response中的内容来判断。

2、TCP探测

基于Tcp的三次握手机制来探测指定的IP + 端口。最佳实践可以借鉴阿里云的SLB机制,如下图。

值得注意的是,为了尽早释放连接,在三次握手结束后立马跟上RST来中断TCP连接。

3、UDP探测

可能有部分应用使用的UDP协议。在此协议下可以通过报文来进行探测指定的IP + 端口。最佳实践同样可以借鉴阿里云的SLB机制,如下图。

结果的判定方式是:在服务端没有返回任何信息的情况下,默认正常状态。否则会返回一个ICMP的报错信息。

五、结语

用一句话来概括负载均衡的本质是:

将请求或者说流量,以期望的规则分摊到多个操作单元上进行执行。

通过它可以实现横向扩展(scale out),将冗余的作用发挥为「高可用」。另外,还可以物尽其用,提升资源使用率。

想要你的HTTP稳定不蹦,必须吃透「负载均衡」相关推荐

  1. mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离

    数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了 ...

  2. 分布式系统关注点(9)——想通关「限流」?只要这一篇

    如果这是第二次看到我的文章,欢迎右侧扫码订阅我哟~  ? 本文长度为2869字,建议阅读8分钟. 可能你在网上看过不少「限流」相关的文章,但是z哥的这篇可能是最全面,最深入浅出的一篇了(容我飘几秒-) ...

  3. 想通关「限流」?只要这一篇

    来源:跨界架构师 之前有了解到z哥的一部分读者们没有充分搞清楚「限流」和「熔断」的关系.我们先来思考一个问题,生活中也有限流,为什么国庆春节长假热门景点要限流?而不是一早先开几小时,如果人多了就关几小 ...

  4. 看到「财富自由」就想吐

    这些年,网上关于财富自由的人生故事,可以说是数不胜数. 不过,其中 70% 像是真假参半的凡尔赛炫耀帖,剩下的那 30% 则更像是兜售某些产品的广告. 比如前几天很火的腾讯 35 岁员工准备退休的帖子 ...

  5. Navidrome - 开源音乐服务器【打造属于自己的音乐播放器】「端口映射」随时随地想听就听

    转载自cpolar极点云文章:Navidrome - 开源音乐服务器[打造属于自己的音乐播放器]「端口映射」随时随地想听就听 1. 前言 不知从何时开始,我们能用的音乐软件越来越少,笔者使用小米手机很 ...

  6. 将AI落地到福州、贵阳的「幕后推手」,到底在想些什么?

    2020-07-10 15:48:51 乾明 金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 从抗击新冠肺炎的冲锋陷阵,到日常生活中的效率提升- 依图科技,正在用一次次行动,一座座城市,展 ...

  7. 想实现高可用?先搞定负载均衡原理

    在互联网大行其道的今天,随着业务的迅猛增长,技术上我们常常要面对高并发,大流量. 图片来自 Pexels 为了实现高可用,高性能我们采用了很多的技术手段,负载均衡就是其中之一.作为外部流量与内部应用的 ...

  8. 想要玩转实现负载均衡,你知道这些吗?

    转载自  想要玩转实现负载均衡,你知道这些吗? 一.前言 互联网早期,业务流量比较小并且业务逻辑比较简单,单台服务器便可以满足基本的需求:但随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂, ...

  9. vscode 逗号不换行_来自一个插件的疯狂夸赞,VS Code「彩虹屁」插件问世,网友:我想要郭德纲版...

    听说有人开发了「虚拟程序员鼓励师」,安装使用后的我疯狂捶墙,导致我家变成了单间. 机器之心报道,机器之心编辑部. 你可能从未想过,会有这么一个人: 对你写的每一行代码都不吝夸赞,知道你什么时候想骂人, ...

最新文章

  1. 主键需要键索引吗_MySQL 索引的知识点都在这里了,建议收藏!
  2. 苹果小圆点怎么关闭_苹果手机连按2下屏幕,就能自动截图,不知道的来学一学...
  3. SAP HUM 带HU的TO单对应的外向交货单VL09取消PGI之后不能对该交货单执行LT0G做WM层面的返架?
  4. 国防科大计算机考研大纲,2022年国防科技大学F1003计算机操作系统考研大纲及参考书目...
  5. 手机应用软件下载导航php源码_第八篇:你需要一个没有广告的导航吗,我免费给你源码...
  6. js(jQuery)获取时间的方法及常用时间类
  7. Java 8中的功能接口是什么? @功能注释和示例
  8. android webView注入js方法
  9. 直连串口线、交叉串口线
  10. Tomcat4/5连接池的设置及简单应用示例
  11. NodeJS知识汇总
  12. 【注意力机制】SENet(Squeeze-and-Excitation Networks)详解
  13. python输入变量输出常量_Python输入input、输出print
  14. Win7系统解决JAVA或者APKtool不是内部或者外部命令
  15. 又一小米固件下载网站:xiaomifirmwareupdate
  16. JAVA 方法知识总结
  17. 菲仕乐高压锅型号全面详解
  18. mysql r_mysql:’r’是什么意思?
  19. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
  20. 在MacOS上构建以太坊开发环境

热门文章

  1. sigmoid函数的求导过程
  2. 数据有什么特征和作用
  3. python 计算协方差_Python3Numpy——相关性协方差应用
  4. 布丰投针试验的仿真和误差估计
  5. AcWing 788. 逆序对的数量
  6. android刷新时的圆形动画_Android自定义view渐变圆形动画
  7. 航拍+AI︱极简的视频风格迁移体验
  8. [Hive]看懂Hive的执行计划
  9. JDK动态代理运行期生成的字节码文件class,获取反编译方法
  10. 【转】javascript判断浏览器是不是IE