本文是负载均衡详解的第四篇,主要介绍了LVS的三种请求转发模式和八种负载均衡算法,以及Haproxy的特色和负载均衡算法。具体参考文章,详见最后的连接。html
LVS是一个开源的软件,由毕业于国防科技大学的章文嵩博士于1998年5月创立,用来实现Linux平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。前端
基于IP层的负载均衡调度技术,它在操做系统核心层上,未来自IP层的TCP/UDP请求均衡地转移到不一样的 服务器,从而将一组服务器构成一个高性能、高可用的虚拟服务器。linux
操做系统:Liunxnginx
开发语言:Cweb
并发性能:默认4096,能够修改但须要从新编译。算法
LVS的主要功能是实现IP层(网络层)负载均衡,有NAT,TUN,DR三种请求转发模式。sql
NAT是指Network Address Translation,它的转发流程是:Director机器收到外界请求,改写数据包的目标地址,按相应的调度算法将其发送到相应Real Server上,Real Server处理完该请求后,将结果数据包返回到其默认网关,即Director机器上,Director机器再改写数据包的源地址,最后将其返回给外界。这样就完成一次负载调度。windows
构架一个最简单的LVS/NAT方式的负载均衡集群Real Server能够是任何的操做系统,并且无需作任何特殊的设定,唯一要作的就是将其默认网关指向Director机器。Real Server可使用局域网的内部IP(192.168.0.0/24)。Director要有两块网卡,一块网卡绑定一个外部IP地址 (10.0.0.1),另外一块网卡绑定局域网的内部IP(192.168.0.254),做为Real Server的默认网关。后端
LVS/NAT方式实现起来最为简单,并且Real Server使用的是内部IP,能够节省Real IP的开销。但由于执行NAT须要重写流经Director的数据包,在速度上有必定延迟;安全
当用户的请求很是短,而服务器的回应很是大的状况下,会对Director造成很大压力,成为新的瓶颈,从而使整个系统的性能受到限制。
TUN是指IP Tunneling,它的转发流程是:Director机器收到外界请求,按相应的调度算法,经过IP隧道发送到相应Real Server,Real Server处理完该请求后,将结果数据包直接返回给客户。至此完成一次负载调度。
最简单的LVS/TUN方式的负载均衡集群架构使用IP Tunneling技术,在Director机器和Real Server机器之间架设一个IP Tunnel,经过IP Tunnel将负载分配到Real Server机器上。Director和Real Server之间的关系比较松散,能够是在同一个网络中,也能够是在不一样的网络中,只要二者可以经过IP Tunnel相连就行。收到负载分配的Real Server机器处理完后会直接将反馈数据送回给客户,而没必要经过Director机器。实际应用中,服务器必须拥有正式的IP地址用于与客户机直接通讯,而且全部服务器必须支持IP隧道协议。
该方式中Director将客户请求分配到不一样的Real Server,Real Server处理请求后直接回应给用户,这样Director就只处理客户机与服务器的一半链接,极大地提升了Director的调度处理能力,使集群系统能容纳更多的节点数。另外TUN方式中的Real Server能够在任何LAN或WAN上运行,这样能够构筑跨地域的集群,其应对灾难的能力也更强,可是服务器须要为IP封装付出必定的资源开销,并且后端的Real Server必须是支持IP Tunneling的操做系统。
DR是指Direct Routing,它的转发流程是:Director机器收到外界请求,按相应的调度算法将其直接发送到相应Real Server,Real Server处理完该请求后,将结果数据包直接返回给客户,完成一次负载调度。
构架一个最简单的LVS/DR方式的负载均衡集群Real Server和Director都在同一个物理网段中,Director的网卡IP是192.168.0.253,再绑定另外一个IP: 192.168.0.254做为对外界的virtual IP,外界客户经过该IP来访问整个集群系统。Real Server在lo上绑定IP:192.168.0.254,同时加入相应的路由。
LVS/DR方式与前面的LVS/TUN方式有些相似,前台的Director机器也是只须要接收和调度外界的请求,而不须要负责返回这些请求的反馈结果,因此可以负载更多的Real Server,提升Director的调度处理能力,使集群系统容纳更多的Real Server。但LVS/DR须要改写请求报文的MAC地址,因此全部服务器必须在同一物理网段内。
LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层(Loader Balancer),中间的服务器群组层,用Server Array表示,最底层的数据共享存储层,用Shared Storage表示。在用户看来全部的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
LVS的体系架构如图:
LVS的各个层次的详细介绍:
Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要做用相似于一个路由器,它含有完成LVS功能所设定的路由表,经过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康情况。在Real Server不可用时把它从LVS路由表中剔除,恢复时从新加入。
Server Array层:由一组实际运行应用服务的机器组成,Real Server能够是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每一个Real Server之间经过高速的LAN或分布在各地的WAN相链接。在实际的应用中,Director Server也能够同时兼任Real Server的角色。
Shared Storage层:是为全部Real Server提供共享存储空间和内容一致性的存储区域,在物理上,通常有磁盘阵列设备组成,为了提供内容的一致性,通常能够经过NFS网络文件系统共享数 据,可是NFS在繁忙的业务系统中,性能并非很好,此时能够采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
从整个LVS结构能够看出,Director Server是整个LVS的核心,目前,用于Director Server的操做系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就能够支持LVS功能,而FreeBSD做为 Director Server的应用还不是不少,性能也不是很好。对于Real Server,几乎能够是全部的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
LVS默认支持八种负载均衡策略,简述以下:
调度器经过“轮询”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而无论服务器上实际的链接数和系统负载。
调度器经过“加权轮询”调度算法根据真实服务器的不一样处理能力来调度访问请求。这样能够保证处理能力强的服务器能处理更多的访问流量。调度器能够自动问询真实服务器的负载状况,并动态地调整其权值。
调度器经过“最少链接”调度算法动态地将网络请求调度到已创建的连接数最少的服务器上。若是集群系统的真实服务器具备相近的系统性能,采用“最小链接”调度算法能够较好地均衡负载。
在集群系统中的服务器性能差别较大的状况下,调度器采用“加权最少连接”调度算法优化负载均衡性能,具备较高权值的服务器将承受较大比例的活动链接负载。调度器能够自动问询真实服务器的负载状况,并动态地调整其权值。
“基于局部性的最少连接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工做负载,则用“最少连接” 的原则选出一个可用的服务器,将请求发送到该服务器。
“带复制的基于局部性最少连接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不一样之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小链接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小链接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以下降复制的程度。
“目标地址散列”调度算法根据请求的目标IP地址,做为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,不然返回空。
“源地址散列”调度算法根据请求的源IP地址,做为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,不然返回空。
除具有以上负载均衡算法外,还能够自定义均衡策略。
通常做为入口负载均衡或内部负载均衡,结合反向代理服务器使用。相关架构可参考Ngnix场景架构。
HAProxy也是使用较多的一款负载均衡软件。HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,是免费、快速而且可靠的一种解决方案。特别适用于那些负载特大的web站点。运行模式使得它能够很简单安全的整合到当前的架构中,同时能够保护你的web服务器不被暴露到网络上。
支持四种经常使用算法:
1.roundrobin:轮询,轮流分配到后端服务器;
2.static-rr:根据后端服务器性能分配;
3.leastconn:最小链接者优先处理;
4.source:根据请求源IP,与Nginx的IP_Hash相似。
以上是本周的分享,从主要讲解了软件负载均衡的应用背景,Ngnix负载均衡,LVS负载均衡,Haproxy负载均衡。
由于时间关系,有些讲解的不细致,你们能够问下度娘/Google,但愿本次分享对你们有帮助。
参考资料:
Nginx负载均衡实现原理图解 http://www.server110.com/nginx/201403/7225.html
Nginx架构及其web服务搭建优化配置详解
http://linux.it.net.cn/e/server/nginx/2015/0102/11183.html
Ngnix双主场景:http://network.51cto.com/art/201109/288597.htm
用LVS构架负载均衡Linux集群系统 linux lvs
http://blog.chinaunix.net/uid-45094-id-3012037.html
LVS基本介绍
http://os.51cto.com/art/201202/317108.htm
下次分享时间:下下周12月9日 晚7点30~~8点30见。《大型网站架构系列:分布式消息队列技术》