0

我在spring boot项目中使用了嵌入式hazelcast 4.0.1来管理项目的缓存。我设置了Near Cache,还设置了脑裂保护功能,4.0之前叫Quorum。

然而,我发现了一个问题。比如我把缓存操作放在一个服务上:

@Cacheable(value ="CacheSpaceName", key ="#id")
public String findById(String id) {
   ...
}

如果Near Cache中已经缓存了正确的数据,即使裂脑保护生效,服务仍然会返回正确的结果,而不是被裂脑保护拒绝。

我怎样才能让近缓存也受到裂脑保护的控制?希望出现脑裂时,小集群不能正常运行,只有大集群才能正常运行。

以下是项目中近缓存配置和脑裂保护配置代码:

final NearCacheConfig nearCacheConfig = new NearCacheConfig()
  .setInMemoryFormat(InMemoryFOrmat.OBJECT)
  .setCacheLocalEntries(true)
  .setMaxIdleSeconds(xxx);

MapConfig allMapConfig = new MapConfgi.setName("*").setNearCacheConfig(nearCacheConfig)
  .setBackupCount(0).setMaxIndleSeconds(xxx).setInMemoryFormat(InMemoryFormat.OBJECT)
  .setMergePolicyConfig(xxx)

final SplitBrainProtectionConfig splitBrainProtectionConfig = new SplitBrainProtectionConfig("name", true, 2);
splitBrainProtectionConfig.setProtectOn(SplitBrainProtectionOn.READ_WRITE);

allMapConfig.setSplitBrainProtectionName("name");
config.addSplitBrainProtectionConfig(splitBrainProtectionConfig);
config.addMapConfig(allMapConfig);

4

2 回答 2

0

我提出的NearCahce不受脑保护功能控制的问题是希望集群出现脑裂时,禁止小集群提供任何服务,大集群可以正常提供服务。产生这种需求的原因是部分业务依赖 Hazelcast 的缓存同步功能。我们希望缓存可以在某些时候根据需要进行更新,以避免使用过时的数据。如果出现脑裂,则无法在完整的集群中执行缓存更新。因此,如果此时小集群仍能正常提供服务,则很可能提供错误的服务。

Hazelcast 裂脑保护功能中也有类似的“最少成员数”配置。当 Hazelcast 检测到当前集群成员数小于该值时,会禁止集群的某些缓存功能。但是因为只是对缓存操作的限制,而且我发现不能控制 NearCache 缓存,所以我有我的疑问。虽然后来发现 Hazelcast 的裂脑保护可能根本满足不了我的需求。

但现在我找到了另一种方法来满足我的需求。其实就是用一个过滤器来验证最小成员数。Hazelcast的脑裂保护功能已经不需要了(目前脑裂恢复还是需要的,所以merge策略也配置正常)。

于 2020-09-04T09:22:41.477 回答
0

NearCache 不受裂脑保护的覆盖,因为 NearCache 是应用程序端缓存,而 Hazelcast 内置裂脑保护旨在保护集群成员(服务器)。

除了你的观点 -

希望出现脑裂时,小集群不能正常运行,只有大集群才能正常运行

在裂脑集群中,无论大小如何,双方都可以正常工作。当网络分区得到解决并且两侧准备合并时,集群大小变得相关。Hazelcast 部署了一个后台任务,该任务会定期搜索拆分集群。当检测到拆分时,将决定启动合并过程的一方。该决定基于集群大小;根据成员数,较小的集群合并到较大的集群中。如果它们具有相同数量的成员,则散列算法确定合并集群。在决定合并方时,双方确保其成员列表中没有交集。

于 2020-08-26T00:19:50.680 回答