简单学习总结
一、负载均衡
1、负载均衡又分为四层负载均衡和七层负载均衡。
四层负载均衡工作在OSI模型的传输层,主要工作是转发,它在接收到客户端的流量以后通过修改数据包的地址信息将流量转发到应用服务器。
七层负载均衡工作在OSI模型的应用层,因为它需要解析应用层流量,所以七层负载均衡在接到客户端的流量以后,还需要一个完整的TCP/IP协议栈。七层负载均衡会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去,因此七层负载均衡的主要工作就是代理。
2、软硬件
1)四层的负载均衡就是基于IP+端口的负载均衡:
对应的负载均衡器称为四层交换机(L4 switch),主要分析IP层及TCP/UDP层,实现四层负载均衡。此种负载均衡器不理解应用协议(如HTTP/FTP/MySQL等等)。
实现四层负载均衡的软件有:
- F5:硬件负载均衡器,功能很好,但是成本很高。
- lvs:重量级的四层负载软件
- nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
- haproxy:模拟四层转发,较灵活
2)七层的负载均衡就是基于虚拟的URL或主机IP的负载均衡
对应的负载均衡器称为七层交换机(L7 switch),除了支持四层负载均衡以外,还有分析应用层的信息,如HTTP协议URI或Cookie信息,实现七层负载均衡。此种负载均衡器能理解应用协议。
实现七层负载均衡的软件有:
- haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移;
- nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;
- apache:功能较差
- Mysql proxy:功能尚可。
总的来说,一般是lvs做4层负载;nginx做7层负载;haproxy比较灵活,4层和7层负载均衡都能做。
3、具体实现:
(1)目前负载均衡系统有Nginx、LVS、F5,即:
- Nginx是软件的7层负载均衡,
- LVS是内核的4层负载均衡,
- F5是硬件的4层负载均衡。
(2)软件和硬件的区别在于性能,硬件远远高于软件,即:
- Nginx的性能是万级的,一般的Linux服务器上安装一个Nginx能达到每秒5万并发请求;
- 而F5的性能能达到百万级,从200万每秒到800万每秒都有,不过价格很贵。
(3)4层和7层的区别在于协议和灵活性,即:
- Nginx是7层的,它支持HTTP等协议,
- 而LVS和F5是4层协议,它们和协议无关,几乎所有应用都可以做。
二、四层和七层负载均衡的区别?
技术原理上的区别。
所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,即通过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。
所谓七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
负载均衡设备在这种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立TCP连接。所以从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。
三、常见的几种负载均衡算法
1、轮询法
将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
2、加权轮询法
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
3、随机法
通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,
其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。
4、加权随机法
与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
5、哈希算法
- 普通哈希:源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
- 一致性Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。一致性hash算法就是把每台server分成v个虚拟节点,再把所有虚拟节点(n*v)随机分配到一致性哈希的圆环上,这样所有的用户从自己圆环上的位置顺时针往下取到第一个vnode就是自己所属的节点。当此节点存在故障时,再顺时针取下一个作为替代节点
6、最小连接数法
最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前
积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
7、IP地址散列
通过管理发送方IP和目的地IP地址的散列,将来自同一发送方的分组(或发送至同一目的地的分组)统一转发到相同服务器的算法。当客户端有一系列业务需要处理而必须和一个服务器反复通信时,该算法能够以流(会话)为单位,保证来自相同客户端的通信能够一直在同一服务器中进行处理。8、URL散列
通过管理客户端请求URL信息的散列,将发送至相同URL的请求转发至同一服务器的算法。四、Nginx的5种负载均衡算法
1. 轮询
轮询是默认的方式,每个请求按时间顺序逐一分配到不同的后端服务器上。如果后台服务器上某一台宕机了,它可以自动剔除。
缺点:可靠性低和负载分配不均衡。适用于图片服务器和静态页面服务器集群。
2. 加权轮询(wight)
指定轮询的几率,wight和访问比率成正比,用于后台服务器性能不均匀的情况。
upstream linuxidc{
server 10.0.0.77 weight=5;
server 10.0.0.88 weight=10;
}
3. ip_hash
根据每个请求的ip的hash结果分配,因此每个固定ip能访问到同一个后端服务器,可以解决session问题。
upstream favresin{
ip_hash;
server 10.0.0.10:8080;
server 10.0.0.11:8080;
}
4. fair(第三方)
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream favresin{
server 10.0.0.10:8080;
server 10.0.0.11:8080;
fair;
}
5. url_hash(第三方)
按照访问url的hash结果来分配请求,每个固定的url访问同一个后端服务器。如果后端服务器是缓存时效率高。
upstream resinserver{
server 10.0.0.10:7777;
server 10.0.0.11:8888;
hash $request_uri;
hash_method crc32;
}
例:在upstream中加入hash语句,hash_method是使用的hash算法。
在upstream模块中,可以通过server命令指定后端服务器的IP地址和端口,同时还可以设置每台后端服务器在负载均衡调度中的状态,
upstream参数解析
- upstream可以为每个设备设置状态值
- down:表示当前的server暂时不参与负载
- weight:默认为1,wight越大,负载的权重越大。
- max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误。
- fail_timeout:max_fails此失败后,暂停的时间。
- backup:其他所有非backup机器宕或者忙的时候,请求backup的机器。
示例:
tips:
upstream bakend{ #定义负载均衡设备的Ip及设备状态
ip_hash;
server 192.0.0.1:8090 weight=5 max_fails=3 fail_timeout=20s;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}