我们正在尝试复制有关 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/