具有首选成员身份的Hazelcast数据关联性

时间:2018-10-22 20:57:33

标签: java hazelcast

我使用Hazelcast设置了一个集群系统来存储我的数据。群集中的每个节点负责连接到localhost上的服务,并将来自该服务的数据管道传输到Hazelcast群集中。

我希望此数据主要存储在接收数据的节点上,并在该节点上进行处理。我希望这些数据在性能要求相对较低的其他节点上可读写。

我从一个幼稚的实现开始,该实现与我描述的完全一样,没有特殊的考虑。我注意到性能受到很大影响(我们使用Infinispan对其进行了单独的实现进行比较)。一般而言,我从每个单独的服务处理的数据之间几乎没有逻辑交集。它存储在Hazelcast群集中,因此可以从所有节点读取和偶尔写入它,并用于故障转移方案。如果Hazelcast成员在该节点上失败或该节点上的本地服务失败,我仍然需要读取失败节点的最后一个良好状态。

因此,我在共同定位数据并减少网络抖动方面的第一个尝试是使用serverId(例如,在3节点系统上,从1到3的数字)对很多数据进行加密,并将其包含在密钥中。然后,该密钥实现PartitionAware。我没有注意到性能上的改善,所以我决定在集群上执行逻辑本身,并以相同的方式对其进行键控(将PartitionAware / Runnable提交给DurableExecutorService)。我想出了如果无法选择可以在哪个成员上处理逻辑,那么我至少可以在同一成员上一致地执行它,并与数据共存。

由于所有数据和所有执行任务都在单个节点上存储和运行,因此性能甚至更差。我认为这意味着节点#1正在获得1到90的分区,节点#2正在获得91到180的分区,节点#3正在获得181到271的分区(或者在不完全了解密钥哈希算法以及我如何int serverId转换为分区号)。所以哈希serverId 1,2,3并导致例如获取所有数据和执行任务的最早的成员。

我的下一个尝试是将备份计数设置为(成员计数)-1并启用备份读取。情况有所改善。

然后,我查看了ReplicatedMap,但它不支持索引或谓词。我转向Hazelcast的动机之一是它对索引和查询地图数据提供了更全面的支持(据我所见,还具有更好的性能)。

我不认为这些方法是正确的方法(特别是因为将3个节点号映射到分区号与使用分区的方式不匹配)。我还有什么可以提供这种布局的,还有一个成员是首选的数据主对象,并且在发生故障后仍对1个或多个其他成员具有可读备份吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

数据网格提供可伸缩性,您可以添加或删除存储节点以调整容量,为此,网格需要能够重新平衡数据负载。重新平衡意味着将一些数据从一个地方移到另一个地方。因此,通常来说,数据的放置不受您的控制,并且在网格运行时可能会发生变化。

分区意识将使相关项目保持在一起,如果它们一起移动,它们也会一起移动。一个可运行/可调用的访问都可以从一个JVM上满足此要求,因此效率更高。

如果确实需要特定节点本地的数据,read-backup-datanear-cache有两个可能的改进。参见this answer。 两者都可以帮助读,但不能写。