在tomcat实例之间共享会话(不使用粘滞会话)

时间:2010-12-30 10:45:45

标签: java tomcat memcached cluster-computing

我将有3台Tomcat服务器和一台负载均衡器,可以在不使用“sticky sessions”的情况下调度请求。

我想在服务器之间共享会话数据,我正在考虑将它们保存在数据库中。我想将memcached用作我的数据库前面的图层,以便更快地处理请求并don't put my db under heavy load

我正在考虑提供我的自定义tomcat管理器,它在获取/持久化会话数据到DB之前使用memcached,因为我没有看到这样做的透明方式(这意味着我将不得不再次管理它)我切换到另一个应用程序服务器)。

这是一个很好的解决方案还是你看到了更好的方法?

4 个答案:

答案 0 :(得分:18)

在数据库中保留会话会限制您的可伸缩性。如果可伸缩性对您来说不重要,那么(db + memcached)是一种有效的方法。

使用nonsticky-sesions时需要记住的一件事是并发请求:当你有例如ajax-requests(并行/并发执行)它们将由不同的tomcats服务(由于非粘性),因此可以同时访问会话。只要您有可能修改会话的并发请求,您就需要实现某种同步/会话锁定。

也许这对您很感兴趣:我创建了memcached-session-manager,其目标是实现最佳性能和无限可扩展性。它可以与任何与memcached兼容的后端(例如memcachedb,membase等或只是memcached)一起使用。 虽然它最初是为粘性会话方法创建的,但已经存在branch for nonsticky-sessions,而sample app显示它是如何工作的。 现在有一个thread on the mailing list on further improvements for nonsticky-sessions(处理并发请求并防止单点故障)。

答案 1 :(得分:7)

将会话状态存储在应用服务器之外(在您的情况下为Tomcat),对于大型网站来说是一种非常常见且推荐的配置。这通常是为了追求称为Shared Nothing的架构风格。

您可以将您的状态存储在几个不同的位置:db,memcached,商业复制缓存等。它们都可以使用不同的折衷方案。就个人而言,我在memcached方面取得了巨大的成功。 Memcached非常快速和稳定。

通常,我选择简单并使用N个记忆服务器,其中N> 1,比如说2.当用户登录时,应用服务器会翻转硬币来决定哪个服务器存储用户状态。发送到浏览器的cookie包括用于知道从那时起要路由到哪个内存缓存服务器的信息。来自浏览器的后续请求在每个请求上从相应的memcache服务器获取状态。如果内存缓存服务器出现故障,用户将不得不再次登录,因为应用服务器会重新选择新服务器,但这种情况非常罕见。

答案 2 :(得分:0)

我们在我们的应用程序中做了类似的事情(Weblogic,但这没关系),我们在浏览器中将一个唯一的会话密钥存储为cookie。然后,该密钥将在每个请求中用于从数据库恢复相关会话数据。

使用此原则,我们始终可以使用负载均衡器切换到另一台服务器,而无需用户注意任何内容。除此之外,我们几乎不存储与用户会话相关的任何内容,并在浏览器中使用大量隐藏字段(负载均衡器支持URL加密和表单值保护,因此我们处于安全的一面......)

答案 3 :(得分:0)

我认为Terracotta Web Sessions就是你想要的。