【问题标题】:Knowing what data was affected by Hazelcast members joining or leaving cluster了解 Hazelcast 成员加入或离开集群会影响哪些数据
【发布时间】:2020-11-12 12:14:27
【问题描述】:

我们的服务器端解决方案利用 Hazelcast 提供的分布式数据结构来提供与特定集群成员上的实体相关的可用状态。

当一个集群成员加入或离开集群时,我们需要让其他集群节点知道“发生了什么变化”:例如,当一个集群成员离开时,其他集群成员需要能够确定哪些实体由于集群事件而变得不可用,将其与具有其他原因(例如:与此类实体的正常生命周期行为相关)的实体的可用性变化区分开来。

一个简单的实现可以基于在每个集群成员上保存一个记录,该记录跟踪哪个集群成员提供了哪些资源。当检测到集群事件时,可以使用这样的记录。然而,这感觉就像是在重新发明一个轮子。

Hazelcast 能否促进解决方案?

【问题讨论】:

  • 天真地说,我认为在低层次上,Hazelcast 数据结构实现本身就需要这种机制。当数据由于集群事件而变得不可用时,是否不需要(最终)腾出本地内存,相反,不需要分发突然可用的数据(在完全复制的数据结构的场景中)用过的)?可以利用这种机制吗?
  • 不确定您所说的数据不可用和需要腾出本地内存是什么意思,因为当成员由于网络中断而离开集群并希望稍后再回来时,其数据会发生什么由合并策略定义。默认为 - 加入前擦除所有内容。至于剩余节点,丢失节点的数据会从剩余节点上的备份中恢复,并在确认节点离开后自动发生。
  • 让我详细说明一下“变得不可用”的含义:我们的每个集群节点都将特定于该节点的资源作为一个整体添加到集群中。举个简单的例子:一个用户会话,代表一个通过 TCP 连接连接到特定节点的用户。我们将会话表示保存在跨集群共享的缓存中。当一个节点与集群断开连接时,我们需要通知其他集群节点上的实体哪些会话(由断开连接的节点提供)现在不再可用。我们可以为此使用 Hazelcast 吗?
  • 我认为您可以实现此目的的一种方法是使用 MultiMap,其中键是成员 ID,值是在该节点上生成的所有会话。因此,基本上当创建用户会话时,还将其存储在 MultiMap 中,以针对成员/节点 ID。然后,当一个节点离开时,您在剩余节点上拥有 MembershipListener,它可以从 MultiMap 中针对刚刚离开集群的节点提取所有会话。有意义吗?
  • 您还可以查看使用 Hazelcast 的 Web 会话复制,这是文档:docs.hazelcast.org/docs/4.1.1/manual/html-single/…

标签: hazelcast


【解决方案1】:

对于任何分布式系统来说,这种细粒度的内务管理既不可行也不推荐,因为它会增加大量开销。在 Hazelcast 的情况下,当集群拓扑发生变化时,有一些规定可以让您深入了解数据的状态。试试PartitionLostListener 和/或Migration Listener

【讨论】:

  • 除非我有误解,否则您的回复似乎与通常保存在数据网格中的数据有关。我认为我的问题的背景不同。在我们的用例中,每个集群成员都维护一组特定于该集群成员的资源:它不能通过集群传输。我们在 Hazelcast 分布式数据结构中保留资源的表示。单个资源可以但不必对另一个资源的可用性感兴趣。我们正在寻找的是能够发送指示资源可用性变化的事件的触发器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多