常用负载均衡策略分析

背景

一般生产环境单机所能承受的QPS压力为2w左右,过大的压力会导致服务器爆炸。即便是单机能够撑住2w QPS,一般也不会这么做,生产环境一般会预留50%的冗余能力,防止QPS因为某个热门的活动而爆炸。当QPS超过单机所能承受的压力时,自然而然会想到引入分布式集群。那么,某一个请求会被哪台服务器处理呢,这是随机的,还是说按照一定的规则处理的?这就是负载均衡算法所要干的事。

负载均衡器

负载均衡器就是实现一种或者多种负载均衡算法的软件或者硬件设备。负载均衡器根据协议层的不同,通常又分为两种,第一种在四层传输层实现,第二种就是在七层应用层实现。


很多专用的硬件负载均衡器都支持在TCP层实现负载均衡,效率高。当然TCP层实现负载均衡有它的缺点,如无法保存长连接等。所以一般类似于BAT这种大公司,都是多层负载均衡配合的。


一般纯软件实现的通常在应用层来实现,这也是应用比较多的一种实现方式。目前比较流行的实现有Nginx、HAProxy、Keepalived等。当然Linux内核自带的LVS(Linux Virtual Server)就是四层的实现。

轮询(Round Robin)

轮询是一种很简单的实现,依次将请求分配给后端服务器。

  • 优点:实现简单,请求均匀分配。
  • 缺点:请求均匀分配,因为后端服务器通常性能会有差异,所以希望性能好的服务器能够多承担一部分。也不适合对长连接和命中率有要求的场景。

加权轮询(Weighted Round Robin)

加权本质是一种带优先级的方式,加权轮询就是一种改进的轮询算法,轮询算法是权值相同的加权轮询。需要给后端每个服务器设置不同的权值,决定分配的请求数比例。这个算法应用就相当广泛了,对于无状态的负载场景,非常适合。

  • 优点:解决了服务器性能不一的情况
  • 缺点:权值需要静态配置,无法自动调节。也不适合对长连接和命中率有要求的场景。

随机Random

随机把请求分配给后端服务器。请求分配的均匀程度依赖于随机算法了,因为实现简单,常常用于配合处理一些极端的情况,如出现热点请求,这个时候就可以random到任意一台后端,以分散热点。当然缺点也不言而喻。

哈希Hash

哈希算法想必大家并不陌生,应用最为广泛。根据Source IP、 Destination IP、URL、或者其它,算hash值或者md5,再采用取模。比如有N台服务器: S1、S2、S3……Sn

hash值 % N 

哈希
显然,相同的请求会被映射到相同的后端。这非常适合维护长连接和提高命中率。
但是它天生也有一些缺点。比如说,现在某个请求通过哈希被映射到S3上去了,如果S3宕机了,就不得不二次Hash,重新计算路由时会剔除宕机的后端。

hash值 % (N - 1)

这样会导致几乎所有请求路由产生变化。由此导致命中率的急剧下降。当然一般生产环境通过提供S3的备机来解决这种问题,但是主备之间切换也是需要时间,它们之间的数据同步也是有延时的。所以需要根据业务场景来权衡了。
扩容也会有类似的问题,计算路由公式变为:

hash值 % (N + 1) 

为了解决这种问题,一般生产环境可能采用成倍扩容的方式。N -> 2N,这样求路由可以做到与原来保持一致。当然必不可少的造成机器资源的浪费。请各位看官自行权衡。
对于热点请求,这种Hash算法也可能成在雪崩效应,取决于采用何种Hash,基于URL还是基于IP等。总之,不能把热点请求路由到单机上,否则单机撑不住,会逐个逐个被打爆,也就是雪崩效应。

最小连接数LC

最小连接数(Least Connection),把请求分配给活动连接数最小的后端服务器。它通过活动来估计服务器的负载。比较智能,但需要维护后端服务器的连接列表。

加权最小连接数WLC

加权最小连接数(Weighted Least Connection),在后端服务器性能差异较大的情况下,可以优化LC的性能,高权值的服务可以承受更多的连接负载。

最短响应时间LRT

最短响应时间(Least Response Time),把请求分配给平均响应时间最短的后端服务器。平均响应时间可以通过ping探测请求或者正常请求响应时间获取。
RT(Response Time)是衡量服务器负载的一个非常重要的指标。对于响应很慢的服务器,说明其负载一般很高了,应该降低它的QPS。

之前有人说使用CPU占用率作为负载均衡的指标,只能说没理解CPU占用率的实质。理论上CPU占用率是越高越好,说明服务充分利用了CPU资源。但对于设计不合理的程序导致的CPU占用过高这是程序的设计问题,并不违背这条理论。

 

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

 

