Apache Ignite 2.7.5删除缓存释放磁盘及堆外内存的方案咨询
Ignite 2.7.5带持久化集群大缓存删除实操方案
之前操作失败的核心根因
- 调用
removeAll() + destroy()导致节点挂起、连接断开的问题:编写的删除代码多了完全不必要的cache.removeAll()步骤。开启持久化的大缓存场景下,removeAll()会触发全量记录的逐行加载、索引清理、持久化页逐行标记操作,1.5亿条记录的规模下,单次操作会瞬间占满节点的堆外内存配额,触发长时间的STW停顿甚至OOM掉线。而destroy()本身就会触发集群层面的批量持久化清理,根本不需要先做全量逐行删除。 - 手动执行
rm cache-XYZ导致集群启动失败、control.sh挂起的问题:
注意:Ignite 2.7.5 对缓存目录的命名规则为:将缓存名经过CRC32哈希计算后转为十六进制值,最终目录名为
cache-<哈希值>,并非直接使用缓存名拼接路径。
手动删除的cache-XYZ大概率根本不是目标缓存的真实数据目录,即使删对了目录,全局元数据文件、分区映射、持久化校验和文件里依然残留着该缓存的存在记录,导致元数据和磁盘实际文件不一致,节点启动时卡在校验流程,control.sh因为连不上正常响应的节点自然会一直等待没有返回。
可落地的分步删除流程(无资源打满、无集群异常)
- 先修复之前手动操作导致的集群异常状态:停掉所有节点的Ignite进程,逐个检查每个节点的持久化根目录,定位
XYZCache对应的真实缓存ID(可从db/目录下的全局元数据.bin文件中查询缓存名与缓存ID的映射关系),清除该缓存对应的所有残留文件(包括对应数据目录、分区标记条目、元数据中的对应记录),清理完成后再逐个启动节点,执行./control.sh --baseline确认能正常返回基线拓扑,验证集群恢复正常通信。 - 直接调用原生缓存销毁接口,跳过全量逐行删除步骤:不要在Spring接口里同步等待全量删除完成,直接通过节点本地的
ignite.destroyCache("XYZCache")触发缓存销毁,调用时采用异步执行模式,让销毁任务按分片逐批在节点后台运行——每个节点每次只处理本地1-2个缓存分区的销毁任务,每处理100个持久化页主动让出工作线程,不会出现线程被占满导致节点挂起、客户端连接断开的问题。 - 手动触发磁盘与内存空间回收:缓存销毁操作完成后,2.7.5版本不会自动立刻释放磁盘和堆外内存,原有的缓存数据页只是被标记为空闲状态。需要在每个节点上执行
./control.sh --compress触发持久化压缩流程,等压缩执行完成后,系统会真正把被标记为空闲的单节点250G磁盘空间释放给操作系统,堆外内存中被该缓存占用的区域也会被同步回收。
效率对比
整套流程的总耗时通常在2-4小时区间,对比逐记录删除需要8周的效率提升达到数量级:因为整个流程不需要遍历1.5亿条具体记录,直接通过元数据标记+批量持久化页清理的方式完成删除,既不会打满节点资源,也能完整回收磁盘和内存空间。
内容的提问来源于stack exchange,提问作者User_Targaryen
相关产品推荐
相关产品推荐

