hazelcast - 使用 PER_NODE 策略的 MaxSizeConfig 大小
问题描述
MaxSizeConfig 坏了吗?我希望 map 最多包含 2000 个条目,然后才开始驱逐旧条目,但是当我插入 2000 个条目时,我得到 340 个驱逐。
@Bean
public Config hazelCastConfig() {
Config config = new Config();
config.setProperty("hazelcast.logging.type", "slf4j");
// config.setProperty("hazelcast.partition.count", "2");
MapConfig mapConfig = new MapConfig()
.setBackupCount(0)
.setName("map")
.setEvictionPolicy(EvictionPolicy.LRU)
.setMaxSizeConfig(new MaxSizeConfig(2000, MaxSizeConfig.MaxSizePolicy.PER_NODE))
.addEntryListenerConfig(new EntryListenerConfig(new ExampleEntryListener(), false, true));
config.addMapConfig(mapConfig);
return config;
}
找到这个关于驱逐的公式:https ://docs.hazelcast.org/docs/3.12/manual/html-single/index.html#understanding-map-eviction
partition-maximum-size = max-size * member-count / partition-count
在我的情况下,partition-count=271, member-count=1(运行嵌入了 hazelcast 实例的 spring-boot 应用程序)。因此,要保证存储 2000 个,最大大小需要为:
max-size = partition-maximum-size * partition-count / member-count
最大尺寸 = 2000 * 271 / 1 = 471000
471000 对于只有 2000 个条目来说似乎太大了。当我设置 max-size=6000 hazelcast 似乎至少保留 2000 个条目。
问题:我的配置/公式有什么问题?如何配置 hazelcast 以严格保存 X 条目 PER_NODE。因此,当应用程序部署时(1 个节点用于 TEST,2 个节点用于 PRELIVE)hazelcast 形成 2 个(或 1 个)成员的集群,集群内有 2000 个条目,而不是更多,没有用花哨的公式计算任何东西,只指定 2000?
解决方案
以下是使用 PER_NODE 配置最大大小时发生的情况:
configuredEntrySize=2000, PER_NODE
totalEntrySize=configuredEntrySize*memberCount
(测试环境2000,PRELIVE 4000)
默认情况下,您有 271 个分区
perPartitionEntrySize=totalEntrySize/partitionCount
(7个测试环境,14个PRELIVE)
hash_of_the_key%partitionCount
当您将条目放入映射时,hazelcast 会使用键 ( )的哈希找出条目应该存储在哪个分区。如果您的数据不是完全统一的,您将有超过 7 个条目存储在某些分区中,因此会被驱逐。
你可以把 Hazelcast 想象IMap
成一个地图数组,数组的大小就是分区数。每个成员存储该数组的某些部分。假设MemberA存储
map-0、map-3、map-6 ... MemberB存储map-1、map-4、map-7 ... MemberC存储map-2、map-5、map-8 ... Hazelcast使用键的哈希从这个数组中选择一个映射,并将您的条目存储在这个选定的映射中。当您调用 IMap.size() 时,会向每个成员发送一个操作,收集这些地图的所有大小并作为总数返回。由于对每次驱逐检查都执行此操作不是最理想的,因此 Hazelcast 根据您配置的内容计算每个分区的最大大小,并将该数字用作每个地图的最大大小。
推荐阅读
- startup - 连接和启动虚拟机的区别
- node.js - 为什么我的发电机查询偶尔不会返回消息
- keras - 使用 Keras 生成嵌入
- jenkins - Jenkinsfile - 如何传递参数以发送电子邮件
- python - 使用 Python 解压 gzip 文件时失败
- powershell - 启动Windows远程更新的Invoke-Command很慢,有没有可能让它跑得更快?
- python - 有没有一种简单的方法可以在 Python 中逐表将数据库数据从 SQLite 迁移到 Postgres?
- python - Docker Python 32 位
- python - 找到最陡坡的起点和终点
- apollo - 为 Refetch 查询设置自定义标头 ApolloGraphQL