TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
最近项目功能开发都差不多了、所以着手项目优化问题、推荐一下 《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 并添加一下代码:
- LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so
- JkWorkersFile conf/workers.properties
- 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对应一个实例名。 例如:
- <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)
|
|