`
wuhui
  • 浏览: 50923 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Apache2(.2)+tomcat+JK 集群

    博客分类:
  • java
阅读更多
看了不少关于配置apache+tomcat集群的文章,按部就班的做,基本上能成功。可是软件的更新很快,一些老的配置已经不能满足需求,而一些新的配置也不能尽如人意,结合网上的实例,下面将我配置的过程做一个描述:

1 为什么要做集群?

集群有别于分布式的解决方案,它采用的是每台服务器运行相同应用的策略,由负责平衡的服务器进行分流,这对提高整个系统的并发量及吞吐量是更有效的办法。而集群对请求的处理又有两种不同的方式:负载平衡、状态复制(即集群),状态复制需要在各服务器间复制应用状态,而负载平衡则不用,每台服务器都是独立的。实践证明,在各应用服务器之间不需要状态复制的情况下,负载平衡可以达到性能的线性增长及更高的并发需求。
    2 集群与负载平衡的区别

因为是以Apache + Tomcat+ JK 的负载平衡配置作为介绍,下面重点了解就JK的工作方式

使用mod_jk默认的以轮循方式进行平衡负载,假设有四个服务器节点,有10个请求,则四个节点分别接受请求编号如下:

节点A 节点B 节点C 节点D
1 2 3 4
5 6 7 8
9 10    

而集群方式也是使用这种方法进行平衡。Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制。

集群不同于负载平衡的是,由于集群服务需要在处理请求之间不断地进行会话复制,复制后的会话将会慢慢变得庞大,因此它的资源占用率是非常高的,如果在并发量大的应用中,复制的会话大小会变得相当大,而使用的总内存更是会迅速升高。

但集群的会话复制,增加了系统的高可用性。由于在每台服务器都保存有用户的Session信息,如果服务器群中某台当机,应用可以自动切换到其它服务器上继续运行,而用户的信息不会丢失,这提高了应用的冗错性。

具体采用负载平衡还是集群,这要看应用的需求了。

3 软件下载

Tomcat: http://archive.apache.org/dist/tomcat/我使用的是tomcat-5;
Apache: http://archive.apache.org/dist/httpd/ 一般使用Apache2.2的版本
JK:mod_jk-1.2.x-httpd-2.2.x.so。jk是mod_jserv的替代者,它是Tomcat-Apache插件,为Apache和Tomcat的连接器,处理Tomcat和Apache之间的通信,在集群配置中充当负载均衡器的作用,当前的最新版本为1.2.26,不过不同JK版本与不同的Apache版本之间的搭配有一些差异,有的甚至配不起来。JK2是符合apache2.x系列的新品,但由于其配置太过麻烦,使用的人很少,很久以前已停止开发,所以我们采用了jk连接器,下载地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries
    值得注意的是:jk的版本最好和当前的Apache匹配。

说了这么多了,可能下面才是大家要关注的重点。

4 配置Apache

4.1 为了简便 ,可以下载Apache的安装文件,安装很简单,一路Next
4.2 安装完毕后,将下载的mod_jk-1.2.x-httpd-2.2.x.so复制到Apache安装目录下的modules子目录中。
      关于Apache的配置文件,可以在网上查看下子资料,如设置DocumentRoot(部署根目录),Listen(监听端口)等等,这里不再赘述。

4.3 然后进入Apache安装目录下的conf子目录中,打开httpd.conf配置文件,在最后插入以下一行:

          Include conf/mod_jk.conf 

        这样便于管理和修改配置文件。

4.4  在conf子目录下,建立一个新的配置文件:mod_jk.conf,此文件为Apache加载连接器的配置文件,文件名可修改,但要与httpd.conf中Include的文件名一致,内容如下:
    # Load mod_jk module. Specify the filename

    # of the mod_jk lib you’ve downloaded and

    # installed in the previous section

    #加载mod_jk模块

    LoadModule jk_module modules/mod_jk-1.2.x-httpd-2.2.x.so(x表示版本号)

    # Where to find workers.properties

   JkWorkersFile conf/workers.properties


    # Where to put jk logs

    JkLogFile logs/mod_jk.log



    # Set the jk log level [debug/error/info]

    JkLogLevel info



    # Select the log format

    JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"



    # JkOptions indicate to send SSL KEY SIZE,

    JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories  



    #JkRequestLogFormat set the request format

    JkRequestLogFormat "%w %V %T"


    # 请求分发配置,可以配置多项

    JkMount /* loadbalancer

    JkMount /jkstatus status



    !/*.gif      loadbalancer

    !/*.jpg     loadbalancer

    !/*.png    loadbalancer

    !/*.css     loadbalancer

    !/*.js       loadbalancer

    !/*.htm    loadbalancer

    !/*.html   loadbalancer

    #关掉主机Lookup,如果为on,很影响性能,可以有10多秒钟的延迟。
    HostnameLookups Off

注:1、 蓝色加粗的两行是重点,第一句是Apache加载JK模块用的;第二句为配置哪些URL请求将由负载平衡器来处理。

     2、/* 匹配所有的请求,都由 loadbalancer 这个 worker 进行处理,但是有几个例外,/jkstatus 请求由 status 这个 worker 处理。另外这个配置中每一行数据前面的感叹号表示接下来的 URI 不要由 JK 进行处理,也就是 Apache直接处理所有的图片、css 文件、js 文件以及静态 html 文本文件。

4.5  在conf子目录下,建立一个新的配置文件:workers.properties,此文件为负载平衡的配置文件,文件名不能修改,这是JK默认的名字,内容如下:
worker.list=loadbalancer

# Define the first node...

worker.worker1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009

worker.worker1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址

worker.worker1.type=ajp13

worker.worker1.lbfactor=1

worker.worker1.local_worker=1

worker.worker1.cachesize=1000

worker.worker1.cache_timeout=600

worker.worker1.socket_keepalive=1

worker.worker1.socket_timeout=0

worker.worker1.reclycle_timeout=300

worker.worker1.retries=3

# Define the second node...

worker.worker2.port=9009 #ajp13 端口号,在tomcat下server.xml配置,默认8009,其他                                        主机可以用默认的端口

worker.worker2..host=localhost

worker.worker2..type=ajp13

worker.worker2..lbfactor=1

worker.worker2..local_worker=1

worker.worker2..cachesize=1000

worker.worker2..cache_timeout=600

worker.worker2..socket_keepalive=1

worker.worker2..socket_timeout=0

worker.worker2..reclycle_timeout=300

worker.worker2..retries=3

# Now we define the load-balancing behaviour

worker.loadbalancer.type=lb

worker.retries=3

worker.loadbalancer.balance_workers=worker1,worker2

worker.loadbalancer.sticky_session=true

worker.loadbalancer.sticky_session_force=true


注:以上定义了两个worker,一个为worker1,另一个为worker2,定义了一个负载平衡服务器loadbalancer,其中标蓝色的为重点配置项,相关的详细说明可以看官方的网站文档:http://tomcat.apache.org/connectors-doc/,其它节点的定义可以直接Copy,修改一下节点名及IP就好了。
A、worker.list=loadbalancer

设定工作的负载平衡器,各Tomcat节点不能加入此列表。

      B、worker.worker1.lbfactor

负载平衡的权重比,如果此权重比越大,则分配到此节点的请求越多,如以上两个节点的权重比为1:1,则为平均分配。

C、worker.loadbalancer.balance_workers=worker1,worker2

   指定此负载平衡器负责的Tomcat应用节点。

D、worker.loadbalancer.sticky_session=true

   此处指定集群是否需要会话复制,如果设为true,则表明为会话粘性,不进行会话复制,当某用户的请求第一次分发到哪台Tomcat后,后继的请求会一直分发到此Tomcat服务器上处理;如果设为false,则表明需求会话复制。

E、worker.loadbalancer.sticky_session_force=true

   如果上面的sticky_session设为true时,建议此处也设为true,此参数表明如果集群中某台Tomcat服务器在多次请求没有响应后,是否将当前的请求,转发到其它Tomcat服务器上处理;此参数在sticky_session=true时,影响比较大,会导致转发到其它Tomcat服务器上的请求,找不到原来的session,所以如果此时请求中有读取session中某些信息的话,就会导致应用的null异常。

4.6、Apache服务器的配置文件httpd.conf中,默认有三个参数对性能的影响比较大,但根据不同的性能要求,参数的表现又不一样,太小并发提不上去,太大性能反而不好,建议根据项目的需要,实际做个测试,如并发要求800的话,可以设定为:
    #一个连接的最大请求数量

    MaxKeepAliveRequests 1000(值为0,则不限制数量)

    #每个进程的线程数,最大1920。NT只启动父子两个进程,不能设置启动多个进程

    ThreadsPerChild    1000(最大为1920)

    #每个子进程能够处理的最大请求数

    MaxRequestsPerChild   1000(值为0,则不限制数量)

    这三个参数要根据不同的需求,不同的服务器进行调整。

5 测试
         我搭建的两个worker分别是 worker1和worker2,所用的端口分别是8009和9009,下面在同    一台电脑里测试loadbalance是否成功(host=localhost)。

         在进行以上实验时,两个Tomcat服务器都在同一台机器上运行,应该确保它们没有使用相同的端        口。在Tomcat的默认的server,xml中,一共配置了以下3个端口:
        <Server port="8005" shutdown="SHUTDOWN" debug="0">
        <Connector port="8080"/>
        <Connector port="8009"/>
       两个Tomcat服务器都在同一台机器上运行,则至少应该对其中一个Tomcat服务器的以上3个端口号    都进行修改。
        此外,如果把Tomcat和其他HTTP服务器集成,Tomcat主要负责处理HTTP服务器转发过来的客户请求,通过不会直接接受HTTP请求。因此为了提高Tomcat的运行性能,可以关闭Tomcat的HTTP连接器,方法为在server.xml中把Tomcat的HTTPConnector的配置注释掉。

        如果是接不同电脑上的tomcat,修改两个Tomcat服务器的JK端口,确保它们和workers.properties文件中的配置对应。此外,在使用了loadbalancer后,要求worker的名字和Tomcat的server.xml文件中的<Engine>元素的jvmRoute属性一致。

      Tomcat 服务器1:
      <Engine name="Catalina" defaultHost="localhost" debug="0" jmvRoute="worker1">
      Tomcat 服务器2:
      <Engine name="Catalina" defaultHost="localhost" debug="0" jmvRoute="worker2">

         6 测试

        至此,整个配置全部完成。

      编写测试文件:建立一个目录test,里面新建一个test.jsp,内容为     <%System.out.println("===========================");%>

        把test放到tomcat1,tomcat2的webapps下。在完成以上步骤后,分别启动两个Tomcat服务器和        Apache服务器,然后访问 http"//localhost/test/test.jsp,通过 http://localhost/test/test.jsp     访问,查看tomcat1的窗口,可以看到打印了一行"=========="再刷新一次,tomcat2也打印了    一条,再刷新,可以看到请求会被tomcat1,tomcat2轮流处理,实现了负载均衡。

        由于此时由 localbalancer来调度Tomcat服务器,因此不能断定到底访问的是哪个Tomcat服务器的     index.jsp,这对于Web客户来说是透明的。

  对于负责请求分发的Apache服务器,需要消耗大量的    CPU资源,因此如果在测试过程中出现一些    Service Temporarily Unavailable或erver  has shut down the connection prematurely这样的错    误,这一般都是服务器配置不够好引起的,或者是Apache、Tomcat、及应用中的某些配置不够使        用,这时候就要考虑换更好的机器或优化应用中的配置。

7 常见问题

一、cannot connect to server:无法连接到服务器。这种情况是服务器的配置有问题,服务器无法承受过多的并发连接了,需要优化服务器的配置:

如操作系统采用更高版本,如windows 2003 server,

优化tomcat配置:maxThreads="500" minSpareThreads="400" maxSpareThreads="450"

但是tomcat 最多支持500个并发访问

优化apache配置:

ThreadsPerChild 1900

    MaxRequestsPerChild  10000

二、 Action.c(10): Error -27791: Server  has shut down the connection prematurely

    HTTP Status-Code=503 (Service Temporarily Unavailable)
    一般都是由于服务器配置不够好引起的,需要优化硬件和调整程序了。

三、无法处理请求:

    当我们输入 ***.do 命令后,apache却返回错误信息,而连接tomcat却没有问题。原因是没有把.do 命令转发给tomcat处理。解决方法如下:

    在apache配置文件中配置如下内容:

JkMount /*.jsp loadbalancer

JkMount /*.do loadbalancer

转载至 http://telexiang.blogbus.com/logs/22529232.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics