1. 负载均衡时一种集群技术,他将特定的业务(网络服务,网络流量)分担给多台网络设备,从而提高看了业务处理能力,保障了业务的高可用性,但是我们的网站对外提供的访问入口都是一个的,如www.taobao.com,那么当用户再浏览器输入www.taobao.com的时候如何将用户的请求分发到集群中不同的机器上,这就是负载均衡做的事,<br />在实际应用中,在web服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为web服务器流量的入口,挑选最合适的一台web服务器将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发<br />这些可以是web应用服务器集群,也可以是数据库服务集群,还可以是分布式缓存服务器集群等,<br />目前最常见的负载均衡应用时Web负载均衡,根据实现原理可以分为:DNS轮询,IP负载均衡,CDN,<br />其中IP负载均衡可以使用硬件设备(F5)或软件方式(NginxLVSHaProxy)来实现<br />软件负载解决的两个核心问题是:选谁,转发,其中最著名的就是LVSLinux Virtual Server

什么是Web负载均衡

服务器集群(Cluster)使得多个服务器节点能够协同工作,根据目的的不同,服务器集群可以分为
1.高性能集群:将单个重负载的请求分散到多个节点进行处理,最后再将处理结果进行汇总
2.高可用负载:提高冗余单元,避免单点故障
3.负载均衡集群:将大量的并发请求分担到多个处理节点,由于单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性
一般提高的负载均衡是指实现负载均衡集群,负载均衡实现了横向扩展,避免纵向的升级换代(特指的是能够分担web请求(http,https等)的负载均衡技术)

原理

任何的负载均衡技术都要想办法建立某种一对多的映射机制,一个请求的入口映射到多个处理请求的节点,从而实现分而治之
这种映射机制使得多个物理存在对外体现为一个虚拟的整体,对服务的请求者屏蔽了内部的结构
采用不同的机制建立映射关系,可以形成不同的技术

  • DNS轮询
  • CDN
  • IP负载均衡

    负载均衡层次分类

    二层负载均衡
    负载均衡服务器对外依然提供一个vip(虚ip),集群中不同的机器采用相同的IP地址,但机器的MAC(物理地址,网络唯一标识)地址不一样,当负载均衡服务器收到请求后,通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡,
    三层负载
    和二层负载均衡类似,负载均衡服务器对外依然提供一个vip(虚IP),但是集群内不同的机器采用不用的ip地址,当负载均衡服务器接收到请求后,根据负载均衡算法,通过IP将请求转发至不同的真实服务器
    四层负载均衡(目标地址和端口互换)
    四层负载均衡工作在OSI模型的传输层,由于在传输层只有TCP/UDP协议,这两种协议中除了包含源IP,目标IP,以以外,还包含源端口号以及目的端口号,四层负载负载均衡服务器在接收到请求后,主要是通过报文中的目标地址地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部分服务器,
    负载均衡设备接收到用户的SYN(三个握手发送的数据包)请求时,通过均衡算法选择一个服务器,并对请求报文的目标IP地址进行修改(改为真实的后端ip),直接转发给该服务器,建立TCP连接,三次握手都是于后端服务器建立的,负载均衡服务器只是起到一个类似路由器的转发动作,为保证服务器的回包正确的返回父子负载设别,对报文的源地址也会进行修改,
    syn攻击(建立连接,流量攻击)会被转发到后端服务器上
    负载均衡 - 图1
    七层负载均衡(内容交换)
    七层负载均衡工作在OSI模型的应用层,应用层协议比较多,常用http,redius,DNS等,七层负载就可以基于这些协议来负载,这些应用层协议中会包含很多有意义的内容,比如同一个web服务器的负载均衡,除了根据IP+端口进行负载外,还可以根据七层的URL,浏览器类别,语言来决定是否要进行负载均衡
    负载均衡主要通过报文中真正有意义的应用层内容(已经三次握手),再加上负载均衡设备的算法,选择合适的后端服务器,
    负载均衡设备要根据真正的应用层内容再选择服务器(也就是为什么可以方式SYN请求攻击),只能先代理最终的服务器和用户建立TCP连接,才可能接受到客户端用户发送来的真正的应用层数据,然后再根据报文中的特定字段,再在负载均衡设备中选择,(可以根据请求的类型,去请求不同的服务器,比如文字类,图片类,资源类,使用一些缓存,压缩技术)然后负载均衡设备再与真正的后端服务器建立TCP连接。
    syn攻击在负载均衡设备就截止了,不会影响后台服务运行
    七层负载对负载均衡设备的要求更高,处理能力也就低于四层负载的部署方式,
    好处是可以提高应用系统的灵活性,安全性高,可以设置过滤,

