禁用备份时,Hazelcast 是否将 MultiMap 值存储在本地实例中?
Does Hazelcast store MultiMap values in the local instance when backup is disabled?
我正在配置没有备份的 Hazelcast Multimap(有意):
config.getMultiMapConfig(SESSIONS_MAP)
.setBackupCount(0)
.setAsyncBackupCount(0)
.setValueCollectionType(MultiMapConfig.ValueCollectionType.SET);
我的目标是每个实例都在 MultiMap 中存储自己的值,这样当服务器消失时,这些值就会丢失。以上配置是否正确?
示例:集群主机用户会话中的服务器实例。我想将用户存储在 MultiMap 中,以便每个用户都物理存储在本地实例上,但其他实例可以查找用户会话存在的位置。当服务器崩溃时,用户会话消失,MultiMap 中的条目也应该消失。 [用户实际上存储在房间中,例如MultiMap<roomId, Set<userId>>
,一个房间可能跨越多个实例。如果一个实例宕机,房间可能会幸存,但我希望当前实例上的用户在 MultiMap 中也变得不可用。]
只有在保证以上内容的情况下:在受控关闭中,是否值得在关闭之前清理本地条目,或者让实例消失是否更便宜?
https://docs.hazelcast.org/docs/latest-dev/manual/html-single/index.html#configuring-multimap 的手册没有清楚地说明实际发生的事情(或者我太盲目了,找不到它)。
这是基于分区的分布式系统的错误用例。当您存储在分区分布式数据结构(如 Map 或 MultiMap)中时,您无法控制哪个分区将托管您的键值数据。数据的主机分区由应用于密钥的一致哈希算法确定。这适用于写入和读取操作。并且在启用备份的情况下,数据被复制到每个节点的备份分区中,以便在节点发生故障时可以恢复数据。
因此,在您的情况下,您甚至不知道特定条目是否确实是您实例的本地条目(除非您使用 Hazelcast API 手动记录密钥分区的映射)。您正在查找一个条目,希望它是该实例的本地条目,因为您从同一节点执行了该条目的写操作,但实际上,该条目可能存储在集群中某个其他节点的分区上。
我相信你想要的是 NearCache 换句话说,它也可以作为 L1 缓存寻址 - 对你的应用程序来说是本地的。如果您丢失了应用程序实例,您将丢失 NearCache 并且不适用于 MultiMap。但即使使用 NearCache,您也永远不会收到 "null" 或 "data not found",因为 NearCache 原则上会在 NearCache 中找不到数据时从分区所有者(集群节点)加载数据。
您也可以关闭备份,但这将意味着丢失丢失节点上的数据,这些数据可能不是您应用程序的本地节点。
希望对您有所帮助。
如果将备份计数设置为零,则意味着每个条目将仅存储在一个分区(主分区)中。但这并不意味着分区将托管在 "local" 集群节点上。
存储任何条目的分区由哈希算法确定,但分区到集群节点的映射将随着集群成员的变化(添加或删除节点)而变化。所以我认为尝试操纵哈希码不是一个好方法。
既然您提到了 "local instance",我猜您是在嵌入式模式下使用 Hazelcast,并且 Hazelcast 集群节点位于托管 "rooms" 的同一台服务器上。您可能想要配置一个 MembershipListener;每当节点离开集群时,都会通知此侦听器,然后侦听器可以删除与该节点上的房间中托管的用户会话相关的映射条目。
我正在配置没有备份的 Hazelcast Multimap(有意):
config.getMultiMapConfig(SESSIONS_MAP)
.setBackupCount(0)
.setAsyncBackupCount(0)
.setValueCollectionType(MultiMapConfig.ValueCollectionType.SET);
我的目标是每个实例都在 MultiMap 中存储自己的值,这样当服务器消失时,这些值就会丢失。以上配置是否正确?
示例:集群主机用户会话中的服务器实例。我想将用户存储在 MultiMap 中,以便每个用户都物理存储在本地实例上,但其他实例可以查找用户会话存在的位置。当服务器崩溃时,用户会话消失,MultiMap 中的条目也应该消失。 [用户实际上存储在房间中,例如MultiMap<roomId, Set<userId>>
,一个房间可能跨越多个实例。如果一个实例宕机,房间可能会幸存,但我希望当前实例上的用户在 MultiMap 中也变得不可用。]
只有在保证以上内容的情况下:在受控关闭中,是否值得在关闭之前清理本地条目,或者让实例消失是否更便宜?
https://docs.hazelcast.org/docs/latest-dev/manual/html-single/index.html#configuring-multimap 的手册没有清楚地说明实际发生的事情(或者我太盲目了,找不到它)。
这是基于分区的分布式系统的错误用例。当您存储在分区分布式数据结构(如 Map 或 MultiMap)中时,您无法控制哪个分区将托管您的键值数据。数据的主机分区由应用于密钥的一致哈希算法确定。这适用于写入和读取操作。并且在启用备份的情况下,数据被复制到每个节点的备份分区中,以便在节点发生故障时可以恢复数据。
因此,在您的情况下,您甚至不知道特定条目是否确实是您实例的本地条目(除非您使用 Hazelcast API 手动记录密钥分区的映射)。您正在查找一个条目,希望它是该实例的本地条目,因为您从同一节点执行了该条目的写操作,但实际上,该条目可能存储在集群中某个其他节点的分区上。
我相信你想要的是 NearCache 换句话说,它也可以作为 L1 缓存寻址 - 对你的应用程序来说是本地的。如果您丢失了应用程序实例,您将丢失 NearCache 并且不适用于 MultiMap。但即使使用 NearCache,您也永远不会收到 "null" 或 "data not found",因为 NearCache 原则上会在 NearCache 中找不到数据时从分区所有者(集群节点)加载数据。
您也可以关闭备份,但这将意味着丢失丢失节点上的数据,这些数据可能不是您应用程序的本地节点。
希望对您有所帮助。
如果将备份计数设置为零,则意味着每个条目将仅存储在一个分区(主分区)中。但这并不意味着分区将托管在 "local" 集群节点上。
存储任何条目的分区由哈希算法确定,但分区到集群节点的映射将随着集群成员的变化(添加或删除节点)而变化。所以我认为尝试操纵哈希码不是一个好方法。
既然您提到了 "local instance",我猜您是在嵌入式模式下使用 Hazelcast,并且 Hazelcast 集群节点位于托管 "rooms" 的同一台服务器上。您可能想要配置一个 MembershipListener;每当节点离开集群时,都会通知此侦听器,然后侦听器可以删除与该节点上的房间中托管的用户会话相关的映射条目。