Apache反向代理实现WEB负载均衡李玮越一.负载均衡的实现方式1.1实现web负载均衡的方式实现web负载均衡有四种方式:1.使用Apache的JKnativeconnector.2.使用Apache的mod_proxy及相关模块.3.使用Apache的mod_backhand模块.4.使用Tomcat5附带的balancerwebapp.负载均衡的实现方式(一)1.2使用JKnativeconnectorJKnativeconnector是一种连接器,它能建立tomcat与各种HTTP服务器之间的连接,完成通信,其一般安装在HTTP服务器上。其支持的HTTP服务器有Apache,IIS,Netscape。其中,Apache的mod_jk是实现JK的模块。负载均衡的实现方式(一)1.2.1JK结构图负载均衡的实现方式(一)1.2.2JK模块设计的配置文件httpd.conf指定要做什么workers.properties指定哪些资源可用uriworkermap.properties指定如何使用资源负载均衡的实现方式(一)1.2.3AJP协议AJP协议是一种打包/压缩协议,经常使用二进制格式。Web服务器和servlet容器通过TCP连接通信。为了减少socket创建过程的资源浪费,web服务器将长期维持与servlet容器的TCP连接并对每个连接进行复用,在其上能完成多次请求和应答。注意:基于AJP协议通信,每个连接与特定请求绑定,只有请求结束,它才能被其他请求占用。负载均衡的实现方式(一)1.2.4使用JK模块实现均衡的特点优点:1.AJP协议效率更高,节省带宽资源。2.后台服务器上运行tomcat,容易配置。3.集群容易配置,其本身即有分配算法(RR法),而且能完成小型系统的会话保持。4.JK模块是开源的,可以下载源代码,再其基础上改进分配策略。负载均衡的实现方式(一)1.2.4使用JK模块实现均衡的特点缺点:1.要求后端服务器必须运行tomcat.2.tomcat处理静态请求效率略低,且为同步,阻塞式的.3.需要配置所有的后端服务器的配置文件.负载均衡的实现方式(二)1.3使用mod_backhand模块mod_backhand是Apache的一个模块,是由美国约翰霍普金斯大学计算机科学系设计出来的,该模块由C++实现。mod_backhand能将客户对某一服务器的请求准确地重定向(redirect)到另一台服务器上(前提是这两台服务器上都要有客户请求的内容)。1.3.1mod_backhand适用环境mod_backhand可以更好的利用服务器资源,但如果带宽是系统的瓶颈,那么它无法带来帮助。如果CGI请求很多或是服务器太弱而无法独立处理请求,mod_backhand是一个解决方法。mod_backhand可以独立使用或者与大部分的负载均衡工具联合使用。负载均衡的实现方式(二)负载均衡的实现方式(二)1.3.2重定向(redirect)mod_backhand实现的重定向是将用户请求从繁忙的服务器导向空闲的服务器,使资源被充分利用,它提供的是细粒度的均衡,对每一个web请求可以使用一种均衡策略。负载均衡的实现方式(二)这种重定向也需要一定的计算,计算现在哪台服务器拥有最多的资源(如cpu,内存资源等),所以也会有一些开销。各个服务器之间进行通信,交换自己现在可用资源的信息。基于这个信息,接受到客户请求的服务器将请求传递给当前可用资源最多的服务器。负载均衡的实现方式(二)1.3.3均衡策略mod_backhand提供很多均衡策略byAgebyLoadbyBusyChildrenbyCpubyLogWindowbyRandombyCostbysession负载均衡的实现方式(二)1.3.4mod_backhand模块特点优点:1.mod_backhand模块是开源的。2.mod_backhand提供的均衡策略多。3.服务器上运行Apache,效率较高。4.可以与大多数均衡工具联合使用。负载均衡的实现方式(二)1.3.4mod_backhand模块特点缺点:1.mod_backhand即负载均衡器,没有独立的一台服务器做均衡器,需要控制所有的服务器,且都安装Apache和mod_backhand模块。2.为了了解其他服务器的资源情况,需要不断通信,通信量很大。3.没有考虑session机制,需自己实现。负载均衡的实现方式(三)1.4使用balancerwebappTomcat5之后的版本附带了一个网络应用叫balancer.它是一个简单的基于规则的负载均衡器,所以它不是为了大通信量,高负载的环境而设计的,它是由java编写的,容易扩展。负载均衡的实现方式(三)1.4.1运行环境尽管balancer是Tomcat附带的,但是它并非只能运行在Tomcat上,它可以不需改动就运行到其他的容器上。如果希望使用过滤器(filter)来完成重定向,Balancer则需要一个Servlet容器。负载均衡的实现方式(三)1.4.2分配策略balancer默认使用一个简单的过滤器,BalancerFilter来映射所有请求。过滤器从配置文件web.xml中读取规则。负载均衡的实现方式(三)默认规则如下:URL里含有News的请求转向把一个带有paramName的参数,参数值是paramValue的请求转向。把所有其它请求转向jakarta.apache.org。负载均衡的实现方式(三)1.4.3负载均衡规则均衡器系统的规则是一个请求匹配条件,以及相匹配请求的URL重定向的组合。这些规则实现org.apache.webapp.balancer.Rule接口。balancer自带许多有用的规则。这个框架很方便扩展,可以快速编写自己的规则。规则必须是标准的JavaBean负载均衡的实现方式(三)每个BalancerFilter(或者Servlet/JSP)在做重定向决定时参考一个RuleChain。可以使用ServletSpecification里定义的fullfiltermapping可能性,随意配置想要的多个过滤器。每个过滤器有它自己的RuleChain。负载均衡的实现方式(三)1.4.4工作流程首先编写一个包含匹配规则和重定向的配置文件。在web.xml文件中定义均衡器过滤器,将它映射到你想要的url(通常都是/*),并通过配置文件里的规则来配置。服务器启动,初始化过滤器。请求传入服务器。RuleChain来决定把这个请求转向哪里。规则是按照规则配置文件里定义的顺序来进行匹配的。找到第一个匹配上的规则后,不再继续匹配,这个请求马上被重定向。负载均衡的实现方式(三)1.4.5balancerweb的特点优点:1.只需将其部署在均衡器上,与后台服务器无关。2.由java编写,移植和扩展性好。3.实现简单,只要设置过滤器即可。负载均衡的实现方式(三)1.4.5balancerweb的特点缺点:1.使用过滤方式,很难扩展,在其上应用其他算法。2.这种方式与基于业务的分配方式相似,每台服务器完成不同的服务,如果服务器宕机,则无法正常工作。3.没有考虑通话保持机制。二.代理技术2.1代理服务器代理服务器(ProxyServer)的功能是代理网络用户去取得网络信息。代理服务器是介于浏览器和Web服务器之间的一台服务器,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,请求会先送到代理服务器,由代理服务器取回所需的信息并传回浏览器。代理技术2.2正向代理正向代理是一个位于客户端和源服务器(originserver)之间的服务器。为了从源服务器取得所需内容,客户端向代理发送一个请求并指定目标(源服务器),然后代理向原服务器转交请求并将获得的内容返回给客户端。正向代理的典型应用时为在防火墙内的局域网客户端提供访问Internet的途径。代理技术2.3反向代理反向代理与正向代理相反,对于客户端而言,它(代理服务器)就像源服务器,客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理判断向何处(源服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它(代理服务器)自己的一样。代理技术2.4反向代理的典型应用反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台web服务器提供负载均衡。另外,它还可以启动高级URL策略和管理技术,从而使多个web服务器访问相同的URL空间(reverseproxiescanbeusedsimplytobringseveralserversintothesameURLspace)。三.用mod_proxy实现负载均衡3.1概述mod_proxy模块实现了Apache的代理/网关功能,可以进行正向代理和反向代理。它支持的通信协议有AJP协议,FTP协议,HTTP1.0/1.1协议。Apache的代理功能被划分到几个不同的模块中:mod_proxy_httpmod_proxy_ftpmod_proxy_ajpmod_proxy_balancermod_proxy_connect三.用mod_proxy实现负载均衡如果想使用一个或多个代理功能,需要将mod_proxy和对应模块同时加载到服务器中。另外,其他模块提供了扩展特性,mod_cache及其相关模块提供缓冲特性。使用mod_proxy,mod_proxy_http,mod_proxy_balancer这三个模块,采用反向代理技术能实现web负载均衡。三.用mod_proxy实现负载均衡3.2mod_proxy的特点本实验使用mod_proxy与相应的模块通过反向代理来实现web负载均衡。使用mod_proxy方式的优点如下:1.mod_proxy支持HTTP协议,后台的服务器可以运行任意的中间件,如tomcat,apache,weblogic等。三.用mod_proxy实现负载均衡2.mod_proxy是Apache的模块,Apache中的模块多,可以与其他模块结合使用,实现更方便,功能更强大。3.mod_proxy考虑了session机制,通话保持容易实现。4.mod_proxy与其相应模块的配置与操作简单,使用指令即可。三.用mod_proxy实现负载均衡5.mod_proxy_balancer提供三种均衡策略,而且容易扩展。6.均衡器上运行Apache,这样可以在Apache上开发嵌入式程序,来完成老化检测的其他功能。三.用mod_proxy实现负载均衡3.3实现方式目前存在两种实现web负载均衡的方式:第一种是分工合作的形式,通过各台主机负责不同的任务而实现任务分工;第二种是不同的服务器担任同样的任务,若某一服务器出现故障,均衡器可以检测到故障而不会影响客户端。本实验采用第二种方式。三.用mod_proxy实现负载均衡3.4均衡策略mod_proxy_balancer提供三种负载均衡策略:RequestCountingWeightedTrafficCountingPendingRequestCounting三.用mod_proxy实现负载均衡3.4.1balancer参数lbfactor:期望这个worker完成的工作量,或者叫worker的工作配额(quota)。lbstatus:worker完成其配额工作的急切程度。worker:是负载均衡器的一个成员,通常是一个远程主机(即一个apache进程)。三.用mod_proxy实现负载均衡3.4.2RequestCountingRequestCounting是均衡器将请求分给每个worker,使得每个worker得到其配额的请求数。通过设置balancer的参数lbmethod=byrequests即可使用该策略。三.用mod_proxy实现负载均衡工作流程:均衡器给每个worker其额定(quota)的工作量,然后查看哪个w