我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 运维优化 > apache 集成tomcat 6集群负载同一台机器解决session复制 ...
总共48086条微博

动态微博

查看: 8043|回复: 3

apache 集成tomcat 6集群负载同一台机器解决session复制 问题

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2014-07-13 14:09:11 |只看该作者 |倒序浏览
           最近项目功能开发都差不多了、所以着手项目优化问题、推荐一下 《java+EE门户网站性能优化技术的研究与实现》里面提到了很多实用的技术 。下面摘自开篇语:
            门户网站系统作为政府和企业对外的重要信息平台,已成为信息化建设中的重要组成部分。门户网站的性能优化问题是提高系统稳定性和用户访问量的关键。本文引入了页面静态优化、缓存优化和索引查询优化等技术,尽可能少地访问或不访问后台数据库来实现页面访问,以达到提高系统性能的目的。本文采用了实体继承的领域建模方法,从性能的角度采用“每个类分层结构一张表"的策略设计领域模型,此策略能显著提高系统的查询性能;针对页面静态化问题,提出了基于Velocity模板引擎方法,在生成动态页面前能够直接生成文章静态页面而不用访问数据库;针对首页静态化问题,提出了利用URLConnection实现IO读写来生成模块化静态页面,把模块动态页面输出为静态页面,并使用SSI技术使首页达到静态化和模块化。针对带参数的动态页面,采用了基于OsCache的文件级缓存优化技术,使这些动态页面能够直接缓存到磁盘中,不用直接访问数据库,以减少响应时间并提高性能;针对核心实体类,使用内存缓存策略,采用hibernate的二级缓存机制,把EHCache作为缓存实现产品,优化系统性能;针对用户通过表单查询所需文章的性能优化问题,采用了基于Lucene和Compass的索引查询方法,对文章和文章类别的重要属性进行索引并存储,并将索引结果返回给用户;最后实现了一个Suggest的查询提示效果,使系统更加完美。      
            本文采用Jmeter性能测试工具对系统进行性能测试,验证所提出和采用的性能优化技术的优越性。本文所提出和采用的优化技术已在研发的门户网站系统中得以实现,性能稳定可靠。
            关键词:门户网站;性能优化;页面静态化;缓存优化;索引优化

    工作时间也不久了、所以不能只局限于完成现有功能、所以研究了很多关于网站优化的东西、spring+Quartz定时任务、OsCache缓存框架、以及页面静态化等等
           spring+Quartz定时任务:主要是白天的一些不是需要很实时性的东西放到夜间执行、还有一些统计性的问题。
           OsCache缓存框架:是一款相对来说比较不错的缓存框架、可以缓存对象、也可以缓存单个页面、可以很好的减少直接跟数据库打交道。

           但是这些东西一旦运用于集群环境就需要在设计的时候就要考虑到、否则真是有解决不完的问题接踵而来,该实现序列化的要实现,单例模式、静态变量、线程同步、定时器重复执行,缓存增删更新通知问题、使用的时候就需要慎重考虑,否则到了从单机到集群的时候将会非常痛苦。

           至此、需要测试的很简单只要在本地搭建集群环境就OK。
           (一)使用工具:
                    1. apache_2.2.11-win32-x86-no_ssl.msi
                    2. mod_jk-1.2.31-httpd-2.2.3.so
                    3. tomcat6
           下载地址大家可以去官方网站去自行下载、后面也会有相应的附件提供大家下载。
           (二)术语解释 :
              1.apache
              Apache是普通服务器,本身只支持html即普通网页。不过可以通过插件支持php,还可以与Tomcat连通。 Apache和Tomcat整合使用:如果客户端请求的是静态页面,则只需要Apache服务器响应请求;如果客户端请求动态页面,则是Tomcat服务器响应请求;因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销 。
              区别:Apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展。 Apache和Tomcat都可以做为独立的web服务器来运行,但是Apache不能解释java程序(jsp,serverlet)。
           2.mod_jk
             tomcat为一个jsp的容器,apache为一个web server,他们之间的通信可以通过worker进行(由Tomcat使用Server.xml文件中Connector的标签来定义其端口和协议),即通过通过mod_jk的模块进行通信。
    过程是这样子:apache的httpd.conf文件先调用mod_jk.conf,mod_jk.conf调用workers.properties,最后配置虚拟主机。
          (三)文件说明:
               httpd.conf
              mod_jk.conf( 主要定义mod_jk模块的位置以及mod_jk模块的连接日志设置,还有定义worker.properties文件的位置。)
              worker.properties
              定义worker的参数,主要是连接tomcat主机的地址和端口信息。如果Tomcat与apache不在同一台机器上,或者需要做多台机器上tomcat的负载均衡只需要更改workers.properties文件中的相应定义即可。
             server.xml
       (四)文件内容:
           httpd.conf最后一行添加:  include "D:\apache\conf \mod_jk.conf" 此路径为你安装apache的目录。
           apache目录下的conf下新建 mod_jk.conf 并添加一下代码:


    1. LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so
    2. JkWorkersFile conf/workers.properties
    3. JkMount /* lbcontroller
    复制代码
         第一行代码表示载入JK模块、第二行代码表示  tomcat实例配置、 第三行 设置apache分发器,/*表示apache将所有文件都由分发器lbcontroller 进行分发,你可以自行设置*.jsp,*.do等
       (五) tomcat集群配置
                1:安装Tomcat6
                      把下载的解压版本解压一份,按住ctrl点击后拖一下,两份改改名,tomcat1/tomcat2
                2:配置Server.xml
                           
    tomcat1 端口功能说明 tomcat2
    <Server port="9005" 关闭使用端口 <Server port="8005"
    <CONNECTOR port="9080" 关闭使用端口 <CONNECTOR port="8090"
    <CONNECTOR port="8888" Apache通讯端口
    <CONNECTOR port="9999"
               同一台机器下2个tomcat一定要确保端口不要重复、否则会冲突导致其中启动失败。
              3:   找到 Engine的位置,取消注释,并修改jvmRoute="tomcat实例名"、确保跟配置mod_jk的woker.properties中指定的一致。每一个tomcat对应一个实例名。 例如:
                         
    1. <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat1">
    复制代码


             4: 找到Cluster标签,并取消它的注释即可。将cluster中的Receiver标签下的tcpListenAddress或address改为tomcat所在服务器的真实ip、本地的话 可以为127.0.0.1
             5: 确保要在应用集群的web应用下的web.xml的末尾添处</web-app>标签里添加 <distributable/>   如果不加session将不能复制、导致session不一致。
             对于tomcat的集群有两种方式,这个主要是针对session而言的。
            一种就是sticky模式,即黏性会话模式。所谓sticky模式就是说同一个用户的访问请求都被派送到同一个tomcat实例上,这样我们就无须在多台服务器之间实现session共享了,这是其好处,不好的地方就是不能实现failureover了,一但用户访问的机器挂掉,那么其session就会丢失。
           另外一种就是session复制模式了。session复制模式就可以很好的解决failureover的问题,即使某一台web服务器挂掉了,用户的请求还会被负载到其他的web服务器上,而且session也被复制了,这样对用户而言就像是在同一台机器上操作一样,不好的地方就是session复制需要系统资源和网络的开销,尤其是当web服务器多的时候或session里存储的数据量大的时候,这点将会比较的明显(不过自己还没有做这方面的测试)。
           针对这两种方式的弊端和好处,我们可以采用将两种方式结合的方式来达到更好的效果,那就是sticky+session复制模式了。用户的请求按照sticky方式被分发到同一个web服务器上,同时tomcat在后台做异步复制(非同步)session到其他web服务器,这样我们使用sticky的简便性,同时又有了一定的容错能力。
          启动tomcat1 bin目录下的 startup.bat 输出一下信息:
    2014-7-13 16:16:10 org.apache.catalina.core.AprLifecycleListener init
    信息: Loaded APR based Apache Tomcat Native library 1.1.20.
    2014-7-13 16:16:10 org.apache.catalina.core.AprLifecycleListener init
    信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
    2014-7-13 16:16:11 org.apache.coyote.http11.Http11AprProtocol init
    信息: Initializing Coyote HTTP/1.1 on http-9080
    2014-7-13 16:16:11 org.apache.coyote.ajp.AjpAprProtocol init
    信息: Initializing Coyote AJP/1.3 on ajp-8888
    2014-7-13 16:16:11 org.apache.catalina.startup.Catalina load
    信息: Initialization processed in 1313 ms
    2014-7-13 16:16:11 org.apache.catalina.core.StandardService start
    信息: Starting service Catalina
    2014-7-13 16:16:11 org.apache.catalina.core.StandardEngine start
    信息: Starting Servlet Engine: Apache Tomcat/6.0.33
    2014-7-13 16:16:11 org.apache.catalina.ha.tcp.SimpleTcpCluster start
    信息: Cluster is about to start
    2014-7-13 16:16:11 org.apache.catalina.tribes.transport.ReceiverBase bind
    信息: Receiver Server Socket bound to:/192.168.1.66:4000
    2014-7-13 16:16:11 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    信息: Attempting to bind the multicast socket to /228.0.0.4:45564
    2014-7-13 16:16:11 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    信息: Binding to multicast address, failed. Binding to port only.
    2014-7-13 16:16:11 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    信息: Setting multihome multicast interface to:/127.0.0.1
    2014-7-13 16:16:11 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    信息: Setting cluster mcast soTimeout to 500
    2014-7-13 16:16:11 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:4
    2014-7-13 16:16:12 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    信息: Done sleeping, membership established, start level:4
    2014-7-13 16:16:12 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:8
    2014-7-13 16:16:13 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    信息: Done sleeping, membership established, start level:8
    2014-7-13 16:16:13 org.apache.catalina.startup.HostConfig deployDescriptor
    信息: Deploying configuration descriptor host-manager.xml
    2014-7-13 16:16:14 org.apache.catalina.startup.HostConfig deployDescriptor
    信息: Deploying configuration descriptor manager.xml
    2014-7-13 16:16:14 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory docs
    2014-7-13 16:16:14 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory examples
    2014-7-13 16:16:14 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory ROOT
    2014-7-13 16:16:14 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory test
    2014-7-13 16:16:14 org.apache.catalina.ha.session.DeltaManager start
    信息: Register manager /test to cluster element Engine with name Catalina
    2014-7-13 16:16:14 org.apache.catalina.ha.session.DeltaManager start
    信息: Starting clustering manager at /test
    2014-7-13 16:16:14 org.apache.catalina.ha.session.DeltaManager getAllClusterSessions
    信息: Manager [localhost#/test]: skipping state transfer. No members active in cluster group.
    2014-7-13 16:16:14 org.apache.catalina.ha.session.JvmRouteBinderValve start
    信息: JvmRouteBinderValve started
    2014-7-13 16:16:14 org.apache.coyote.http11.Http11AprProtocol start
    信息: Starting Coyote HTTP/1.1 on http-9080
    2014-7-13 16:16:14 org.apache.coyote.ajp.AjpAprProtocol start
    信息: Starting Coyote AJP/1.3 on ajp-8888
    2014-7-13 16:16:14 org.apache.catalina.startup.Catalina start
    信息: Server startup in 2987 ms
    =======================================================
         这表明我们的tomcat集群已经正常启动了、然后启动tomcat2 bin目录下的 startup.bat 输出一下信息:
    ===========================================
    2014-7-13 16:20:06 org.apache.catalina.core.AprLifecycleListener init
    信息: Loaded APR based Apache Tomcat Native library 1.1.20.
    2014-7-13 16:20:06 org.apache.catalina.core.AprLifecycleListener init
    信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
    2014-7-13 16:20:07 org.apache.coyote.http11.Http11AprProtocol init
    信息: Initializing Coyote HTTP/1.1 on http-8090
    2014-7-13 16:20:07 org.apache.coyote.ajp.AjpAprProtocol init
    信息: Initializing Coyote AJP/1.3 on ajp-9999
    2014-7-13 16:20:07 org.apache.catalina.startup.Catalina load
    信息: Initialization processed in 1344 ms
    2014-7-13 16:20:07 org.apache.catalina.core.StandardService start
    信息: Starting service Catalina
    2014-7-13 16:20:07 org.apache.catalina.core.StandardEngine start
    信息: Starting Servlet Engine: Apache Tomcat/6.0.33
    2014-7-13 16:20:07 org.apache.catalina.ha.tcp.SimpleTcpCluster start
    信息: Cluster is about to start
    2014-7-13 16:20:08 org.apache.catalina.tribes.transport.ReceiverBase bind
    信息: Receiver Server Socket bound to:/192.168.1.66:4001
    2014-7-13 16:20:08 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    信息: Attempting to bind the multicast socket to /228.0.0.4:45564
    2014-7-13 16:20:08 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    信息: Binding to multicast address, failed. Binding to port only.
    2014-7-13 16:20:08 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    信息: Setting multihome multicast interface to:/127.0.0.1
    2014-7-13 16:20:08 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    信息: Setting cluster mcast soTimeout to 500
    2014-7-13 16:20:08 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:4
    2014-7-13 16:20:08 org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
    信息: Replication member addedrg.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 66}:4000,{192, 168, 1, 66},4000, alive=236558,id={-1 -27 118 -5 52
    18 8 }, payload={}, command={}, domain={}, ]
    2014-7-13 16:20:09 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    信息: Done sleeping, membership established, start level:4
    2014-7-13 16:20:09 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:8
    2014-7-13 16:20:09 org.apache.catalina.tribes.io.BufferPool getBufferPool
    信息: Created a buffer pool with max size:104857600 bytes of typerg.apache.catalina.tribes.io.BufferPool15Impl
    2014-7-13 16:20:10 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    信息: Done sleeping, membership established, start level:8
    2014-7-13 16:20:10 org.apache.catalina.startup.HostConfig deployDescriptor
    信息: Deploying configuration descriptor host-manager.xml
    2014-7-13 16:20:10 org.apache.catalina.startup.HostConfig deployDescriptor
    信息: Deploying configuration descriptor manager.xml
    2014-7-13 16:20:10 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory docs
    2014-7-13 16:20:10 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory examples
    2014-7-13 16:20:10 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory ROOT
    2014-7-13 16:20:10 org.apache.catalina.startup.HostConfig deployDirectory
    信息: Deploying web application directory test
    2014-7-13 16:20:10 org.apache.catalina.ha.session.DeltaManager start
    信息: Register manager /test to cluster element Engine with name Catalina
    2014-7-13 16:20:10 org.apache.catalina.ha.session.DeltaManager start
    信息: Starting clustering manager at /test
    2014-7-13 16:20:10 org.apache.catalina.ha.session.DeltaManager getAllClusterSessions
    警告: Manager [localhost#/test], requesting session state from org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 66}:4000,{192, 168, 1, 66},4000, al
    0 78 -113 -81 50 -46 -36 -6 110 18 8 }, payload={}, command={}, domain={}, ]. This operation will timeout if no session state has been received within 60 seconds.
    2014-7-13 16:20:11 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions
    信息: Manager [localhost#/test]; session state send at 14-7-13 下午4:20 received in 213 ms.
    2014-7-13 16:20:11 org.apache.catalina.ha.session.JvmRouteBinderValve start
    信息: JvmRouteBinderValve started
    2014-7-13 16:20:11 org.apache.coyote.http11.Http11AprProtocol start
    信息: Starting Coyote HTTP/1.1 on http-8090
    2014-7-13 16:20:11 org.apache.coyote.ajp.AjpAprProtocol start
    信息: Starting Coyote AJP/1.3 on ajp-9999
    2014-7-13 16:20:11 org.apache.catalina.startup.Catalina start
    信息: Server startup in 3186 ms
    =============================================================
          我们再回来看 tomcat1的窗口多出了一下部分:
    =============================================================
    信息: Replication member addedrg.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 66}:4001,{192, 168, 1, 66},4001, alive=1026,id={20 -41 120 109 -48 66 66 -54 -97 -73 13 117 -49 26 7
    6 75 }, payload={}, command={}, domain={}, ]
           这 表明tomcat1也已经侦听到了tomcat2,两个tomcat服务器已经建立了联系。
    然后我们新建一个小项目进行测试:
    在浏览器输入:http://localhost/test/test2.jsp

    F5刷新页面:

    可以看出sessionId并没有改变 复制成功、此时如果我们关闭tomcat1或者是突然tomcat1死掉、观察下会有什么样的情况。
         此时系统正常运行、但是只会跳到tomcat2了(因为tomcat1已经死了)、负载均衡的好处就不言而喻了吧。我们可以看下tomcat2的控制台会输出一下信息:
    2014-7-13 16:30:23 org.apache.catalina.tribes.transport.nio.NioReplicationTask run
    警告: IOException in replication worker, unable to drain channel. Probable cause: Keep alive socket closed[远程主机强迫关闭了一个现有的连接。].
    2014-7-13 16:30:23 org.apache.catalina.tribes.transport.nio.NioReplicationTask run
    警告: IOException in replication worker, unable to drain channel. Probable cause: Keep alive socket closed[远程主机强迫关闭了一个现有的连接。].
    2014-7-13 16:30:26 org.apache.catalina.tribes.group.interceptors.TcpFailureDetector memberDisappeared
    信息: Received memberDisappeared[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 66}:4000,{192, 168, 1, 66},4000, alive=851652,id={-1 -27 118 -5 52 20 78 -113 -81 50 -46 -36 -6 11
    0 18 8 }, payload={}, command={}, domain={}, ]] message. Will verify.
    2014-7-13 16:30:27 org.apache.catalina.tribes.group.interceptors.TcpFailureDetector memberDisappeared
    信息: Verification complete. Member disappeared[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 66}:4000,{192, 168, 1, 66},4000, alive=851652,id={-1 -27 118 -5 52 20 78 -113 -81 5
    0 -46 -36 -6 110 18 8 }, payload={}, command={}, domain={}, ]]
    2014-7-13 16:30:27 org.apache.catalina.ha.tcp.SimpleTcpCluster memberDisappeared
    信息: Received member disappearedrg.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 66}:4000,{192, 168, 1, 66},4000, alive=851652,id={-1 -27 118 -5 52 20 78 -113 -81 50 -46 -36 -6 1
    10 18 8 }, payload={}, command={}, domain={}, ]

    tomcat2已经检测到了tomcat1死掉了。至此apache+tomcat的集群已经搞定、有不对的地方欢迎大家指正拍砖
    Tomcat集群案例.zip (132.31 KB, 下载次数: 10)




    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    红红火火恍恍惚惚

    33

    主题

    1

    听众

    409

    金钱

    四袋长老

    该用户从未签到

    沙发
    发表于 2016-11-02 15:24:20 |只看该作者
    好厉害啊,学习了。真心的点赞
    回复

    使用道具 举报

    3

    主题

    3

    听众

    1211

    金钱

    五袋长老

    该用户从未签到

    板凳
    发表于 2016-12-06 16:47:38 |只看该作者
    tomcat我还真没搞过集群,哈哈,看看小七漂亮的文档
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    地板
    发表于 2016-12-06 18:55:51 |只看该作者
    barry200890 发表于 2016-12-6 08:47
    tomcat我还真没搞过集群,哈哈,看看小七漂亮的文档

    可以看一下 Nginx 集群配置 这个只是实现了部分集群 session共享还有
    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表