Apache Ignite集群快照恢复失败及验证异常问题排查请求
Apache Ignite 快照恢复失败与
--snapshot check集群崩溃问题排查 问题背景
3节点跨服务器Ignite集群(ZK作为发现机制),在Ignite 2.13.0/2.14.0 + OpenJDK 1.8.0环境下执行快照恢复时遇到以下问题:
- 按官方流程销毁目标缓存
CACHE_XYZ后,执行恢复命令触发全节点java.lang.NegativeArraySizeException,恢复中止 - 执行
--snapshot check命令时无法连接集群,且执行后所有节点意外停止,需手动重启
操作流程:
# 创建快照 ./bin/control.sh --snapshot create 20230412_snapshot_test_v1 # 销毁目标缓存 ./bin/control.sh --cache destroy --caches CACHE_XYZ --yes # 执行恢复 ./bin/control.sh --snapshot restore 20230412_snapshot_test_v1 --start --groups CACHE_XYZ
问题根源拆解
1. NegativeArraySizeException触发原因
该异常本质是代码尝试创建负长度数组,在快照恢复场景中,核心诱因是:
- 缓存销毁后,ZK中的集群元数据未完全同步,恢复时节点读取到不一致的分区计数,导致分区分配计算出现负数
- 快照创建时的缓存配置(分区数、备份数)与恢复前的集群配置不匹配,恢复流程中分区数据计算逻辑异常
- 错误使用
--groups参数:--groups用于指定缓存组而非单个缓存,传入缓存名会导致元数据解析错误
2. --snapshot check导致集群崩溃的原因
Ignite 2.13.x/2.14.x版本存在已知bug:当集群使用ZK作为发现机制时,--snapshot check命令会触发节点间元数据不一致,引发未捕获的异常导致节点退出。
解决方案
步骤1:确保缓存销毁后的元数据同步
销毁缓存后,等待30秒以上,通过以下命令确认缓存已完全从集群中移除,确保ZK元数据同步完成:
./bin/control.sh --cache list
步骤2:修正恢复命令参数
将--groups替换为--caches(针对单个缓存恢复):
./bin/control.sh --snapshot restore 20230412_snapshot_test_v1 --start --caches CACHE_XYZ
步骤3:规避--snapshot check命令的bug
在Ignite 2.15.0之前的版本,禁止使用该命令,改用以下方式验证快照完整性:
- 检查各节点快照目录(默认
work/snapshots/[快照名])下的文件完整性,每个缓存的分区文件数量应与缓存分区数一致 - 查看快照创建时的节点日志,确认无异常输出
步骤4:升级Ignite版本至2.15.0+
官方在2.15.0版本中修复了多个快照相关bug,包括本次遇到的NegativeArraySizeException和--snapshot check集群崩溃问题,升级后可彻底解决此类问题。
步骤5:手动清理ZK残留元数据(若上述步骤无效)
如果ZK中存在损坏的缓存元数据,需手动清理:
- 停止所有Ignite节点
- 登录ZK客户端,删除Ignite元数据节点(默认路径
/apacheIgnite) - 重启Ignite节点,重新创建缓存后再执行恢复操作
验证恢复结果
恢复完成后,执行以下命令确认缓存状态正常:
# 确认缓存已恢复并启动 ./bin/control.sh --cache list # 检查缓存数据量 ./bin/ignitevisorcmd.sh -c "cache -size CACHE_XYZ"
内容的提问来源于stack exchange,提问作者cookie_marsh
相关产品推荐
相关产品推荐

