Hazelcast优雅关闭并重启主节点后全量数据丢失问题求助
问题:Hazelcast双节点集群重启原主节点后缓存被清空
环境信息
- Java 17,Hazelcast 5.2.4
- 双节点Spring Boot应用,配置完全一致,部署在虚拟机上
- 集群状态:
Members {size:2, ver:4} [ Member [127.0.0.1]:5902 - 1a6fc0b7-bcb9-4630-9c20-b8aece752b82 this Member [127.0.0.1]:5901 - e700c21f-faa1-42c6-996b-7c951df0e3f5 ]
问题现象
- 缓存功能正常,双节点均存有缓存数据
- 优雅关闭主节点(1a6fc0b7-bcb9-4630-9c20-b8aece752b82)后,从节点接管主节点身份,缓存可正常访问
- 原主节点以空缓存重新加入集群后,整个集群的缓存数据被完全清空
已尝试操作
- 切换异步备份/普通备份,问题未解决
配置信息
Hazelcast配置
hazelcast: shutdownhook: enabled: false initial.min.cluster.size: 1 phone.home.enabled: false network: port: 5901 auto-increment: true join: multicast-enabled: false tcp-ip: enabled: true members: 127.0.0.1, 127.0.0.1 map: eviction-policy: LRU max-size-policy: FREE_HEAP_SIZE
Spring Boot关闭钩子
@PreDestroy void preDestroy() { log.info("Shutting down instance and hazelcast."); hazelcastInstance.getLifecycleService().shutdown(); }
解决方案
1. 启用Map持久化存储
默认Hazelcast缓存仅存于内存,节点重启后缓存为空,加入集群时会触发数据同步覆盖现有数据。配置持久化让节点重启后从介质恢复缓存:
hazelcast: # 保留原有配置... map: eviction-policy: LRU max-size-policy: FREE_HEAP_SIZE persistence: enabled: true fs: base-dir: ./hazelcast-persistence parallelism: 4
2. 修改集群合并策略
默认合并策略会用新节点数据覆盖集群数据,改为优先保留集群现有数据的策略:
hazelcast: # 保留原有配置... map: eviction-policy: LRU max-size-policy: FREE_HEAP_SIZE merge-policy: com.hazelcast.map.merge.PassThroughMergePolicy
PassThroughMergePolicy会忽略新节点的空条目,保留集群已存在的数据。
3. 优化节点退出时的同步逻辑
在优雅关闭前强制完成备份同步,确保数据完整性:
@PreDestroy void preDestroy() { log.info("Shutting down instance and hazelcast."); hazelcastInstance.getPartitionService().forceLocalPartitionBackup(); hazelcastInstance.getLifecycleService().shutdown(); }
4. 确保版本与配置一致性
重启节点的Hazelcast版本、配置必须与集群现有节点完全一致,避免因版本/配置不匹配导致异常同步。
内容的提问来源于stack exchange,提问作者Priit Serk
相关产品推荐
相关产品推荐

