手头上的一个项目“陕西省专业技术人员继续教育学习与管理平台”是服务于全陕西省130万专技人员的高并发且事务逻辑较复杂的一个系统,不管是编码上还是系统架构部署上都具有一定的挑战性。在考虑了现有设备以及系统负载的基础上,整个系统架构采用了六台服务器,分别是:WEB门户服务器(WEB门户+Oracle数据库)、学习管理平台服务器、系统核心数据库、资源下载服务器、在线点播服务器、数据库备份服务器。
系统运行了数月,WEB门户采用的apache+mod_jk+memcached+4tomcat能够正常应付目前的访问。管理学习系统虽然由于一些在线课程还未上线,最大的并发还未开始,但目前课程文件的上传、人员的表单录入等对服务器的造成的负载经常使服务器响应缓慢甚至不响应。考虑到开始采用的nginx+4tomcat+ip_hash,ip_hash本身策略的缺陷使负载不能很好地均衡,于是使用memcached做集群的session共享。此时出现了一个到现在还让我搞不清楚的现象:系统session中存入一些timestamp的Date对象,读取的时候,竟然会读成UNIX原始时间戳。一直没办法解决这个问题,只能采用ip_hash的方式运行着,一旦出现服务器不响应的情况就重启tomcat。
这几天上网查资料的时候,发现terracotta可以做tomcat集群的session共享,由于其是jvm级别的cluster解决方案且采用find-gained changes机制,因此在性能要优于memcached,关键是其是jvm堆级别的复制,储存任何值都没任何问题。按照官网的说明把所有东西都配置好了,却发现session无法正常共享。写了个测试的jsp,打印出session id,单独访问某一个tomcat,发现id在不停的换,我一开始怀疑是terracotta没安好的问题,就又重装了一遍,问题依旧。这时突然发现在IE下session是正常的,其他浏览器下session就不正常,总是不停地换,按说没有关闭浏览器是不会重新生成session的。使用fiddler来检测请求和响应的header,发现一个奇怪的问题,chrome请求一个页面时比使用IE时,多了一个对/favicon.ico的请求,而这个请求得到的响应(404)中会产生新的session id使session发生变化。(什么原因,怎么解释?)在网站的根目录下上传一个favicon.ico即可解决此问题。为了证实是favicon.ico不存在造成的问题,我在页面中请求了一个不存在的js文件,结果session id又开始不停地变。把所有不存在的文件的引用都删掉能够解决此问题,但是在没有使用terracotta前根本不存在此问题,我猜想是不是terraccota在检测到404错误的时候,就会重新生成session的缘故啊。查了一下tomcat的文档,发现context有个属性sessionCookiePath,尝试着把这个值设置为了"/",结果一切正常了,即使再有404错误,session也不会再变了。这是为什么?在文档中对sessionCookiePath的解释是:
The path to be used for all session cookies created for this context. If set, this overrides any path set by the web application. If not set, the value specified by the web application will be used, or the context path used if the web application does not explicitly set one. To configure all web application to use an empty path (this can be useful for portlet specification implementations) set this attribute to / in the global CATALINA_BASE/conf/context.xml file.
不指定此值的时候,是使用的web app中的或者是直接使用context path。我猜测terracotta是接受了此值,但在处理404资源的时候,这个path无法识别,故以为是新的一个会话,造成session改变的缘故。
不管咋样,暂且算是解决了此问题,原因也是猜测的。有空得看一下terracotta的源代码,看看究竟是什么原因造成的。
其实这个项目在部署运行中,出现过各种问题,因此也做过很多架构的变动。到目前还是不能让人满意,只能在后续的维护中继续改进了。
分享到:
相关推荐
总结,使用 Terracotta 与 Tomcat 集群相结合,可以创建出一个既具有高扩展性又具备高可用性的 Web 应用平台,解决了传统 session 管理方式的诸多问题。在实际部署中,开发者应根据具体业务需求和资源条件,合理选择...
根据测试结果,在采用Terracotta搭建的Tomcat集群中,即使当节点数量增加到8个时,集群的整体吞吐量依然保持着线性增长的趋势。 #### 安装与配置流程 为了便于使用Terracotta搭建Tomcat集群,Terracotta提供了一个...
尽管Terracotta提供了强大的Session共享功能,但在实际工程项目中应用却面临着一定的挑战,如配置复杂性、与现有架构的集成问题等。解决这些问题需要深入理解Terracotta的工作原理及其与Java应用的交互方式,同时...
在Tomcat集群中,Terracotta可以实现session复制和共享,确保用户在集群中的任意节点之间切换时,其会话状态保持一致,避免了session丢失的问题。 集群配置文件tc-config.xml是Terracotta的配置文件,用于定义集群...
在分布式服务集群环境中,session共享是一个关键挑战,因为传统的session保存在单一服务器上,当用户在集群中的不同服务器之间切换时,会导致session丢失。本文主要探讨了几种在分布式系统中实现session共享的解决...
Terracotta是一款开源软件,它提供了一种高效且可靠的解决方案,允许在集群环境中实现Web Session的共享,从而确保用户在不同服务器间的无缝切换。本文将深入探讨如何利用Terracotta来实现Web Session的同步。 ** ...
Terracotta 实现 Session 复制是指 Terracotta 的基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta 只把变化的部分发送给 Terracotta。 分布式 Session 方案的选择取决于系统的需求和要求...
Terracotta通过集成到Tomcat,解决了这个问题,它能自动将一个服务器上的session同步到集群中的其他服务器,确保即使在服务器故障情况下,用户的session信息也不会丢失。 **terracotta-3.7.7.tar.gz安装步骤** 1. *...
在分布式系统和集群环境中,session管理是一项关键技术,它确保了用户在不同服务器之间的交互能够保持一致性。本文将深入探讨六种常用的session共享方法,包括它们的工作原理、优缺点以及适用场景。 #### 1. 客户端...
通过将 session 复制和负载均衡功能集成到 Tomcat 集群中, Terracotta 提供了一种无需数据库依赖的解决方案,能够在多个服务器之间实现数据同步,同时保持较低的网络压力和资源消耗。 2. **基本原理** Terracotta...
Terracotta是一个开源的Java集群框架,它允许在多个Tomcat服务器之间共享session数据,确保用户在集群中的任意节点切换时,其会话状态仍能保持连续。Terracotta通过监听和同步session对象,解决了跨服务器的会话复制...
1. **共享内存**:使用第三方库,如 Terracotta,将 session 存储在共享内存中。 2. **数据库存储**:将 session 信息存储在数据库中,所有 Tomcat 实例都可以访问。 3. **cookie**:通过 sticky sessions,让客户端...
本文档详细介绍了如何通过Apache作为负载均衡器来实现Tomcat集群的搭建,并利用Terracotta实现Ehcache的集群配置,以增强系统的故障恢复能力和数据共享功能。 #### 二、环境准备 在开始配置之前,需要准备以下软件...
2. **集成到应用中**:为了使Terracotta集群与你的应用程序协同工作,你需要在`web.xml`或`context.xml`文件中指定客户端如何获取配置。这通常涉及添加一个过滤器来指定特定容器的类(如Jetty、WebLogic或WebSphere...
7. **Java中间件**:例如Tomcat、Jetty等Web服务器支持集群配置,通过共享session和请求分发,实现集群部署。 8. **开源框架**:例如Apache Mesos、Hazelcast、Terracotta等,它们提供了一套完整的解决方案,简化了...
在JNDI中配置数据源(DataSource) 内嵌Jetty服务器 内嵌Jetty教程 内嵌Jetty的HelloWorld教程 内嵌Jetty视频 优化Jetty 如何配置垃圾收集 如何配置以支持高负载 在Jetty中部署应用 部署管理器 部署绑定 热部署 ...