2015-06-03 38 views
5

(我无法找到一个很好的来源解释这一点,所以如果是其他地方,你可以只点我吧)Hazelcast:关于多节点一致性

  1. Hazelcast的所有节点将数据复制问题在集群中。因此,如果在其中一个节点中更改了数据,节点是否更新其自己的副本,然后将其传播到其他节点?

  2. 我在某处读到每个数据都属于一个节点,Hazelcast如何确定所有者?所有者是根据数据结构还是按数据结构中的每个键确定的?

  3. Hazelcast是否遵循“最终一致”原则? (当数据在节点间传播时,可能会有一个小窗口,在此期间节点之间的数据可能不一致)

  4. 如何处理冲突? (两个节点同时更新同一键值)

回答

8
  1. Hazelcast不复制(与ReplicatedMap的例外,显然;-)),但分区的数据。这意味着你有一个拥有给定键的节点。该密钥的所有更新都将发送给所有者,并通知可能的更新。

  2. 雇主是通过一致的散列使用下面的公式确定:

partitionId = hash(serialize(key)) % partitionCount

  • 由于每个键只有一个所有者它不是最终一致但一致,只要返回变异操作。接下来的所有读取操作都会看到新的值。在正常的操作情况下。当发生任何类型的故障(网络,主机,...)时,我们会选择可用性而不是一致性,并且可能会发生尚未更新的备份被重新激活的情况(特别是在您使用异步备份时)。

  • 当拆分群集重新合并时,裂脑会发生在裂脑之后。对于这种情况,您必须配置(或使用默认值)MergePolicy来定义相互冲突的元素如何合并在一起或哪一个胜出的行为。

  • +1

    谢谢你的回应。我有一个后续问题。假设有一个节点 - 节点A. 1.现在另一个节点B加入集群,并插入带有一些键值的映射。我假设B拥有地图和插入的键。 2.现在B退出群集。现在Hazelcast将复制A中的密钥,这是唯一剩下的节点。 3.现在C加入集群并读取密钥。 Hazelcast从A. 检索关键值是否正确? – gammay

    +2

    由于每当节点加入/离开数据时分区表都会更改,因此将在群集节点之间重新迁移。所以一个节点不拥有他的放置键,但键总是分布的。 – noctarius