对于一般的应用来说,有了Nginx就够了,Nginx可以用于七层负载均衡,但是对于一些大的网站,一般会采用DNS+四层负载+七层负载的方式进行多层负载均衡
负载均衡 - 图2

DNS

DNS是因特网的一项服务,属于最简单的负载均衡放肆,是域名跟ip地址的相互映射,以域名作为访问入口。DNS均衡就是在域名后多配置几个IP地址,然后,运营商的DNS服务器会根据对应的负载均衡算法(应该是轮询),返回一个ip地址,从而访问服务器集群中的某一个服务,当然域名还是那个域名,只是IP地址是多个,
DNS没有快速的健康检查机制,而且只支持WRR的调度策略导致负载均衡很难“均衡”通常用于要求不高的场景,并且DNS方式直接将服务器的真实地址暴露给用户,不利于服务器安全
优点:负载工作都交给了DNS,比较方便,不用修改代码,操作易行,服务器随意位置,有的DNS还会解析选择最近的服务器地址
缺点:DNS是多级解析的,有缓存,服务器宕机删除后,不会立刻生效;采用最简单的轮询,不能够达到完美的均衡效果;设置DNS刷新更新数据,使地址能够随机分配,可能会增加其他的网络问题,
一般使用DNS只是作为第一级别的负载均衡手段,返回的ip地址,不是真正的物理主机,而是同样提供负载均衡的内部服务器,内部服务器再进行负载均衡,将请求发送到真实的服务器,完成请求

CDN

CDN内容发布网络,通过发布机制将内容同步到大量的缓存节点,并在DNS服务器上进行扩展,找到离用户最近的缓存节点作为服务提供节点
是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡,内容发布,调度等功能模块,使用户就近获取所需内容,减低网络拥塞,提高用户访问响应速度和命中率,CND的关键技术是内容存储和分发技术
因为很难自建大量的缓存节点,所以通常使用CDN运行商的服务,目前国内的服务器很少,而且按流量计费,价格昂贵
一般包含分发服务系统,负载均衡系统和管理系统
分发服务系统
其基本的工作单元就是各个cache服务器,负责直接响应用户请求,将内容快速分发到用户,同时还负责内容更新,保证和源站内容的同步,
根据内容和服务种类的不同,分发服务系统分为多个子服务系统,如:网页加速服务,流媒体加速服务,应用加速服务等,每个子服务系统都是一个分布式的服务集群,由功能类似,地域接近的分布部署的cache集群组成
在承担内内容同步,更新和响应用户请求之外,分发服务系统还需要向上层的管理调度系统反馈每个cache设备的健康状况,响应情况,内容缓存状况等,以便管理调度系统能够根据设定的策略决定由哪个cache设备响应用户的请求
负载均衡系统
是整个系统的中枢,负责对所有的用户请求进行调度,确定提供给用户的最终访问地址,
使用分级实现,最基本的两极调度体系包括全局负载均衡(GSLB)和本地负载均衡(SLB)
GSLB根据用户地址和用户请求的内容,主要根据就近性原则,确定向用户服务的节点,一般通过DNS解析或者应用层重定向的方式实现
SLB主要负责节点内部的负载均衡当用户请求从GSLB调度到SLB时,SLB会根据节点内各个cache设备的工作状况和内容分布情况等,对用户请求重定向,SLB的实现由四层调度(LVS)七层调度(Nginx)和链路负载调度等
管理系统
分为运营管理和网络管理子系统
网络管理系统实现对CDN系统的设备管理,拓扑管理,链路管理,和故障管理,为管理员提供对全网资源的可视化的集中管理,通常用web方式实现
业务管理负责处理业务层面的与外界系统交互所必须的一些收集,整理,交付工作,包括用户管理,产品管理,计费管理,统计分析(我理解的就是管理员能看见的后台操作页面)

IP负载均衡

IP负载均衡是基于特定的TCP/IP技术实现的负载均衡,比如NAT,DR,等,是常用的使用方式,
IP负载均衡可以使用硬件设备,也可以使用软件实现,硬件设备主要产品是F5(F5-BLG-IP-GTM),软件产品有LVS,HAProxy,Nginx,前两个可以工作再4-7层,nginx是7层
硬件负载均衡设备可以将核心部分做成芯片,性能和稳定性更好,而且商用产品的可管理性,文档,和服务都比较好。唯一的问题就是价格
软件负载均衡通常是开源软件,自由度高,但那时学习成本和管理成本比较大

