负载均衡load balancing和算法分类概要介绍
一、负载均衡介绍
1.1 什么是负载均衡
负载均衡(load balancing)
它是计算机的一种技术,用来在计算机集群、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。-来自 wikipedia
负载均衡主要作用是将多个连接或作业合理的分配到多个操作单元上执行,用于解决互联网中高可用和高并发问题。
在互联网应用程序服务中,负载均衡就是一种合理分配网络流量到你后端执行程序的一种方法。
后端有多个相同程序提供服务,负载均衡器就可以把多个客户端请求合理分配给后端服务器(应用程序在服务器里)。
负载均衡器就像餐厅的前台接待员,客人来了后,接待员就把客人引导到合适的台桌和座位上,后续的服务员在为客户提供服务。
1.2 负载均衡作用
扩展性
你可以使用负载均衡器在多个服务器之间均衡的调度访问流量。
你还可以添加或删除你的后端服务器,只需要把这台服务器的信息告诉负载均衡器。你可以放心扩展你的服务器。
可以同时应对访问的流量高峰或流量低谷。
高可用性
第一:负载均衡器后面有多台服务器,如果其中一台服务器故障了,还有其它服务器可以提供后端服务。
第二:当你的应用程序升级或服务器需要维护时,不需要停机,因为前面有负载均衡器,可以帮你摘除没有提供服务的服务器。
第三:负载均衡器还可以帮你检查后端服务健康情况,服务不可用时,可以摘除这个服务,等到服务可用后,又可以添加这个服务。
性能
负载均衡器可以提高后端服务程序性能。
它可以把访问负载按照一定方式分配到后端不同服务器,以此来提高服务程序性能。
这个不同的方式指的是按照什么算法什么策略。
它也可以定位到较近的服务器以减少网络延迟。
二、负载均衡算法
最常用的 Web 服务器 Nginx,我们经常拿它作为 web 服务器的负载均衡器使用。
负载均衡有哪些算法呢?下面介绍,
2.1 轮询算法RoundRobin
轮询算法就是按照循环的方式来访问后端服务器。
比如上面有 3 台后端服务器,这种算法就是按照服务器1,服务器2,服务器3 依次轮询一台服务器提供服务。
2.2 加权轮询算法
因为每台服务器可能性能不同、网络带宽不同,那性能好的服务器就可以多提供些访问服务,性能差的就少提供。
那怎么做?可以加一个权重指标,来标识服务器访问性能好坏。权重较高,表示服务器性能好,就多接收一些访问流量。权重低的就少接收访问流量。
比如在 Nginx 里,weight 就表示权重,weight 值越大表示权重越高,那么后端服务器就可以多接收访问流量。
平均加权轮询算法:
每个服务器对应 2 个权重,为 weight 和 currentWeight,weight 是固定,而 currentWeight 动态调整,初始值为 0。
2.3 随机选择算法Random
随机选择算法就是随机性的选择一台后端服务器提供服务。
比如有 3 台服务器 1、2、3,每一次选择有可能是 1,也可能是 2,也可能是 3,每次选择都是随机的。
随机数也可以加个权重。
2.4 最少连接数
最少连接数算法,就是负载均衡器将检查后端哪些服务器的活跃连接数最少,就将访问流量发送给这些服务器。
这个活跃连接数一般就是指 TCP 连接数。
2.5 哈希算法hash
哈希算法一般有:ip 哈希,url 哈希,hash算法,一致性hash算法等算法。
2.6 最短响应时间
最短响应时间就是将服务器的响应时间和活跃连接数结合起来,用来确定一个最佳的服务器。
2.7 Power of Two Choices
Nginx 在 1.15.1 中增加了这种新的负载均衡算法 Power of Two Choices。
简单理解就是随机从所有可用节点中选择两个节点,然后计算这2个节点负载情况,计算出一个负载较低的服务器,就选择这台服务器处理本次请求。
具体可以看这篇文章:nginx-power-of-two-choices-load-balancing-algorithm
算法论文地址:The Power of Two Random Choices: A Survey of Techniques and Results
三、负载均衡类型
3.1 四层负载和七层负载
这四层负载和七层负载是指在 OSI 七层网络模型。越往上越接近软件,越往下越接近硬件。
四层负载:在 OSI 七层模型来看,它工作在 TCP 传输层
七层负载:在 OSI 七层模型看,它工作在应用层
3.2 软件负载和硬件负载
软件负载:Nginx、HAproxy 和 LVS
Nginx 工作在七层,OSI 网络模型的第七层应用层。
HAproxy 也是工作在七层,支持七层的负载规则。
LVS 它允许在 linux 内核态,工作在传输层和网络层,软件负载均衡中性能最高。
Nginx 作为负载均衡器代理后端应用服务集群,示意图:
软件负载均衡虽然比硬件负载性能差些,但是对于一般应用基本够用。而且它还便于操作,免费,可以灵活配置。
硬件负载:F5、Array 和 NetScaler
它工作在四层。功能强大,可以支持各种负载均衡算法。性能强大,可以支持百万以上并发。比软件负载均衡性能更好。
缺点就是很贵,一台普通F5得10多万,好点要尽百万。
3.3 应用程序、网络、DNS负载
应用程序负载均衡:
应用程序负载均衡就是负载均衡器查看请求内容,比如 HTTP 头或会话 ID ,然后重新定向这个请求的流量。
网络负载均衡:
网络负载均衡就是查看 IP 地址和其他网络信息,然后根据这些信息来定向这个请求流量。
DNS 负载均衡:
域名就是由 DNS 服务器解析成 IP,然后通过 IP 定位到提供服务的服务器。DNS 可以做 全局负载均衡 - 地理位置和数据机房级别的负载均衡。
DNS 的缺点: 修改 DNS 解析规则后,解析不能马上生效,因为它有缓存。为了改进这个缺点,可以用 HTTPDNS。
HTTPDNS 也有缺点:它不像 DNS 是一个标准协议,不通用。不适合 web 业务,因为 web 中的 DNS 解析是由浏览器解析的,不容易控制。所以 HTTPDNS 一般多用于 APP 应用、客户端应用,这种可以完全掌控的应用。
四、多级负载均衡
LVS + Nginx 多级负载均衡
- 两台 LVS 在四层负载均衡,可以组成主备或双主结构
- 后面的 Nginx 可以组成负载集群,可以横向扩展。一台 Nginx 负载均衡不可用,还有其它的 Nginx 可用,可用性更高
- 后面的应用服务器集群也可以横向扩展
DNS + Nginx 多级负载均衡
根据地址位置进行负载均衡。由 DNS 解析出 IP 地址,根据 IP 地址计算出地理位置,然后导向相应地理位置的 Nginx 负载均衡集群。
比如一家公司在北京和深圳设有 2 地数据中心,华北相关地方访问北京数据中心,华南相关地方访问深圳数据中心。
这家公司就可以根据用户访问 IP 地址计算出用户相应地理位置,然后根据地理位置访问对应最近的数据中心。
五、参考
- https://www.nginx.com/blog/nginx-power-of-two-choices-load-balancing-algorithm/ nginx 的 p2c 算法
- https://nginx.org/en/docs/http/ngx_http_upstream_module.html nginx 模块
- https://www.eecs.harvard.edu/~michaelm/postscripts/handbook2001.pdf The Power of Two Random Choices: A Survey of Techniques and Results,这个算法论文地址
负载均衡load balancing和算法分类概要介绍的更多相关文章
- Oracle RAC 客户端连接负载均衡(Load Balance)
实现负载均衡(Load Balance)是Oracle RAC最重要的特性之一,主要是把负载平均分配到集群中的各个节点,以提高系统的整体吞吐能力.通常情况下有两种方式来实现负载均衡,一个是基于客户端连 ...
- 【高可用HA】Apache (3) —— Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_proxy
Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_proxy httpd版本: httpd-2.4.17 参考来源: Apache (1) -- Mac下安装Apac ...
- nignx 负载均衡的几种算法介绍
负载均衡,集群必须要掌握,下面介绍的负载均衡的几种算法. 1 .轮询,即所有的请求被一次分发的服务器上,每台服务器处理请求都相同,适合于计算机硬件相同. 2.加权轮询,高的服务器分发更多的请求 ...
- Oracle RAC 服务器端连接负载均衡(Load Balance)
Oracle RAC服务器端的负载均衡是根据RAC中各节点的连接负荷数情况,将新的连接请求分配到负荷最小的节点上去.当数据库处于运行时,RAC中各节点的PMON进程每3秒会将各自节点的连接负荷数更新到 ...
- 浅析负载均衡的6种算法,Ngnix的5种算法。
浅析负载均衡的6种算法,Ngnix的5种算法.浮生偷闲百家号03-21 10:06关注内容导读其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果.源地址哈希的思想是根据获取客 ...
- "高可用方案工具包" high availability toolkit 1.2 公布了。version 1.2 新增了 负载均衡 load balance 的技术实现
"高可用方案工具包" high availability toolkit 1.2 公布了. version 1.2 新增了 负载均衡 load balance 的技术实现. 项目 ...
- 【高可用HA】Nginx (1) —— Mac下配置Nginx Http负载均衡(Load Balancer)之101实例
[高可用HA]Nginx (1) -- Mac下配置Nginx Http负载均衡(Load Balancer)之101实例 nginx版本: nginx-1.9.8 参考来源: nginx.org [ ...
- 【高可用HA】Apache (4) —— Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_jk
Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_jk httpd版本: httpd-2.4.17 jk版本: tomcat-connectors-1.2.41 参考 ...
- 章文嵩博士和他背后的负载均衡(LOAD BANLANCER)帝国
案首语: 阿里集团技术大牛,@正明,淘宝基础核心软件研发负责人.LVS创始人.阿里云首席科学家章文嵩博士从阿里离职,去追求技术人生另一段历程,让阿里像我一样的很多热爱技术的工程师都有一丝牵动和感触. ...
- 负载均衡的几种算法Java实现代码
轮询 package class2.zookeeper.loadbalance; import java.util.ArrayList; import java.util.HashMap; impor ...
随机推荐
- [转帖]为什么不推荐使用/etc/fstab
https://www.jianshu.com/p/af49a5d0553f 对于工作中使用服务器的公司来讲,每到节假日来临时,总免不了对服务器进行下电.而收假回来的早上,则会有一个早上的时间会花费在 ...
- [转帖]如何利用wrarp测试oss性能?
https://zhuanlan.zhihu.com/p/529735003 前言 我们利用mino与ceph rgw搭建好的oss经过多层网络转发,传输速度必定有所折损,这个时候我们使用wrap ...
- [转帖]SSH交互式脚本StrictHostKeyChecking选项 benchmode=yes
https://www.cnblogs.com/klb561/p/11013774.html SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击.但是在特定情况下,严格的 SSH 公钥 ...
- 【转帖】基于官方rpm包方式安装Oracle19c
https://blog.whsir.com/post-5489.html 本文基于Centos7.x环境,通过官方提供的rpm包来安装19c 1.下载Oracle19c安装包 https://w ...
- fiddler如何抓取https请求
pc端browse 1.打开下载好的fiddler,点击tools选择options后进入https tab下,勾选Decrypt HTTPS CONNECTS 和Ignore server cer ...
- v-for动态添加表单,并且获取表单中的值
vue是数据驱动视图,所以要想改变页面的结构,就要首先改变数据. 要想动态添加一个input表单,每当你点击的时候,添加一个数据在数组里面. handler(mess){ this.list.push ...
- 【分享一个工具】通过定义proto3来自动生成多进程模式的插件代码
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我在多进程插件框架 hashicorp/go-plugin ...
- python随机种子seed的作用(强化学习常用到)
先上代码 import math import gym from gym import spaces, logger from gym.utils import seeding import nump ...
- 【操作系统到计网从入门到深入】(一)Linux基础知识预备
前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记,所以如果是博主比较熟悉的知识点,博主可能就直接跳过了,但是所有重要的知识点,在这个专栏里面都会提到!而且我也一定会保证这个专栏知识点的完整 ...
- 练习(Java):将一个数转换为16进制;获得多位数的各个位上的数
//将一个数转换为十六进制 int num = 60; int i1 = num % 16; int i2 = num % (16*16) / 16; int i3 = num % (16*16*16 ...