负载均衡,就是将请求分发到不一样服务器上去响应,让每一个服务器的负载达到均衡的状态。如今负载均衡是每一个在线应用不可缺乏的环节,因此咱们须要了解一下负载均衡的模型和类型,固然在实际解决问题时模型会变的很复杂。本文只讨论软件方案,并不涉及硬件。文末会有一点点小干货,是我在新浪课堂上听的一点知识,关于新浪负载均衡的演进和使用。nginx
1、负载均衡
负载均衡的目的就是让请求到达不一样的服务器上。一次请求到服务器之间,有那么多环节,所以能够实现的方法有不少种,实际应用中不外乎如下几种方式。web
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方式的链路层负载均衡是目前大型网站使用最广的一种负载均衡手段。
2、关于负载均衡演进
一个应用的流量从多到少,负载均衡的演进基本都是一个套路,新浪也不例外(如下内容有修改),大体打演进过程以下:
- nginx作反向代理的同时也作七层负载均衡。
- 使用四层的代理负载均衡,并使用主备,通常使用HAproxy或者LVS
- 使用单臂模式加七层代理集群,通常是LVS(DR模式)主备+HAproxy集群(七层负载均衡)
Nginx 作负载均衡是很是方便的,若是一个机器知足不了需求了,能够直接作一个反向代理加上负载均衡。四层的代理负载均衡比七层负载均衡性能好不少,集群规模能够迅速扩大,而且能够细分服务。当公司的规模很大的时候,有多个机房、多个大型服务时,LVS(单臂)+HAproxy(七层)就更适合了,以下图所示(网上盗了一张图):
最近我听了一节新浪有关负载均衡的讲座,实际上是一个简短的课程。新浪的演进过程和上面三个步骤很像,没有太多的差别。目前大多数服务正在使用2和3的模式,未来须要全量SSL加密,因此新浪准备在LVS层上加一个SSL加解密集群。请求进LVS的443端口,以后被转发到SSL集群中进行解密,再回到LVS下接HAproxy的80端口,作七层负载均衡。这样能够收紧证书,也能够将服务的入口统一,虽然在性能上可能会有很大的挑战。负载均衡将来的发展可能将会是四层代理+ospf集群模式,每一层都是代理。
3、总结
如今使用的负载均衡无外乎这几种方式,或者几种方式的组合。我相信不少大厂能用这种模式解决高并发高性能的问题,不少其余服务也是没有问题的。这篇文章只是负载均衡的基础知识,并无涉及到太多的应用,LVS、HAproxy、Nginx等在使用中还有不少细节的区别,但都是以上模型。关于这三个软件的负载均衡,若是之后使用到了会再讨论。