服务器离线时 session 持久性 Hazelcast 客户端初始化

标签 session tomcat configuration persistence hazelcast

我们正在尝试复制有关 servlet 和 http session 持久性的 WebSphere 传统 (5/6/7/8/9) 行为,但使用 Hazelcast 和 Tomcat。让我解释... WebSphere,即使配置为复制域的客户端,也会保留 session 数据的本地寄存器。即使应该保留复制数据的服务器进程从一开始就关闭,这个本地寄存器也能正常工作。也就是说,您启动客户端, session 持久性在 servlet 容器内工作。显然,如果第一个 servlet 容器崩溃,您不能指望在另一个 servlet 容器中恢复您的 session ,但您的应用程序仍然可以正常工作。

另一方面,Tomcat 容器上的 Hazelcast 客户端希望 Hazelcast 服务器(至少是集群的一个成员)启动并运行以进行初始化。如果没有可用的集群成员,则初始化失败,并且... Tomcat servlet 容器中的 Web 应用程序无法正确启动。他们不会回答任何请求。

此外,一旦初始化失败,唯一的恢复方法是关闭并重新启动 tomcat Web 容器(一旦 hazelcast 集群成员在线)。

这种行为对系统管理员来说有点苛刻:没有人能保证作为分布式 session 持久化的备份服务一直在线。这意味着启动 Tomcat 客户端成为一项冒险的任务,设计上会出现单点故障,这是不可取的。

现在,也许我忽略了什么,也许我做错了什么。那么,“有没有人设法在没有服务器的情况下启动 Hazelcast 客户端,如何实现的?对我们来说,区别是决定性的:如果我们不能使 Web 容器从离线的 Hazelcast 服务器启动,那么我们必须继续使用 WebSphere。

我们一直在 Virtual Box 5.2.22 上的 CentOS 7.5 上试用,我们的 Tomcat 版本是 8.5。 Hazelcast 客户端和服务器是 3.11.1/2。

<group>
    <name>Integracion</name>
    <password></password>
</group>

<network>
  <cluster-members>
    <address>hazelcastsrv1/address>
    <address>hazelcastsrv2</address>
  </cluster-members>
</network>

遗憾的是,我们所期待的正是我们所得到的:阅读 Hazelcast 手册表明离线服务器不允许 tomcat 为应用程序提供服务。但是我们不能相信我们读到的内容,因为它使图书馆在分布式环境中变得不安全。我们预计是错误的,好消息即将来临。

最佳答案

Hazelcast 不是“设计的单点故障”。设计是为了避免单点故障。默认情况下,数据跨节点镜像。

这是一个数据网格,您可以根据容量和弹性的需要运行尽可能多的节点,并将它们聚集在一起。

如果您需要 3 个节点才能成功运行,并且预计 1 个节点可能会出现故障,那么您总共需要运行 4 个。如果发生 1 次故障,您将拥有一个足够大的集群。

关于服务器离线时 session 持久性 Hazelcast 客户端初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54711995/

相关文章:

php - CodeIgniter,使用 Redis 作为 session 管理器

java - Servlet 的 sendRedirect() 杀死了我的 session 属性

tomcat - 将机器主机名重定向到在 tomcat 上运行的 jira 的完全限定 url

tomcat 已启动但无法访问本地主机 :8080

svn - Subversion:svn状态显示大量不需要的.metadata文件

java - 获取 Eclipse 运行时配置键和值

configuration - 如何显示最后一次 puppet 代理运行的摘要?

python - 如何从 memcached 中删除旧的烧杯 session ?

php - 如何在 session 过期后自动更新数据库而不刷新我的页面

Apache在没有tomcat的情况下访问静态html