F5

全称是F5-BLG-IP-GTM 是最流行的硬件负载均衡设备,其并发能力打包百万级,
特性
多链路的负载均衡和冗余:可以接入多条LSP链路,在链路之间实现负载均衡和高可用
防火墙负载均衡:F5具有异构防火墙的负载均衡与故障自动排除能力
服务器负载均衡:这是F5最主要的功能,可以配置针对所有对外提供服务的服务器配置Virtual Server实现负载均衡,健康检查,会话保持等,
高可用:
F5设备自身的冗余设计能够保证99.999%的正常运行时间,双机F5的故障切换时间为毫秒级
使用F5可以配置整个集群的链路冗余和服务器冗余,提高可靠的健康检查机制,以保证靠可用
安全性:与防火墙类似,F5采用缺省拒绝策略,可以为任何站点增加额外的安全保护,防御普通网络攻击,包括DDos,IP欺诈,SYN攻击等,
易于管理:
F5提供HTTPS ,SSH,Telnet,SNMP等多种管理方式,包含详尽的实时报告和历史记录报告,公是还提供二次开发包
其他:还提供了SSL加速,软件升级,IP地址过滤,宽带控制等辅助功能,

LVS

也就是Linux虚拟服务器,是由一个章文昌嵩博士发起的自由软件项目,目前已经集成到Linux内核中,使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作技术实现了一个高性能,高可用的服务器集群,它具有良好可靠性,可扩展性,和可操作性,从而以低廉的成本,实现最优的服务性能,
LVS主要是用来做四层负载均衡的

LVS架构

有三个部分组成,最前端的是负载均衡层(Loader,Balancer),中间的是服务器集群层,用server Array表示,最底层的数据共享存储层用Shared,storage表示。在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务,
image.png
Load Balancer层:
位于整个集群系统的最前端,有一台或者多台负载调度器组成,LVS模块就安装在调度器上,而调度器的主要作用类似一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array 层的应用服务器上,同时在调度器上还安装对应用服务器的监控模块Ldirectord,此模块用于检测各个服务器的健康情况,在不可用时把它从LVS路由表中剔除,恢复时重新加入
Server Array层:
由一组实际运行应用服务的机器组成,可以是web服务器,Mail服务器,FTP服务器,DNS服务器中的一个或多个,每个服务器之间通过高速的LAN或分布在各地的WAN相连接,在实际的应用中调度器也可以同时兼任服务器的角色
Shared Storage层:
是为所有服务器提供共享存储空间和内容的一致性存储区域,在物理上一般由磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,Oracle提供的OCFS2文件系统等,
从整个LVS结构可以看出,调度器是整个LVS的核心,目前用于调度器的操作系统是能是Linux和FreeBSD,Linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为调度器的应用还不是很多,性能也不是很好,对于服务器,几乎是是所有的系统平台,Linux,windows,AIX,BSD系列都能很好支持,

负载均衡机制

