您的位置:首页 >使用权限 > 正文
发布时间:2020-04-11 16:45
基于LinuxLVS负载均衡HTTP代理集群的设计与实现

  利用因特网的代理服务器技术可以解决目前因特网的IP地址耗尽、网络资源争用以及网络安全等问题.代理服务器是采取一种代理的机制,即内部的客户端必须经过代理服务器才能和外部的服务器端进行通信,而外部的任何一台主机只能访问到代理服务器,代理服务器就成为进入Internet的惟一通道,对于In ternet上的主机来说,你的整个内部网只有代理服务器是可见的,从而大大增强了网络的安全性;通过代理服务器的缓存功能还可以大大加快网络的访问速度,节约宝贵的网络带宽资源;对于只有有限几个合法IP地址内部网来说,代理服务器技术提供了一种私有IP访问Internet的方法;目前的代理服务器支持多种常用的代理服务,如HTTP,FTP,TELN飞猪IP等,本文以最常用的HTTP代理为主讨论如何建立一个具有高可用性、高性能、可扩展负载均衡http代理服务器集群.


  1传统HTTP代理服务技术存在的主要问题


  随着网络用户及访问量快速增加,传统HTTP代理服务技术存在以下主要问题:①面对大量并发访问


  请求,代理服务器的CPU、I/O处理能力很快会成为瓶颈;②由于代理服务器是整个内部网络访问Internet的惟一通道,单点故障(如操作系统崩溃,代理软件失效,服务器硬件故障等)将导致内部用户无法访问外部WWW网络;③单台服务器的性能总是有限的,简单的提高硬件性能或优化系统并不能真正解决问题,传统技术模式下部署多台代理服务器又无法自动实现服务器间负载均衡,这同时还会增加管理维护的难度.


  而Linux虚拟服务器(Linux Virtual Server,LVS)使用负载均衡技术将多台服务器组成一个虚拟服务器,结合Linux的HA(高可用技术),它能为适应快速增长的网络访问需求提供了一个负载能力强,易于扩


  [收稿日期]2004-06-23


  [作者简介]田林(1973-),男,云南牟定人,工程师,主要研究方向:计算机网络技术


  田林等:一个基于Linux LVS具有高可用性高性能可扩展负载均衡HTTP代理集群的设计与实现·47·


  展、高可用,而且价格低廉的解决方案.


  2LVS结构与工作原理


  LVS的系统结构如图1所示,它由前端的负载均衡器(LoadBalancer,LB)和后端的真实服务器(Real Server,RS)群组成.RS间可通过局域网或广域网连接,LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群,用户的所有访问请求都发往LB.


  当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS,RS再将用户请求结果返回给用户,同请求包一样,应答包的返回方式也与包转发策略有关,通常我们可以在真实服务器群上提供Web服务、代理服务、Ftp服务或者VOD视频点播服务


  等.


  LVS的包转发策略有三种:


  (1)NAT(Network Address Translation)模式,LB收到用户请求包后,LB将请求包中虚拟服务器的IP地址转换为某个选定RS的IP地址,转发给RS;RS将应答包发给LB,LB将应答包中RS的IP转为虚拟服务器的IP地址,回送给用户;


  (2)IP隧道(IP Tunneling)模式,LB收到用户请求包后,根据IP隧道协议封装该包,然后传给某个选定的RS;RS解出请求信息,直接将应答内容传给用户,此模式要求RS和LB都要支持IP隧道协议;


  (3)DR(Direct Routing)模式,LB收到请求包后,将请求包中目标MAC地址转换为某个选定RS的


  MAC地址后将包转发出去,RS收到请求包后,可直接将应答内容传给用户,此模式要求LB和所有RS都必须在一个物理段内,且LB与RS群共享一个虚拟IP;


  附表三种包转发策略对比表


  特性地址转换模式NAT IP隧道模式直接路由模式DR


  服务器节点操作系统任何操作系统需要支持隧道技术


  (仅L INUX)大多数操作系统


  (windows,bsd/linux,solaris等)


  服务器节点数量10~20 100以上100以上


  用户访问IP LVS虚拟IP LVS虚拟IP LVS虚拟IP


  集群性能差(无论请求数据还是应答数据,都需要经过负载均衡器,负载均衡器容易成为瓶颈)好(应答数据不需要经过负载均衡器)较好(应答数据不需要经过负载均衡器)


  从图1和附表中我们不难发现,传统LVS集群存在以下问题:


  ①如果系统中仅有一台负载均衡器,负载均衡器的失效将造成整个集群的瘫痪,因此必须提供容错机制,能够在负载均衡器失效的时候进行自动检测并平滑替换,也就是常说的HA(高可用性)技术.


  解决方法是配置一个以备份均衡器身份运行的结点实时地监控主负载均衡器的运行状态,并根据检测到的状态做出响应:报警、接管、恢复.在具体的实验中,笔者采用了heartbeat+Fake软件包实现HA(高可用性),heartbeat在主/备份负载均衡器之间通过安装在串行口的串行线使用UDP协议传送心跳信息来检测相互间工作状态,Fake软件使用ARP欺骗的方法来实现IP接管,即当主负载均衡器出现故障时,备份负载均衡器将自动接管主负载均衡器工作,当主负载均衡器故障排除后,备份负载均衡器恢复其原来身份.


  ②显然,真实服务器结点也有可能出现暂时失效的情况,系统的随机故障或外部环境的突变都可能造成该节点的某个服务暂时不可用,这将导致用户访问失败,因此,由负载均衡扩展出的容错机制要能够识别这种错误,并及时进行处理.同样,当错误排除后,集群能够自动识别恢复事件,把好的服务结点重新纳入集群继续运行.


  玉溪师范学院学报


  采用Linux下的mon软件包可以很好的解决上述问题,mon进程运行在负载均衡器上,负责监测整个集群的服务器节点和服务进程,mon进程将每m秒检测一下服务节点池中所有节点的相应服务进程,某个服务器节点失效或服务进程失效时,mon进程将会自动将该服务器从服务节点池中剔除,当服务器节重新生效或服务进程重新生效时又重新将该服务器加入到服务节点池中.


  改进后的LVS系统结构如图2.


  从大量实践经验看,构建高性能HTTP代理服务器集群最佳选择是DR直接路由模式,下面笔者以一个实例简要说明构建一个具有高可用性、高性能、可扩展负载均衡http代理服务器集群的简要过程.


  3HTTP代理集群系统的构建过程


  实验拓扑结构同图2.


  3.1硬件环境


  2台PII台式机(300M处理器,64M内存,6.4G IDE硬盘,100M网卡)做主/备份负载均衡器,两台机器间通过串行线连接;


  3台PIII台式机(550 M处理器,256 M内存,30G IDE硬盘,100M网卡)作服务器节点;


  负载均衡器及服务器节点均通过网线连接到一台8口以太交换机,同时在网络出口防火墙上配置策略,只允许服务节点的HTTP流量通过;


  3.2软件环境


  主/备份负载均衡器采用redhat6.2操作系统2.2.19内核;


  LVS集群软件The IPVS patch for Linux 2.2.19 Version 1.0.8(包含了LVS的命令行管理工具


  ipvsadm);


  服务器节点分别安装Freebsd4.6,Redhat Linux7.2,Solaris8(x86)操作系统;


  HTTP代理软件为squid2.5,源代码编译安装(分别安装在3台服务器节点);


  HA软件为heartbeat+Fake,rpm包直接安装(分别安装在主/备份负载均衡器);服务节点监控软件为Mon,rpm包直接安装(分别安装在主/备份负载均衡器).


  3.3软件安装配置过程由于篇幅有限,本文仅将重点部分描述如下:


  第一步:在主/备负载均衡器上安装好redhat6.2操作系统,并下载LVS内核补丁The IPVS patch for Linux 2.2.19,对内核打补丁,重新配置和编译Linux的内核,LVS将作为一个服务在系统启动时加载,LVS详细配置过程参考http://www.linuxvirtualserver.org有关文档,LVS的配置文件/etc/sysconfig/ipvsadm主要内容如下:


  -A-t 211.83.176.7:3128-s wlc(定义了一个负载均衡服务,虚拟IP为211.83.176.7,服务监听


  3128端口,即squid代理服务器的服务端口,负载平衡算法采用wlc加权最小连接数算法)


  -a-t 211.83.176.7:3128-r 211.83.176.22:3128-g-w 1


  -a-t 211.83.176.7:3128-r 211.83.176.9:3128-g-w 1


  -a-t 211.83.176.7:3128-r 211.83.176.12:3128-g-w 1


  (定义3个服务节点211.83.176.22,211.83.176.9,211.83.176.12)


  第二步:在主/备负载均衡器上安装配置HA软件(heartbeat+Fake)和服务节点监控软件(Mon),详细过程参考以下站点的有关文档:


  田林等:一个基于Linux LVS具有高可用性高性能可扩展负载均衡HTTP代理集群的设计与实现·49·


  http://www.linux-ha.org/http://vergenet.net/linux/fake/http://www.kernel.org/software/mon/heartbeat软件包(已经包含了Fake软件)核心配置文件/etc/hd.d/ha.conf主要内容如下:


  #deadtime:seconds-to-declare-host-dead


  deadtime 10;死亡检测时间为10秒


  #What UDP port to use for udp or ppp-udp communication?udpport 1001;使用udp端口1001传送心跳信息


  #What interfaces to heartbeat over?


  udp tty0;在串口1上监听心跳信息


  #Tell what machines are in the cluster;定义监测的机器node lvs1.cxtc.edu.cn(主负载均衡器)node lvs2.cxtc.edu.cn(备份负载均衡器)/etc/ha.d/haresources文件内容如下:lvs1.cxtc.edu.cn 211.83.176.7 lvs mon mon软件包核心配置文件/etc/mon/mon..cf主要内容如下:


  #mon config info,you probably don’t need to change this very much hostgroup proxy1 211.83.176.9;定义要监控的服务节点IP为211.83.176.9 watch proxy1


  service squid;定义要监控的服务为squid代理服务


  interval 120s;定义监控的时间间隔为120秒


  monitor squid.monitor;监控服务器节点squid服务运行的脚本,每隔120秒运行一次


  alert virtualserver.alert-A-d-P-t-V 211.83.176.7:3128-R 211.83.176.9;


  (当检测到某个服务器节点squid服务进程失效时,virtualserver.alert脚本将该服务器节点211.83.


  176.9从服务器节点池中删除)


  .upalert virtualserver.alert-A-a-P-t-V 211.83.176.7:3128-R 211.83.176.9-T-g-w 1(当检测到服务器节点squid服务进程重新生效时,virtualserver.alert脚本将服务器节点211.83.176.9加入


  到服务器节点池中)其余配置信息省略;


  第三步:在3台服务节点上安装操作系统并配置squid代理服务软件,安装配置过程省略;第四步:在3台服务节点的虚拟网络接口(可以是dummy0或lo:0)上绑定LVS虚拟IP并关闭该接口


  的arp响应,这在直接路由模式下是必须配置的;


  Linux系统:


  需要对内核打补丁,重新编译内核才有效,详情参考http://www.ssi.bg/~ja/;在rc.local中加入以下命令:


  echo 1>/proc/sys/net/ipv4/conf/all/hidden


  echo 1>/proc/sys/net/ipv4/conf/lo/hidden


  ifconfig lo add 211.83.176.7 netmask 255.255.255.255 Freebsd系统:在/etc/rc.conf中加入以下命令:


  ifconfig-lo0-alias0=“inet 211.83.176.7 netmask 255.255.255.255-arp up”


  Solaris8(x86)系统:在启动脚本中加入以下命令


  ifconfig lo0:1 211.83.176.7 netmask 255.255.255.255-arp


  至此,整个集群系统搭建完成,用户可以通过IP 211.83.176.7端口3128使用HTTP代理服务,在测试过程中笔者主要模拟测试了主/备负载均衡器在故障情况下的切换,负载均衡器对服务节点服务失效、恢复的处理,集群系统的可扩展性等情况,均取得了满意的结果,该集群系统已经在笔者所在学校楚雄师范学院校园网上试运行了6个月,为600多台计算机提供了高速、稳定的HTTP代理服务.


  4结束语


  玉溪师范学院学报


  LVS是一个高性能可扩展的负载均衡集群系统.该系统可以提供与服务器节点的数量、性能成正比的负载能力,有效提高服务的吞吐量、可靠性、冗余度、适应性,性能价格比高.同时,LVS也是利用低端设备实现高端服务器性能的有效途径,它已经在多个领域得到了广泛应用


上一篇 用C#实现Http代理服务器