1、负载均衡系统构架【摘要】随着计算机网络和 Internet 应用的飞速发展,信息共享日益广泛化,并深入到人们工作和生活的各个领域。人们对信息共享的依赖正逐渐增强。而作为提供信息载体的服务器的压力也越来越大,对于电子商务、信息共享平台急需合理分配访问流量来减少服务器的压力。本文对目前的负载均衡技术进行简单的阐述,并对现有均衡算法进行简单的比较,分析其不足之处。并采用 LVS(Linux 虚拟服务器)实现负载均衡的架构。采用 Keepalived 技术实现负载均衡的高可用性。并对LVS 不同策略上实现的均衡结果进行详细的比较。最终完成对负载均衡系统的构建同时提供了详细的系统搭建步骤,为研究该方向的
2、人员提供可靠的参考资料。 【关键词】负载均衡、LVS、Keepalived、高并发 中图分类号:TN711 文献标识码:A 文章编号: 简介 1.1 背景 目前随着网络技术的迅速崛起,网络信息共享数据越来越大,访问量和数据流量的快速增长,所需的处理能力和运算强度也越来越大,使得单一的服务器设备根本无法承担在此情况下,如果花大量的资金进行硬件方面的升级,会造成大量的资源浪费。并且对于下一次升级来说,将会投入更大的成本,如何才能利用现有资源,在少量的投入下解决该问题? 针对此情况而衍生出来的一种廉价有效透明的方法来扩展现有网络设备和服务器的带宽增加吞吐量加强网络数据处理能力提高网络的灵活性和可用性
3、的技术就是负载均衡(Load Balance)。 1.2 负载均衡技术概述 负载均衡(又称为负载分担) ,英文名称为 Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如 Web 服务器通采用现有主机进行服务器集群,并把访问流量分发到不同的服务器上从而减少对单一服务器的压力。 负载均衡有两方面的含义: 、大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间; 、单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。 对一个网络的负载均衡应用,可以从网络的不
4、同层次入手,具体情况要看对网络瓶颈所在之处的具体分析,网络的负载均衡可以从不同的网络层入手,总体上不外乎从传输链路聚合、采用更高层网络交换技术和设置服务器集群策略三个角度实现。 现有的均衡技术 2.1 局部负载均衡技术 局部负载均衡技术就是对一个服务器群执行两种功能 : 、将对服务器发出的请求根据服务器的负载情况进行分配另外一个是将损坏的服务器的工作做无缝的接替,从而最大程度上确保网站的业务不受影响。 、能够进行无级的扩充,而不要很早就担心将来的容量不够问题。局部负载均衡技术是一项比较成熟的技术,因为负载均衡技术最初就是为了解决局部均衡问题,但是局部负载均衡技术先天不足之处在于无法攻克通往网站
5、最后一段连接。 2.2 全局负载均衡技术 负载均衡技术的近期发展产物是全局负载,它能更有效的解决网站在大范围内的负载均衡问题,同时避免因为大量的流量访问而造成网络阻塞或瘫痪。通常情况下,一个网站采用先全局均衡,然后在局部均衡的逐层均衡方式。所以全局负载均衡具有以下几个特点: 1分布性:全局负载均衡技术解绝的是远距离(地理距离或拓扑距离)上的对象。 2对等性:全局负载均衡技术处理的是具有相同内容的网站的镜像。 2.3 实现负载均衡 的四个方案 目前实现的负载均衡的有四个方案。不论全局或者局部均衡,但其侧重点不同。比如:HTTP 重定向就适合于均不均衡技术。 1、HTTP 重定向基 2、基于 TC
6、P 层 的方法 3、基于 IP 层的方法 4、基于 DNS 的方法 负载均衡 本次研究的负载均衡技术主要是指在均衡服务器群中所有服务器和应用程序之间流量负载的应用,负载均衡技术用于提高 Web 服务器、数据库服务器的高可用性和高可伸缩性。 3.1 负载均衡算法 LVS 集群属于任务级负载均衡集群, 采用集中式任务分配。负载均衡任务的分配是以连接为粒度的,这在一定程度上避免了用户访问的突发性引起的负载不均问题。 LVS 目前支持以下八种调度算法: (1) 轮询算法 (RR):把新的连接请求按顺序轮流分配到不同的服务器上, 从而实现负载均衡。该算法最大的优点在于简单易行,但不适用于每个服务器处理性
7、能不一致的情况。 (2) 加权轮询算法 (WRR) : 克服轮询算法的不足, 用相应的权值表示服务器的处理能力, 权值较大的服务器将被赋予更多的请求。一段时间后, 各服务器处理的请求数趋向于各自权值的比例。 (3) 目的哈希算法 (DH) :以目的地址为关键字查找一个静态 hash表来获得所需的真实服务器。 (4) 源哈希算法 (SH):以源地址为关键字查找一个静态 hash 表来获得所需的真实服务器。 (5) 最小连接算法 (LC):负载均衡器记录各个真实服务器的连接数。当用户请求到达时,负载均衡器把该连接请求分配到当前连接数最小的真实服务器。 (6) 加权最小连接算法(WLC):克服最小连
8、接算法的不足, 用相应的权值表示服务器的处理能力, 将用户的请求分配给当前连接数与权值之比最小的服务器。WLC 是 LVS 缺省的负载分配算法。 (7) 基于位置的最小连接算法(LBLC):根据请求的目标 IP 地址找出该目标 IP 地址最近使用的服务器。若该服务器是可用的且没有超载,将请求发送到该服务器;否则用“最小连接”的原则选出一个可用的服务器,将请求发送到该服务器。 (8) 带复制的基于位置的最小连接算法 (LBLCR):根据请求的目标IP 地址找出该目标 IP 地址对应的服务器组,按“最小连接”原则从该服务器组中选出一台服务器。若服务器没有超载,将请求发送到该服务器;若服务器超载,则
9、按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器,并定期将该集合中负载最大的服务器节点剔除。 由以上分析可知,前四种调度策略属于静态调度算法,而后四种属于动态调度算法, 但它们是以最小连接算法为基础的。 3.2LVS 集群的体系结构 IPVS 软件实现了这三种 IP 负载均衡技术,它们的原理如下: 1、Virtual Server via Network Address Translation(VS/NAT)通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地
10、址被重写,再返回给客户,完成整个负载调度过程。NAT 结构图如图.: 图 3.3.1 NAT 结构 2、Virtual Server via IP Tunneling(VS/TUN)采用 NAT 技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过 IP 隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN 技术后,集群系统的最大吞吐量可以提高 10 倍。TUN 结构图如图.: 图 3.3.2TUN 结构 3、VS/DR
11、(Virtual Server via Direct Routing)通过改写请求报文的 MAC 地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同 VS/TUN 技术一样,VS/DR 技术可极大地 提高集群系统的伸缩性。这种方法没有 IP 隧道的开销,对集群中的真实服务器也没有必须支持 IP 隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。DR 结构图如图. 图 3.3.3DR 结构 负载均衡实现 我们采用了 LVSKeepalived 组合来实现高性能和高可负载的均衡架构。采用了如下图的均衡架构: 图 4.1 软件安装 1、获取 LVS 和 Ke
12、epalived 软件包 #mkdir /usr/local/src/lvs #cd /usr/local/src/lvs #wget http:/www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz #wget http:/www.keepalived.org/software/keepalived-1.1.15.tar.gz 可到官方网站下载最新版本(分别为 ipvsadm-1.25 和 keepalived-1.1.19) 2、安装 LVS 和 Keepalived #lsmod |grep ip_vs /查
13、看内核是否已经安装了 ip_vs,若安装了则不需要再安装 #uname -r 2.6.18-53.el5PAE #ln -s /usr/src/kernels/2.6.18-53.el5PAE-i686/usr/src/linux #tar zxvf ipvsadm-1.24.tar.gz #cd ipvsadm-1.24 #make ; stop) echo “Close Lvs DirectorServer “ ifconfig tunl0 down /sbin/ipvsadm -C ; *) echo “Usage: $0 start|stop“ exit 1 esac 2、配置 Realserver 脚本. #vi /usr/local/sbin/lvs-real-tun.sh /编辑 lvs-real-tun.sh脚本文件,加入如下内容 #!/bin/sh VIP=192.168.25.99 /etc/rc.d/init.d/functions case “$1“ in start) echo “tunl port starting“