基于不同的网络技术,LVS支持多种负载均衡机制,包括 VS/NAT(基于网络地址转换技术),VS/TUN(基于IP隧道技术)和VS/DR(基于直接路由技术)
此外为了适应不同的需要,淘宝开发了VS/FULLNAT,从本质上来说也是基于网络地址转换技术,最近还有一个基于VS/FULLNET的DNAT模块
不管是那种机制LVS都不直接处理请求,而是将请求转发到后面真正的服务器,不同的机制,决定了相应包如何返回客户端
VS/NAT
网络地址转换,也叫做网络掩蔽或者IP掩蔽,是将ip数据包头中的IP地址转换成为另一个IP地址的过程
NAT能够将私有(保留)地址转化为合法IP地址,通常用于一个公共IP地址和多个内部私有ip地址直接的映射,广泛应用于各种类型internet接入方式和各种类型的网络中,
通过使用NAT将目的地址转换到多个服务器的方式,可以实现负载均衡,同时能够隐藏并保护内部服务器,避免来自网络外部的攻击,
VS/NAT是基于NAT技术实现的负载均衡的方法,
过程
1.客户端通过虚拟ip访问网络服务,到达调度器
2.调度器根据算法,选出一台后端服务器,将报文的目标地址(虚拟ip)改为选定的服务器ip地址,修改报文对应的目标的端口,最后将报文发送到选定的服务器
3.真实的服务器处理请求,并将响应报文发送到调度器,
4.调度器将报文的源地址和源端口改为虚拟ip跟端口
5.调度器将修改后的报文发送给用户
在VS/NAT的集群系统中,请求和响应的数据报文都需要通过负载调度器,当真实服务器的数目在10-20台之间时,负载调节器将成为整个集群系统的新瓶颈,大多数的internet服务都有这员工的特点,请求报文较短而响应报文往往包含大量的数据,如果能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直接返回给客户,将极大的提高了整个集群系统的吞吐量,比如IP隧道技术
优点:对后端服务器的操作系统无要求;只需要一个IP地址配置早调度器上,服务器组可以用私有的IP地址,支持端口映射
缺点:请求和响应报文都是通过调度器,伸缩能力有限(10个);要求服务器和调度器在同一个VLAN;需要将服务器的默认网关指向调度器,对于那些将IP地址或者端口号在报文数据中传输的网络服务,需要编写相应的应用模块来转换报文数据中的地址,以及端口
VS/TUN
ip隧道技术,又称为IP封装技术,是一种在网络之间传递数据的方式,可以将一个ip报文封装到另外一个p报文(不同的协议)中,并转发到另外一个IP地址,IP隧道主要用于移动主机和虚拟私有网络,在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址
工作过程跟NAT相比
1.调度器转发报文的时候进行了协议的二次封装,真实的服务器接受到请求后选及逆行解包
2.响应报文从后端服务器直接返回给用户,不用经过调度器
优点:不需要调度响应报文,性能高。服务器跟调度器可以不在一个VLAN,支持广域负载均衡,
缺点:所有的服务器必须支持IP,Tunneling协议,要安装内核模块(比如IPIP等)配置复杂,有建立ip隧道的开销,服务器直接绑定虚拟ip,风险大,服务器需要联通外网,不支持端口映射
VS/DR
直接路由,路由器学习路由的方法之一,路由器对于自己的网络接口所直连的网络之间的通信,可以自动维护路由表,而且不需要进行路由计算
直接路由通常用在一个三层交换机连接几个VLAN(局域网)的情况下,只需设置直接路由VLAN之间就可以通信,不需要设置其他的路由方式
跟TUN方法相比,DR利用大多数internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回用户,可以极大的提高整个集群系统的吞吐量
DR要求调度器和服务器组都必须在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的HUB相连,中间没有隔有路由器,VIP地址为调度器和服务器组共享,调度器配置的vip地址是对外可见的,用于接受虚拟服务的请求报文,所有的服务器吧VIP地址配置在各自的Non-ARP网络设备上,他对外是不可见的,只是用于处理目标地址为VIP的网络请求,
DR的整个过程和TUN非常类似,不同之处在于调度器不对请求包进行二次封装,只是将目标MAC地址更改为经过调度算法选出的目标服务器MAC
优点:没有ip隧道的开销,性能最好
缺点:要求服务器于调度器都有一块网卡连在统一物理网段(VLAN)上;要求服务器网络设备不做ARP相应,或者能将报文重定向到本地的Socket端口上,服务器直接绑定虚拟ip,风险大,服务器需要联通外网,不支持端口映射
VS/FULLNAT
调度器和服务器可以跨VLAN,不需要再一个网段
不需要绑定虚拟ip。都需要经过调度器
如何选择
如果人少钱多,不在乎性能的损耗愿意多买服务器,同时希望最大程度较少运维的工作量,可以选择FULLNAT
很大众的方式是用DR,没有太多的优点但也没有太多的缺点
如果要搞广域网负载均衡,那就用TUN吧
个人感觉NAT不是为了互联网用的。小并发的实验性应用或者用在非web场合,比如mysql集群等。当然,如果需要端口映射,必须使用NAT方式

负载均衡算法

