Apache Ignite 2.7.5 删除缓存并释放内存

问题描述

我们将 Apache Ignite(版本 2.7.5)用作启用了 ignite 持久性的 2 节点分区集群。

这 2 个 ignite 实例中的每一个都有一个缓存(例如,名为 XYZ),每个实例占用约 250 GB 的空间。该表有 1.5 亿条记录。

今后我们不再需要这个缓存,我想删除这个缓存并回收每个实例中的空间(磁盘空间以及堆外内存)。

我尝试了以下方法

  1. 尝试编写 API 以从缓存中删除所有数据并将其销毁。

    @DeleteMapping(path = "/delete-cache")
     public String deleteCache() {
         try {
             IgniteCache<XYZId,XYZ> cache = ignite.cache("XYZCache");
             cache.removeAll();
             cache.destroy();
         } catch (Exception e) {
    
             LOG.error("Exception while destroying cache: ",e);
    
             return "Fail";
         }
         return "Success";
     }
    

    但在点击此 API 时,Ignite 挂起,我的服务与 Ignite 失去连接。

  2. 尝试通过进入 ignite 实例并执行 rm cache-XYZ删除缓存。执行此操作后,由 ignite 实例回收的磁盘空间永远无法作为一个集群一起启动。点燃日志中没有特定错误,但执行以下操作:

./control.sh --baseline 没有给出任何结果,终端挂了。

目前,有一个 API 可以根据记录的 id 逐个删除对象,但以当前速度删除 1.5 亿个条目需要 8 周时间。

有没有更好的方法来实现这一目标?

解决方法

您可以只运行 cache.destroy();(无需删除每个条目) 它将破坏缓存并回收磁盘上的空间。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...