参考文献

  • 深入一致性哈希(Consistent Hashing)算法原理,并附100行代码实现

 

转载于:https://www.cnblogs.com/kaleidoscope/p/9754489.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决- SecureCRT上运行 linux vim 命令中文出现乱码

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 乱码如图: 这个问题是CRT的编码设置造成的,改一下设置就可以了: 1. 在当前连接上右键选择最后一个 2…

linux中操作数据库的使用命令记录

1,mysql 查看数据库表编码格式: show create table widget; 修改数据库表编码格式: alter table widget default character set utf8; 修改数据库表中某字段的编码格式: alter table widget change widget_name widget_name varc…

ICC Scenario Definition

现代先进工艺下的后端设计都是在 MCMM 情况下设计的,所谓 MCMM 就是 muti-corner muti-mode,用于芯片的不同工作模式和工作条件。 后端设计过程中,需要保证芯片在所有工作模式和工作条件下都能正常工作,工作模式一般只有几种&…

持续集成与持续部署宝典Part 2:创建持续集成流水线

2019独角兽企业重金招聘Python工程师标准>>> 在本系列文章中,我们将探讨在容器时代如何在基于Docker的环境中创建连贯的工作流程和流水线来简化大规模项目的部署。另外,我们还将详细介绍如何利用Docker和Rancher自动化处理这些工作流。 在上文…

64 装饰器函数: 母版 csrf防御机制 cookie

主要内容: 1: 装饰器函数 a: 原理: 在不改变原函数的代码和调用方式的情况下, 给函数动态的添加功能 b: 实例: 装饰器的原理: def yue(tools):print(使用%s约一约 % tools) def wrapper(fn):def inner(*args, **kwargs):print(先准备好钱)fn(*args, **kwargs)return inner yue …

Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三…

一个判断session是否过期的小技巧

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 Session一直是我们做web项目经常使用的,以前没太注意,这次又细致的看了下! 1.session其实就是一个Ma…

jQuery基础-事件

只能添加一个处理函数,后面的会覆盖前面 会有兼容性差异 冒泡 会依次检查父元素 截获冒泡 或者 最大的缺陷 并且在IE和NetSpace里面分别为冒泡和捕获两种 多个处理函数 依次执行 捕获--->自己--->冒泡 true 只捕获,不冒泡 false 只冒泡 从父元素的…

别的AI还在打游戏,这个AI已经当上“超级马里奥”游戏策划了|GECCO最佳论文

AI打游戏已经不是什么新鲜事了,“沉迷”Dota 2、星际争霸、LOL的AI一个接一个的出现。 但是你也许不知道,相比这些“游戏玩家”AI,还有一位优秀的AI,直接当起了“游戏策划”,做的还是脍炙人口的“超级马里奥”。 &…

单点登录的三种实现方式

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,…

java对象占用内存大小?

一个不包含任何内部成员变量的空Object大约占33byte,若增加成员变量,则增加相应大小的内存占用。 测算方式:设置jvm的堆大小为1m,在堆中不停new不含任何成员变量的OOMObject对象,直到堆内存溢出。如下图,在…

Java程序员面试中的多线程问题

很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。 0.Java 中多线程同步是什…

单点登录原理与简单实现

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏…

java接口类支持多继承

一个类只能extends一个父类,只能有一个父类,但可以implements多个接口。java通过使用接口的概念来取代C中多继承。与此同时,一个接口则可以同时extends多个接口,却不能implements任何接口。Java中的接口是支持多继承的。

xmind-HTTP协议

转载于:https://www.cnblogs.com/margot921/p/9764788.html

弹性布局

弹性布局 一、Flex布局是什么? Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为Flex布局。 二、基本概念 采用Flex布局的元素,称为Flex容器(flex container&…

解决dataTable 报错:cannot read property “style“ of undefined

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 其实这错,我之前也遇到过,只是太久了,没有记录下来, 今天看到群里朋友也遇到这个错误&a…

万恶之源 - Python基础数据类型一

整数 整数在Python中的关键字用int来表示; 整型在计算机中运于计算和比较 在32位机器上int的范围是: -2**31~2**31-1,即-2147483648~2147483647 在64位机器上int的范围是: -2**63~2**63-1,即-9223372036854775808&…

jackson/fastJson boolean类型问题

1.我们以Person对象举个栗子,person有三个属性。name,age和isGay Data public class Person {public Person(String name, int age, boolean isGay) {this.name name;this.age age;this.isGay isGay;}private String name;private Integer age;priva…

狗窝里的小日子 ...

来,把平时作的菜菜整理下下: 1. 2. 3. 4. 5. 6. 7. 8.