我在spring boot项目中使用了嵌入式hazelcast 4.0.1来管理项目的缓存。我设置了Near Cache,还设置了split-brain保护功能,在4.0之前的版本中称为Quorum。
然而,我发现了一个问题。例如,我将缓存操作放在一个服务上:
@Cacheable(value ="CacheSpaceName", key ="#id")
public String findById(String id) {
...
}如果正确的数据已经缓存在Near Cache中,即使开启了分脑保护,服务仍然会返回正确的结果,而不是被分脑保护拒绝。
如何使Near Cache也由Split Brain Protection控制?我希望当大脑分裂时,小集群不能正常运行,只有大集群才能正常运行。
以下是工程中的近缓存配置和分脑保护配置代码:
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);发布于 2020-08-26 08:19:51
另外你要说的是-
我希望当大脑发生分裂时,小集群不能正常运行,只有大集群才能正常运行
在分裂的脑群中,无论大小,两边都工作得很好。当网络分区得到解决并且两端准备好合并时,集群大小就变得重要起来。Hazelcast部署了一个后台任务,定期搜索拆分的集群。当检测到拆分时,决定将启动合并过程的那一侧。此决策基于集群大小;根据成员计数,较小的集群合并为较大的集群。如果它们具有相同数量的成员,则散列算法确定合并集群。在决定合并方时,双方都要确保他们的成员列表中没有交集。
发布于 2020-09-04 17:22:41
我提出的NearCahce不受大脑保护功能控制的问题是,我希望当集群出现大脑分裂时,禁止小集群提供任何服务,而大集群可以正常提供服务。出现这种需求的原因是部分业务依赖Hazelcast的缓存同步功能。我们希望缓存可以根据需要在特定的时间进行更新,以避免使用过时的数据。如果存在拆分的brain,则无法在完整的集群中执行缓存更新。因此,如果小集群此时仍然正常提供服务,则很可能会提供错误的服务。
Hazelcast split-brain保护功能中也有类似的“最小成员数”配置。当Hazelcast检测到当前集群成员数小于该值时,会禁止集群的某些缓存功能。但是因为它只是对缓存操作的限制,而且我发现NearCache缓存无法控制,所以我有我的问题。虽然后来发现Hazelcast的分裂脑保护可能根本不能满足我的需求。
但现在我找到了另一种方法来满足我的需求。实际上,它是使用一个过滤器来验证成员的最小数量。不再需要Hazelcast的裂脑保护功能(目前裂脑恢复仍需要该功能,因此合并策略也正常配置)。
https://stackoverflow.com/questions/63447763
复制相似问题