负载均衡的⼏种类型
负载均衡,就是将请求分发到不同服务器上去响应,让每个服务器的负载达到均衡的状态。现在负载均衡是每个在线应⽤不可缺少的环节,所以我们需要了解⼀下负载均衡的模型和类型,当然在实际解决问题时模型会变的很复杂。本⽂只讨论软件⽅案,并不涉及硬件。⽂末会有⼀点点⼩⼲货,是我在新浪课堂上听的⼀点知识,关于新浪负载均衡的演进和使⽤。
⼀、负载均衡
负载均衡的⽬的就是让请求到达不同的服务器上。⼀次请求到服务器之间,有那么多环节,因此可以实现的⽅法有很多种,实际应⽤中不外乎以下⼏种⽅式。
1.HTTP重定向负载均衡
HTTP重定向负载均衡有⼀台重定向服务器,它也是⼀台普通的服务器,其唯⼀的功能就是根据⽤户的HTTP请求计算⼀台应⽤集中服务器的地址,并将此地址写⼊HTTP重定向响应中返回给⽤户。
这种⽅案实现起来⾮常简单,但是需要浏览器请求两次服务器才能完成。并且重定向服务器很容易编程瓶颈,因为⼀次重定向返回的过程,也是⼀次标准HTTP请求,如果集内有10台机器,那HTTP重定向服务器的流量将是应⽤服务器的10倍,如果有100台估计就要宕机了,所以伸缩性能受到了很⼤的限制。还有
使⽤302响应码重定向,不利于⽹站的SEO。
2.DNS域名解析负载均衡
这是利⽤DNS处理域名解析请求的同时进⾏负载均衡处理的⼀种⽅案。在DNS中配置多个A记录,每次域名解析请求都会根据负载均衡算法计算⼀个不同的IP地址返回。
DNS域名解析负载均衡的优点是将负载均衡的⼯作转交给DNS,省掉了⽹站管理维护负载均衡服务器的⿇烦,同时还可以使⽤智能DNS可以基于地理位置或者ISP来做域名解析,⽤户将会得到距离最近或者速度最快的⼀个服务器地址,这样可以加快⽤户的访问速度,改善性能。
但是这种⽅法也有很⼤的缺点,DNS是多级解析,每⼀级都会缓存DNS记录,如果某个服务器变动了,DNS记录更新的时间将会很长,这个速度取决于域名服务商。
⼀般⼤型⽹站都会使⽤DNS域名解析,利⽤域名解析作为⼀级负载均衡⼿段。你可以使⽤ dig <;域名> 的⽅法查看某个域名的A记录,你会发现很多⽹站会有多条A记录。
3.反向代理负载均衡
这种⽅法就是使⽤反向代理服务器,它⼀般在web服务器前⾯,这个位置也正好是负载均衡服务器的位置,所以⼤多数反向代理服务器同时也提供负载均衡的功能。
负载均衡服务器有哪些
由于web服务器不直接对外提供访问,因此web服务器不需要使⽤外部IP,⽽反向代理服务器则需要配置双⽹卡和内部外部两套IP地址。
反向代理服务器转发请求是在HTTP协议层⾯,因此也叫应⽤层负载均衡,由于应⽤层在七层⽹络模型中的第七层,所以⼀般也称为七层负载均衡。优点就是和反向代理功服务器功能集成在⼀起,部署简单。缺点是反向代理服务器是所有请求和响应的中转站,其性能可能会成为瓶颈。
4.⽹络层负载均衡
这种⽅法是在⽹络层通过修改请求⽬标地址进⾏负载均衡,⽹络层在七层⽹络层模型的第四层,所以也叫做四层负载均衡,也叫做IP层负载均衡。
请求达到负载均衡服务器后,由负载均衡服务器在操作系统内核进程获取⽹络数据包,根据负载均衡算法得到⼀台真实web服务器的地址,然后修改请求的⽬的地址到这台真实的web服务器地址,等到web服务器处理完成后,响应数据包回到负载均衡服务器,再将数据包源地址修改为⾃⾝的IP(负载均衡服务器的IP)地址发送给⽤户浏览器
这⾥关键在于真实⽆⼒web服务器响应数据包如何返回给负载均衡服务器。⼀种是源地址转换(SNAT),第⼆种是负载均衡服务器作为⽹关服务器。
⽹络层的负载均衡在内核进程完成数据转发,有更好的性能。但是由于响应请求的流量要经过负载均衡服务器,容易成为瓶颈。
5.数据链路层负载均衡
数据链路层主要处理 mac 地址,所以使⽤修改mac地址进⾏转发请求。负载均衡数据分发过程中不修改IP地址,只修改mac地址,通过配置真实物理服务器集所有机器虚拟IP和负载均衡服务器IP地址⼀致,从⽽达到不修改数据包的源地址和⽬的地址就可以进⾏数据分发的⽬的。由于web服务器的服务器地址IP和数据请求⽬的IP地址⼀致,不需要通过负载均衡服务器进⾏地址转换,可将相应数据包直接返回⽤户。如果有⾜够的公有IP,其实web服务器也可以直接使⽤⾃⼰的IP响应请求,不过这样web服务器必须绑定负载均衡的虚拟IP地址(VIP),才能保证web服务器收到来⾃负载均衡发送的数据包。
这种⽅式称作三⾓传输模式,单臂模式,也叫做直接路由⽅式(DR)。使⽤DR⽅式的链路层负载均衡是⽬前⼤型⽹站使⽤最⼴的⼀种负载均衡⼿段。
⼆、关于负载均衡演进
⼀个应⽤的流量从多到少,负载均衡的演进基本都是⼀个套路,新浪也不例外(以下内容有修改),⼤致打演进过程如下:
1. nginx做反向代理的同时也做七层负载均衡。
2. 使⽤四层的代理负载均衡,并使⽤主备,⼀般使⽤HAproxy或者LVS
3. 使⽤单臂模式加七层代理集,⼀般是LVS(DR模式)主备+HAproxy集(七层负载均衡)
Nginx 做负载均衡是⾮常⽅便的,如果⼀个机器满⾜不了需求了,可以直接做⼀个反向代理加上负载均衡。四层的代理负载均衡⽐七层负载均衡性能好很多,集规模可以迅速扩⼤,并且可以细分服务。当公司的规模很⼤的时候,有多个机房、多个⼤型服务时,LVS(单
臂)+HAproxy(七层)就更适合了,如下图所⽰(⽹上盗了⼀张图):
最近我听了⼀节新浪有关负载均衡的讲座,其实是⼀个简短的课程。新浪的演进过程和上⾯三个步骤很像,没有太多的差异。⽬前⼤多数服务正在使⽤2和3的模式,将来需要全量SSL加密,所以新浪准备在LVS层上加⼀个SSL加解密集。请求进LVS的443端⼝,之后被转发到SSL集中进⾏解密,再回到LVS下接HAproxy的80端⼝,做七层负载均衡。这样可以收紧证书,也可以将服务的⼊⼝统⼀,虽然在性能上
可能会有很⼤的挑战。负载均衡未来的发展可能将会是四层代理+ospf集模式,每⼀层都是代理。
三、总结
现在使⽤的负载均衡⽆外乎这⼏种⽅式,或者⼏种⽅式的组合。我相信很多⼤⼚能⽤这种模式解决⾼并发⾼性能的问题,很多其他服务也是没有问题的。这篇⽂章只是负载均衡的基础知识,并没有涉及到太多的应⽤,LVS、HAproxy、Nginx等在使⽤中还有很多细节的区别,但都是以上模型。关于这三个软件的负载均衡,如果以后使⽤到了会再讨论。