分为两类,静态负载算法,和动态负载算法
静态:轮询,比率,优先权
动态:最少连接数,最快响应速度,观察方法,预测法,动态性能分配,动态服务补充,服务质量,服务类型,规则模式
轮询
顺序循环将请求依次顺序循环的连接每个服务器,当其中某个服务器发生第二到第七层的故障,BLG-IP就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常,
以轮询的方式依次请求调度不同的服务器,实现时,一般为服务器带上权重,这样由两个好处
针对服务器的性能差异可分配不同的负载,
当需要将某个节点删除时,只需要将其权重设置为0
优点:实现简单,高效,易水平扩展
缺点:请求到目的节点的不确定,造成其无法适用于有写的场景,(缓存,数据库写)
场景:数据库或者应用服务层中只有读的场景(无法理解为什么只能读)
随机方式
请求随机分布到各个节点,在数据足够大的场景呢个达到一个均衡分布
优点:实现简单,易水平扩展
缺点:同Round Robin 无法用一定于有写的场景
场景:数据库负载均衡,也是只有读的场景
哈希方式
根据Key来计算需要落在的节点上,可以保证一个相同健,一定落在相同的服务器上
优点:相同的key一定落在同一个节点上,这样就可以用于有写有读的缓存场景
缺点:在某个节点故障后,会导致哈希健重新分布,造成命中率大幅度下降,
解决:一致性哈希 or 使用keepalived保证任何一个节点的高可用性,故障后会有其他节点顶上来,
场景:缓存,有读有写
一致性哈希
在服务器一个节点出现故障后,受影响的只有这个节点上的key,最大程度的保证命中率,如twemproxy中的ketama方案,生产实现中还可以规划执行子key哈希,从而保证局部相似特征的键能分布在同一个服务器上,
优点:结合故障后命中率下降有限
场景:缓存
根据键的范围来负载
前一亿个键都存放在第一个服务器,1-2亿在第二个节点服务器,
优点:水平扩展容易,存储不够时,加服务器存放后续新增数据,
缺点:负载不均,数据库的分布不均衡(数据有冷热区分,一般最近注册的用户更加活跃,这样造成后续的服务器非常忙碌,而前几个服务器节点空闲很多)
场景;数据库分片负载均衡
根据键对服务器节点数取模来负载
根据键对服务器节点数取模来负载,比如由四个节点,key取模为0的在第一个,1落在第二个
优点:数据冷热分布均衡,数据库节点负载均衡分布
缺点:水平扩展较难
场景:数据库分片负载均衡
纯动态节点负载均衡
根据CPU,IO,网络的处理能力来决策接下来的请求如何调度,
优点:充分利用服务器的资源,保证每个负载处理均衡
缺点:实现起来复杂,真实使用较少
不用主动负载均衡
使用消息队列转为异步模型,将负载均衡的问题消灭,负载均衡时一种推模型,一直向你发数据,那么将所有的用户请求发到消息队列中,所有的下游节点谁有空闲,谁上来取数据处理,转为拉模型之后,消除了对下行节点负载的问题
优点:通过消息队列的缓冲,保护后端系统,请求剧增时不会冲垮后端服务器,水平扩展容易,加入新节点后,直接取queue即可
缺点:不具有实时性
场景:不需要实时返回的场景(比如12306下订单后,立即提示信息,您的订单取排队了,等处理完再异步通知)
比率
给每个服务器分配一个加权值为比例,根据这个比例,把用户的请求分配到每个服务器,当其中某个服务器发生故障,BIG-IP(硬件产品,进出流量管理,监控)就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到恢复正常
优先权
给所有服务器分组,给每个组定义优先权,BIG-IP用户的请求,分配给优先级最高的服务器组(同一组内采用轮询或者比率算法,分配用户的请求),当最高优先级中所有服务器出现故障,BIG-IP才将请求送给次优先级的服务器组,这种方式,实际为用户提供一种热备份的方式,
最少的连接方式
传递新的连接给那些进行最少连接处理的服务器,当其中某个服务器发生故障,BLG-ip就把其从队列中拿出,不参加下一次轮询,直至恢复
最快模式
传递连接给那些响应最快的服务器,当其中某个服务器发生故障,BLG-ip就把其从队列中拿出,不参加下一次轮询,直至恢复
观察模式
连接数目和响应时间以这两项的最佳平衡为依据为新的请求选择服务器,当其中某个服务器发生故障,BLG-ip就把其从队列中拿出,不参加下一次轮询,直至恢复
预测模式
BLG-IP利用收集到的服务器当前的性能指标,进行预测分析,选择一台服务器在下一个时间片内,其性能将达到最佳的服务器相应用户的i请求,(被BLG-ip进行检测)
动态性能分配
BLG-IP收集到的应用程序和应用服务器的个项性能参数,同态调整流量费分配
动态服务器补充
当主服务器群中因故障导致数量减少时,动态的将备份服务器补充至主服务器群,
服务质量
按不同的优先级对数据流进行分配
服务类型
按不同的服务类型,负载均衡对数据流进行分配
规则模式
针对不同的数据流设置导向规则,用户可自行