负载均衡(Load Balance)是集群技术(Cluster)的一种应用。负载均衡能够将工做任务分摊到多个处理单元,从而提升并发处理能力。目前最多见的负载均衡应用是Web负载均衡。根据实现的原理不一样,常见的web负载均衡技术包括:DNS轮询、IP负载均衡和CDN。其中IP负载均衡可使用硬件设备或软件方式来实现。html
服务器集群(Cluster)使得多个服务器节点可以协同工做,根据目的的不一样,服务器集群能够分为:mysql
高性能集群:将单个重负载的请求分散到多个节点进行处理,最后再将处理结果进行汇总linux
高可用集群:提升冗余单元,避免单点故障nginx
负载均衡集群:将大量的并发请求分担到多个处理节点。因为单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性。git
通常提到的负载均衡(Load Balance),是指实现负载均衡集群。负载均衡实现了横向扩展(Scale Out),避免纵向的升级(Scale Up)换代。github
本文中的web负载均衡,特指可以分担web请求(http,https等)的负载均衡技术。web
任何的负载均衡技术都要想办法创建某种一对多的映射机制:一个请求的入口映射到多个处理请求的节点,从而实现分而治之(Divide and Conquer)。算法
这种映射机制使得多个物理存在对外体现为一个虚拟的总体,对服务的请求者屏蔽了内部的结构。sql
采用不一样的机制创建映射关系,能够造成不一样的负载均衡技术,常见的包括:后端
DNS轮询
CDN
IP负载均衡
DNS轮询是最简单的负载均衡方式。以域名做为访问入口,经过配置多条DNS A记录使得请求能够分配到不一样的服务器。
DNS轮询没有快速的健康检查机制,并且只支持WRR的调度策略致使负载很难“均衡”,一般用于要求不高的场景。而且DNS轮询方式直接将服务器的真实地址暴露给用户,不利于服务器安全。
CDN(Content Delivery Network,内容分发网络)。经过发布机制将内容同步到大量的缓存节点,并在DNS服务器上进行扩展,找到里用户最近的缓存节点做为服务提供节点。
由于很难自建大量的缓存节点,因此一般使用CDN运营商的服务。目前国内的服务商不多,并且按流量计费,价格也比较昂贵。
IP负载均衡是基于特定的TCP/IP技术实现的负载均衡。好比NAT、DR、Turning等。是最常用的方式。关于其原理,能够参考下面另外一篇文章:lvs中的负载均衡方式。
IP负载均衡可使用硬件设备,也可使用软件实现。硬件设备的主要产品是F5-BIG-IP-GTM(简称F5),软件产品主要有LVS、HAProxy、NginX。其中LVS、HAProxy能够工做在4-7层,NginX工做在7层。关于三者的简单对比,能够参考这里。
硬件负载均衡设备能够将核心部分作成芯片,性能和稳定性更好,并且商用产品的可管理性、文档和服务都比较好。惟一的问题就是价格。
软件负载均衡一般是开源软件。自由度较高,但学习成本和管理成本会比较大。
F5的全称是F5-BIG-IP-GTM,是最流行的硬件负载均衡设备,其并发能力达到百万级。F5的主要特性包括:
多链路的负载均衡和冗余
能够接入多条ISP链路,在链路之间实现负载均衡和高可用。
防火墙负载均衡
F5具备异构防火墙的负载均衡与故障自动排除能力。
服务器负载均衡
这是F5最主要的功能,F5能够配置针对全部的对外提供服务的服务器配置Virtual Server实现负载均衡、健康检查、回话保持等。
高可用
F5设备自身的冗余设计可以保证99.999%的正常运行时间,双机F5的故障切换时间为毫秒级。
使用F5能够配置整个集群的链路冗余和服务器冗余,提升可靠的健康检查机制,以保证高可用。
安全性
与防火墙相似,F5采用缺省拒绝策略,能够为任何站点增长额外的安全保护,防护普通网络***,包括DDoS、IP欺骗、SYN***、teartop和land***、ICMP***等。
易于管理
F5提供HTTPS、SSH、Telnet、SNMP等多种管理方式,包含详尽的实时报告和历史纪录报告。同时还提供二次开发包(i-Control)。
其余
F5还提供了SSL加速、软件升级、IP地址过滤、带宽控制等辅助功能。
LVS(Linux Virtual Server, Linux虚拟服务器),是章文嵩博士开发的开放软件,目前已经集成到Linux内核中。
基于不一样的网络技术,LVS支持多种负载均衡机制。包括:VS/NAT(基于网络地址转换技术)、VS/TUN(基于IP隧道技术)和VS/DR(基于直接路由技术)。
此外,为了适应不一样的须要,淘宝开发了VS/FULLNAT,从本质上来讲也是基于网络地址转换技术。最近还有一个基于VS/FULLNAT的DNAT模块。
无论使用哪一种机制,LVS都不直接处理请求,而是将请求转发到后面真正的服务器(Real Server)。不一样的机制,决定了响应包如何返回到客户端。
NAT(Network Address Translation,网络地址转换)也叫作网络掩蔽或者IP掩蔽,是将IP 数据包头中的IP 地址转换为另外一个IP 地址的过程。
NAT可以将私有(保留)地址转化为合法IP地址,一般用于一个公共IP地址和多个内部私有IP地址直接的映射,普遍应用于各类类型Internet接入方式和各类类型的网络中。
经过使用NAT将目的地址转换到多个服务器的方式,能够实现负载均衡,同时可以隐藏并保护内部服务器,避免来自网络外部的***。商用负载均衡设备如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector都是基于NAT方法。
VS/NAT(Virtual Server via Network Address Translation)是基于NAT技术实现负载均衡的方法。其架构以下图所示:
客户经过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器
调度器根据链接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。
真实的服务器处理请求,并将响应报文发到调度器。
调度器将报文的源地址和源端口改成Virtual IP Address和相应的端口
调度器将修改过的报文发给用户
在VS/NAT的集群系统中,请求和响应的数据报文都须要经过负载调度器,当真实服务器的数目在10台和20台之间时,负载调度器将成为整个集群系统的新瓶颈。大多数Internet服务都有这样的特色:请求报文较短而响应报文每每包含大量的数据。若是能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直接返回给客户,将极大地提升整个集群系统的吞吐量。好比IP隧道技术。
IP Tunneling(IP隧道)技术,又称为IP封装技术(IP encapsulation),是一种在网络之间传递数据的方式。能够将一个IP报文封装到另外一个IP报文(多是不一样的协议)中,并转发到另外一个IP地址。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态创建的,隧道一端有一个IP地址,另外一端也有惟一的IP地址。
VS/TUN(Virtual Server via IP Tunneling)是基于隧道技术实现负载均衡的方法。其架构以下图所示:
VS/TUN与VS/NAT的工做机制大致上相同,区别在于:
调度器转发报文的时候进行了协议的二次封装,真实的服务器接收到请求后先进行解包。过程以下图所示:
响应报文从后端服务器直接返回给客户,不须要通过调度器。
DR(Direct Routing, 直接路由), 路由器学习路由的方法之一。路由器对于本身的网络接口所直连的网络之间的通讯,能够自动维护路由表,并且不须要进行路由计算。
直接路由一般用在一个三层交换机链接几个VLAN的状况,只要设置直接路由VLAN之间就能够通讯,不须要设置其余的路由方式。
VS/DR(Virtual Server via Direct Routing)是基于直接路由实现负载均衡的方法。其架构以下图所示:
跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特色,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,能够极大地提升整个集群系统的吞吐量。
VS/DR要求调度器和服务器组都必须在物理上有一个网卡经过不分段的局域网相连,即经过交换机或者高速的HUB相连,中间没有隔有路由器。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;全部的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。
VS/DR的整个过程与VS/TUN很是相似,不一样之处在于调度器不对请求包进行二次封装,只是将目标MAC地址更改成通过调度算法选出的目标服务器的MAC地址。以下图:
优势
对后端服务器的操做系统无要求
只须要一个IP地址配置在调度器上,服务器组能够用私有的IP地址。
支持端口映射
缺点
请求和响应报文都须要经过调度器,伸缩能力有限(10+)
要求服务器和调度器在同一个VLAN
须要将服务器的默认网关指向调度器
对于那些将IP地址或者端口号在报文数据中传送的网络服务,须要编写相应的应用模块来转换报文数据中的IP地址或者端口号
优势
不须要调度应答报文,性能高
服务器和调度器能够不在同一个VLAN
支持广域负载均衡
缺点
全部的服务器必须支持“IP Tunneling”协议,要安装内核模块(好比IPIP等),配置复杂
有创建IP隧道的开销
服务器上直接绑定虚拟IP(Virtaul IP),风险很大
服务器须要联通外网
不支持端口映射
优势
与VS/TUN相比,没有IP隧道的开销,性能最好
缺点
要求调度器与服务器都有一块网卡连在同一物理网段(同一个VLAN)上
要求服务器网络设备(或者设备别名)不做ARP响应,或者能将报文重定向(Redirect)到本地的Socket端口上
服务器上直接绑定虚拟IP(Virtaul IP),风险很大
不支持端口映射
如上节所述,前面三种传统的负载均衡机制各自存在一些不足。
VS/FULLNAT是为了解决这些不足而新开发的一种转发模式。VS/FULLNAT的特色是:
调度器和服务器能够跨VLAN通讯,不须要配置在同一个网段
请求和应答报文都通过调度器,服务器不须要绑定虚拟IP
VS/FULLNAT这两个特色能够简化网络拓扑,下降运维成本和风险。
若是人少钱多,不在意性能的损耗愿意多买服务器,同时但愿最大程度较少运维的工做量,能够选择FULLNAT
很大众的方式是用DR,没有太多的优势但也没有太多的缺点
若是要搞广域网负载均衡,那就用TUN吧
我的感受NAT不是为了互联网用的。小并发的实验性应用或者用在非web场合,好比mysql集群等。固然,若是须要端口映射,必须使用NAT方式