【问题标题】:Hazelcast write-through map store pre-population on startupHazelcast 直写式地图存储在启动时预填充
【发布时间】:2013-03-14 09:23:36
【问题描述】:

我目前正在做一个POC 来开发一个distributed, fault tolerant, ETL ecosystem。我选择Hazelcast 用于我的clustering (data+notification) 目的。谷歌搜索 Hazelcast 资源让我to this link 使用基于地图的解决方案完全符合我的想法。

我需要了解一点。在此之前,请允许我对我们的架构给出一个规范的想法:

we have 2 nodes A,B running our server instance clustered through hazelcast。其中之一是接受请求的侦听器(但可以在故障转移时更改),例如 A。

A 收到一个请求并将其放入分布式地图。此映射由持久存储支持直写,并且在节点上配置单个内存备份。

每个实例都有一个本地映射条目监听器,在条目添加事件时,(asynchronous/queuing) 会处理该条目,然后将其从分布式映射中删除。

这是按预期工作的。

问题:

假设已收到 10 个请求并在每个节点上分发了 5 个请求。每个节点上的 2 个条目已被处理,现在两个实例都崩溃了。

所以现在支持数据存储中总共存在 6 个条目。

现在我们调出这两个实例。根据文档 - “As of 1.9.3 MapLoader has the new MapLoader.loadAllKeys API. It is used for pre-populating the in-memory map when the map is first touched/used"

我们通过简单地加载存储中存在的所有键值来实现loadAllKeys()

  1. 这是否意味着两个实例现在都将加载 6 个条目并对其进行处理(从而导致重复处理)? 或者是否以同步方式处理,以便在集群中仅加载一次?

  2. On server startup I need to process the pending entries(如果有)。我看到数据已加载,但未触发 entryAdded 事件。如何使 entryAdded 事件触发(或任何其他优雅的方式,通过它我将知道启动时有待处理的条目)?

请求建议。

谢谢, 苏塔努

【问题讨论】:

  • 对于现在的第二期,我有一个方法可以“获取”“本地”密钥集并处理它们。这是在 Hazelcast 初始化之后的一次性调用。我想知道这是否是我能做的最好的。

标签: java hazelcast


【解决方案1】:
  1. 在初始化时,将调用 loadAllKeys(),这将返回持久存储中的所有 6 个键。然后每个节点将选择它拥有的密钥并仅加载它们。所以 A 可能会加载 2 个条目,而 B 会加载剩余的 4 个。

  2. store.load 不会触发入口监听器。怎么样:在初始化之后,注册你的监听器之后,你可以获取 localEntries 并处理现有的。

【讨论】:

  • 感谢您确认 1。对于 2,是的,现在我正在做与您提到的类似的事情,想知道这是否会被接受。
  • 我还有一个问题。如果我在这种架构下将备份计数保持为 0,在这种情况下,如果一个节点发生故障,那么尽管该条目仍将存在于数据存储中,但它不会故障转移到任何其他节点(除非新的节点启动)。这是一个正确的理解吗?基本上我有兴趣了解具有数据存储支持的地图的集群如何运行,但没有备份。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-01-17
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多