什么是负载均衡?
讲到负载均衡是什么,首先要讨论下负载均衡出现的背景。
- CPU的发展单核心高频->多核心多线程技术
- 单体架构->集群架构->分布式架构
关键字
- 效率提升
- 横向扩容(集群)
- 平衡、防止单体过载
- 空间换时间
概念
负载均衡(Load balancing):在计算中,负载平衡改善了跨多个计算资源(例如计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器)的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载。使用具有负载平衡而不是单个组件的多个组件可以通过冗余提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行。需要我们注意的是:它并不属于网络基础架构,而是属于一种网络优化设备。它是建立在现有的网络基础架构之上,给企业提供了更廉价更有效的扩展选择。
个人总结:将负载进行平衡,将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备。
为了解决的问题
流量堵塞、效率缓慢、运行不畅,提高业务的处理能力,服务的高可用性。
硬件负载均衡&软件负载均衡
硬件负载均衡不做讨论。列举一些产品:
- F5 BIG-IP负载均衡器(LTM)
- 思科
- Radware的AppDirector系列
- …
网络七层协议
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
负载均衡的场景
浏览器发送请求后发生了什么?
- DNS服务器,DNS本身是一个基于UDP协议的网络协议,查询IP地址信息。
- 浏览器获得真正的IP、port、通过TCP协议发起网络访问
- Web Server(协议处理、静态文件、动态内容)
- 调用不同服务、不同接口等进行处理
- 响应
全局负载均衡系统(GSLB)
全局负载均衡主要用于在多个区域拥有自己服务器的站点,为了使全球用户只以一个IP地址或域名就能访问到离自己最近的服务器,从而获得最快的访问速度。
- 内容分发网络(CDN)
DNS轮询
利用DNS处理域名解析请求的同时进行负载均衡是另一种常用的方案。在DNS服务器中配置多个A记录,如:xxx IN A 114.100.80.1、xxx IN A 114.100.80.2、xxx IN A 114.100.80.3.
每次域名解析请求都会根据负载均衡算法计算一个不同的IP地址返回,这样A记录中配置的多个服务器就构成一个集群,并可以实现负载均衡。HTTP重定向
服务器负载均衡系统(SLB)
- 数据链路层负载均衡
数据链路层负载均衡是指在通信协议的数据链路层修改mac地址进行负载均衡。
这种数据传输方式又称作三角传输模式,负载均衡数据分发过程中不修改IP地址,只修改目的的mac地址,通过配置真实物理服务器集群所有机器虚拟IP和负载均衡服务器IP地址一样,从而达到负载均衡,这种负载均衡方式又称为直接路由方式(DR).
在上图中,用户请求到达负载均衡服务器后,负载均衡服务器将请求数据的目的mac地址修改为真是WEB服务器的mac地址,并不修改数据包目标IP地址,因此数据可以正常到达目标WEB服务器,该服务器在处理完数据后可以经过网管服务器而不是负载均衡服务器直接到达用户浏览器。
使用三角传输模式的链路层负载均衡是目前大型网站所使用的最广的一种负载均衡手段。在linux平台上最好的链路层负载均衡开源产品是LVS(linux virtual server)。
- IP负载均衡(SNAT)
IP负载均衡:即在网络层通过修改请求目标地址进行负载均衡。
用户请求数据包到达负载均衡服务器后,负载均衡服务器在操作系统内核进行获取网络数据包,根据负载均衡算法计算得到一台真实的WEB服务器地址,然后将数据包的IP地址修改为真实的WEB服务器地址,不需要通过用户进程处理。真实的WEB服务器处理完毕后,相应数据包回到负载均衡服务器,负载均衡服务器再将数据包源地址修改为自身的IP地址发送给用户浏览器。
这里的关键在于真实WEB服务器相应数据包如何返回给负载均衡服务器,一种是负载均衡服务器在修改目的IP地址的同时修改源地址,将数据包源地址改为自身的IP,即源地址转换(SNAT),另一种方案是将负载均衡服务器同时作为真实物理服务器的网关服务器,这样所有的数据都会到达负载均衡服务器。
IP负载均衡在内核进程完成数据分发,较反向代理均衡有更好的处理性能。但由于所有请求响应的数据包都需要经过负载均衡服务器,因此负载均衡的网卡带宽成为系统的瓶颈。
常用的负载均衡
- FW-F5-IHS-核心(三层)交换机-WAS
- VIP-Nginx-Keepalived-webserver
服务底层负载均衡
- 分布系统中服务的负载均衡,如SpringCloud Ribbon、Zookeeper。
网络分层中的负载均衡区别
服务器负载均衡根据LB设备处理到的报文层次,分为四层服务器负载均衡和七层负载均衡。
- 技术原理上的区别
四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,即通过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。
TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。
七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。
- 应用场景的需求
七层应用负载的好处,是使得整个网络更”智能化”, 例如访问一个网站的用户流量,可以通过七层的方式,将对图片类的请求转发到特定的图片服务器并可以使用缓存技术。
将对文字类的请求可以转发到特定的文字服务器并可以使用压缩技术。当然这只是七层应用的一个小案例,从技术原理上,这种方式可以对客户端的请求和服务器的响应进行任意意义上的修改,极大的提升了应用系统在网络层的灵活性。很多在后台,(例如Nginx或者Apache)上部署的功能可以前移到负载均衡设备上,例如客户请求中的Header重写,服务器响应中的关键字过滤或者内容插入等功能。
- 安全性
是否真的可以提高安全性
是否有足够的灵活度
正向代理&反向代理
正向代理(forward proxy) ,一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并制定目标(原始服务器),然后代理向原始服务器转发请求并将获得的内容返回给客户端,客户端才能使用正向代理。我们平时说的代理就是指正向代理。 简单一点:A向C借钱,由于一些情况不能直接向C借钱,于是A想了一个办法,他让B去向C借钱,这样B就代替A向C借钱,A就得到了C的钱,C并不知道A的存在,B就充当了A的代理人的角色。
反向代理(Reverse Proxy),以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求的客户端,此时代理服务器对外表现为一个反向代理服务器。理解起来有些抽象,可以这么说:A向B借钱,B没有拿自己的钱,而是悄悄地向C借钱,拿到钱之后再交给A,A以为是B的钱,他并不知道C的存在。
服务端负载均衡&客户端负载均衡
负载均衡服务
- 四层:F5、LVS
- 七层:Nginx、HAproxy
- 协调:Keepalived
负载均衡云服务
- 阿里SLB
- Amazon ELB
- Citrix ADC
- 腾讯 CLB
- Radware的AppDirector
负载均衡组件
- zookeeper
- spring-cloud-ribbon客户端负载均衡
- spring-cloud-zuul实现反向代理和负载均衡
负载均衡策咯
- 轮循(Round Robin) & 加权轮循(Weighted Round Robin)
- 最少连接数(Least Connection)
- 最少连接数慢启动时间(Least Connection Slow Start Time)
- 基于代理的自适应负载均衡(Agent Based Adaptive Balancing)
- 固定权重(Fixed Weighted)
- 加权响应(Weighted Response)
- 源IP哈希(Source IP Hash)
参考资料
- Load Balancing (computing) WIKI:https://en.wikipedia.org/wiki/Load_balancing_(computing)
- 四层/七层负载均衡区别:https://www.jianshu.com/p/fa937b8e6712
- 软/硬件负载均衡产品知多少:https://www.cnblogs.com/lcword/p/5773296.html
- 全局负载均衡与CDN网络简介:https://blog.csdn.net/u010340143/article/details/9062213
- 大型网络-负载均衡架构:http://www.cnblogs.com/and/p/3366400.html
- Nginx实现负载均衡+keepalived实现Nginx高可用:https://www.cnblogs.com/youzhibing/p/7327342.html
- 正向代理&反向代理:https://blog.csdn.net/zt15732625878/article/details/78941268
- 常见负载均衡算法:https://www.cnblogs.com/will-shun/archive/2017/09/22/7574644.html