## 什么是负载均衡高可用 ##
- 负载均衡
负载均衡建立在现有的网络架构之上,它提供了一种廉价、有效、透明的方法来扩大网络设备和服务器的带宽、吞吐量、加强网络数据处理能力,以及提高网络的灵活可用性。 - 高可用
广义的高可用就是要保证整个系统不会因为某一台主机的故障而出现停止服务的现象。
负载均衡高可用常用设备和软件
- 硬件:
目前线上常用的负载均衡硬件有F5 BIG-IP和citrix netscaler
DRBD作为一种高可用的块设备也很常见
F5 BIG-IP用作HTTP负载均衡器的主要功能:
- 提供12中灵活的负载均衡算法将所有流量均衡的分配到各个服务器,不直接对用户表现出来
- 可以确认后端服务器能否针对相请求返回相应的数据。就是它可以识别故障服务器然后不会将用户请求转发给它,然后可以自动检测出维修好故障之后的机器然后恢复对其的用户请求传送。
- 软件:
负载均衡软件有LVS、nginx、HaProxy
高可用软件有heartbeat、keepalived - 成熟的Linux集群架构
LVS+keepalived、nginx+keepalived、DRBD+heartbeat
LVS架构
LVS是一个负载均衡高可用的集群架构。它建立在一个主控的双机服务器和若干台真实服务器(real-server)上,它采用IP负载均衡技术和基于内容请求分发技术。主控服务器只负责调度real-server不处理具体的数据处理。而且LVS对外是透明的,也就是说外面的用户看来,LVS只是一台服务器,因为用户只需要访问我们的虚拟IP就可以了。
其架构示意图如下所示,被分为三层:
- 第一层:负载调度器(load balancer/ Director),它是整个集群对外面的前端机,也是集群系统唯一的入口点。负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。采用IP负载均衡技术和基于内容的请求分发技术
- 第二层: 服务器池(server pool/ Realserver),是一组真正执行客户请求的服务器,执行的服务一般有WEB、MAIL、FTP和DNS等。
- 第三层:共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。(小集群采用NFS/CIFS等网络文件系统,大集群就要采用AFS/GFS/code/Intermezo等分布式文件系统)
- IP负载均衡技术:保证服务器池拥有相同的内容并且提供相同的服务。也就是说当用户的请求到达时,调度器必须根据服务器池现有的负载情况和设定的调度算法选出一台服务器,将请求转发给他,并记录下来,当该请求再次送达时,要保证依旧会转发到该服务器上。(三种)
- 基于内容的请求转发技术:服务器可以根据不同的服务,当用户请求到达时,调度器可以根据请求内容选择不同的服务器。
调度器、real-server、共享存储系统之间必须由高速网络相连接,这样才能避免网络速度称为整个集群的瓶颈。
当不同的应用程序访问分布式文件系统上的同一资源的时候必须要解决掉不同应用程序之间的访问冲突。所以需要一个分布式锁管理器来保证应用程序在不同节点之间并发访问的一致性。
LVS的三种转发方式
LVS的三种转发方式就是IP负载均衡技术的三种转发方式,这三种转发方式分别为:
- VS/NAT 通过NAT实现
- VS/TUN 通过IP隧道实现
- VS/DR 通过直接路由实现
一. Virtual Server via Network Address Translation NAT(VS/NAT)
VS/NAT是一种最简单的方式,服务器与调度器之间通过switch/hub相连。所有的RealServer只需要将自己的网关指向Director即可。客户端可以是任意操作系统,但此方式下,一个Director能够带动的RealServer比较有限。在VS/NAT的方式下,Director也可以兼为一台RealServer。VS/NAT系统中请求和响应都要通过调度器。VS/NAT的体系结构如图所示。
二、Virtual Server via IP Tunneling(VS/TUN)
IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。
调度器根据各个服务器的负载情况,动态地选择一台服务器,将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为 VIP 的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。
三、 Virtual Server via Direct Routing(VS/DR)
VS/DR方式是通过改写请求数据帧中的MAC地址部分来实现的,报文直接路由给目标服务器。所以Director和RealServer必需在物理上有一个网卡通过不间断的局域网相连。 RealServer上绑定的VIP配置在各自Non-ARP的网络设备上(如lo或tunl),Director的VIP地址对外可见,而RealServer的VIP对外是不可见的。RealServer的地址即可以是内部地址,也可以是真实地址。
3种转发方式的优缺点比较
- Virtual Server via NAT
VS/NAT 的优点是服务器可以运行任何支持TCP/IP的操作系统,它只需要一个IP地址配置在调度器上,服务器组可以用私有的IP地址。缺点是它的伸缩能力有限,当服务器结点数目升到20时,调度器本身有可能成为系统的新瓶颈,因为在VS/NAT中请求和响应报文都需要通过负载调度器。我们在Pentium166 处理器的主机上测得重写报文的平均延时为60us,性能更高的处理器上延时会短一些。假设TCP报文的平均长度为536 Bytes,则调度器的最大吞吐量为8.93 MBytes/s. 我们再假设每台服务器的吞吐量为800KBytes/s,这样一个调度器可以带动10台服务器。(注:这是很早以前测得的数据)
基于 VS/NAT的的集群系统可以适合许多服务器的性能要求。如果负载调度器成为系统新的瓶颈,可以有三种方法解决这个问题:混合方法、VS/TUN和 VS/DR。在DNS混合集群系统中,有若干个VS/NAT负调度器,每个负载调度器带自己的服务器集群,同时这些负载调度器又通过RR-DNS组成简单的域名。
但VS/TUN和VS/DR是提高系统吞吐量的更好方法。
对于那些将IP地址或者端口号在报文数据中传送的网络服务,需要编写相应的应用模块来转换报文数据中的IP地址或者端口号。这会带来实现的工作量,同时应用模块检查报文的开销会降低系统的吞吐率。 - Virtual Server via IP Tunneling
在VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有100Mbps的全双工网卡,整个系统的最大吞吐量可超过 1Gbps。所以,VS/TUN可以极大地增加负载调度器调度的服务器数量。VS/TUN调度器可以调度上百台服务器,而它本身不会成为系统的瓶颈,可以用来构建高性能的超级服务器。
- VS/TUN技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。目前,VS/TUN的后端服务器主要运行Linux操作系统,我们没对其他操作系统进行测试。因为“IP Tunneling”正成为各个操作系统的标准协议,所以VS/TUN应该会适用运行其他操作系统的后端服务器。
- Virtual Server via Direct Routing
跟VS/TUN方法一样,VS/DR调度器只处理客户到服务器端的连接,响应数据可以直接从独立的网络路由返回给客户。这可以极大地提高LVS集群系统的伸缩性。跟VS/TUN相比,这种方法没有IP隧道的开销,但是要求负载调度器与实际服务器都有一块网卡连在同一物理网段上,服务器网络设备(或者设备别名)不作ARP响应,或者能将报文重定向(Redirect)到本地的Socket端口上。
- DR转发方式效率是最高的,推荐大家使用这种方法。
IPVS的调度算法介绍
IPVS作为LVS集群的IP负载均衡软件,其各种连接调度算法都是在内核中实现的。
针对请求的服务时间变化很大,所以IPVS会给出一个动态反馈负载均衡算法,它结合内核中的加权连接调度算法,根据动态反馈回来的负载信息来调整服务器的权值,来进一步避免服务器间的负载不平衡。
我们称客户的socket和服务器的socket之间的数据通讯为连接,IPVS在内核中的负载均衡调度是以连接为粒度的。在HTTP协议(非持久)中,每个对象从WEB服务器上获取都需要建立一个TCP连接,同一用户 的不同请求会被调度到不同的服务器上,所以这种细粒度的调度在一定程度上可以避免单个用户访问的突发性引起服务器间的负载不平衡。
- 轮叫调度
调度器不管real-server的实际连接数和负载而是直接将外部请求按照顺序轮流分配到real-server上。
轮叫调度算法:
虽然Round-Robin DNS方法也是以轮叫调度的方式将一个域名解析到多个IP地址,但轮叫DNS方法的调度粒度是基于每个域名服务器的,域名服务器对域名解析的缓存会妨碍轮 叫解析域名生效,这会导致服务器间负载的严重不平衡。这里,IPVS轮叫调度算法的粒度是基于每个连接的,同一用户的不同连接都会被调度到不同的服务器 上,所以这种细粒度的轮叫调度要比DNS的轮叫调度优越很多。
- 加权轮叫
调度器可以自动询问real-server的负载情况并动态更改其权值,并且根据real-server的不同处理能力来选择以保证处理能力强的服务器能处理更多请求。
加权轮叫算法: - 最少连接
调度器动态的将请求转发到连接数最少的real-server上
最小连接算法: - 加权最少连接
当集群中的服务器处理能力差异较大的时候,可以采用此算法,具有较强处理能力的服务器将承担较大比例的请求连接。调度器也可以根据real-server的连接数动态的修改其权值。
加权最小连接算法: - 基于局部的最少连接(LBLC)
该算法是基于目标ip地址的负载均衡算法,目前主要用于cache集群系统。
调度器根据请求的目标地址ip选择出该ip最近使用过的服务器,若该服务器不存在或已超载则采用“最少连接算法”选取其他服务器。
LBLC算法: - 带复制的基于局部性的最小连接(LBLCR)
该算法也是基于目标ip地址的负载均衡。
该算法与“基于局部的最小连接”算法的不同之处是它维护的是目标ip到一个服务器组的映射,而LBLC维护的是目标ip到单个服务器的映射。
该算法根据请求的目标ip地址选择该ip所对应的服务器组,按“最小连接”从该组中选取一台服务器来处理请求,若选出的这台server超载则从整个集群中按照“最小连接”重新选择一台server。
LBLCR调度算法流程: - 目标地址散列
该算法将请求的目标ip作为散列键(hash key),从静态分配的散列表里找出对应的服务器,若该服务器可用,将请求发送,若不可用则返回空。
目标地址散列算法: - 在实现时,我们采用素数乘法Hash函数,通过乘以素数使得散列键值尽可能地达到较均匀的分布。所采用的素数乘法Hash函数如下:
- 源地址散列
该算法维护的是基于请求的源ip的负载均衡,将源ip作为散列键。
在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。
感谢以下资料为本文提供的参考价值:
LVS项目中文文档http://www.linuxvirtualserver.org/zh/
余洪春先生的《构建高可用Linux服务器》