如何为 MemSql 中删除的数据库释放 space

How to free space for dropped database in MemSql

我是 MemSQL 的新手。我在具有 5 个叶节点和 2 个聚合器节点的集群上的 MemSQL 中创建了一个数据库和 tables。 Spark 在同一个集群上 运行。 一切都处于默认模式。插入数据和删除一样。 select * 没有 return 任何东西。但是当我看到 web clusterUI 时,每个叶节点仍在消耗大约 6TB 的磁盘 space。

磁盘容量描述说"This is is amount of disk space used by MemSQL relative to total disk space available. When this is full, no snapshot, transaction logs or columnstore data can be created"。

根据这个描述,我假设 6TB 以上的磁盘 space 是因为使用了 MemSQL。

能否请一些人澄清一下

  1. 默认情况下 MemSQL 是否也将数据写入磁盘?
  2. 即使删除内容并删除后,是否也没有删除写入磁盘的数据table?
  3. 如何释放 MemSQL 使用的磁盘 space?我要删除哪个目录?我发现目录“/var/lib/memsql/leaf-3306”包含此叶节点的所有 memsql 工件。

6TB 的使用量可能是因为 MemSQL,也可能是因为 Spark 或其他进程。 MemSQL ops 报告总磁盘使用情况,而不是 MemSQL 使用的磁盘(工具提示有点误导)。

1) Rowstore tables(tables WITHOUT a CLUSTERD COLUMNSTORE index)将每次写入的日志写入磁盘。当日志变大时,日志会合并成快照,默认情况下,我们会保留最后两个快照文件。因此,两个快照中较旧的一个可能包含您删除的数据。您可以使用 SNAPSHOT <dbName> 触发新的快照,这将让 GC 清理旧的(可能是大的)快照。

2) 快照和日志是每个数据库的,而不是每个 table。删除 table 不会触发 snapshot/log 清理,但删除数据库或触发新快照会。

3) 您可能不应该手动删除数据目录。 DROP DATABASE <db_name> 将删除与该数据库关联的所有数据。

对于列存储 tables,情况略有不同,但我假设 "Everything is default" 意味着没有列存储 tables。

您是否删除了数据库(如 DROP DATABASE db)或删除了所有数据(如 DELETE FROM tTRUNCATE TABLE t)?

如果是前者,磁盘使用率应该会立即下降,如果没有,我可以帮助您调查是什么在消耗它。

如果是后者,那就说得通了。 MemSQL 使用事务日志和快照来实现持久性。在这种特殊情况下,当您插入 X 量的数据,然后删除 X 量的数据时,事务日志在磁盘上的长度将是 2X,因此在恢复时它可以重放所有插入和所有删除。为了缩小它,MemSQL 偶尔会拍摄快照(其他一些数据库引擎称它们为检查点)。它通常在日志达到一定大小时这样做,在您的情况下,显然还没有达到。如果你想释放磁盘 space,你可以手动触发快照,运行 SNAPSHOT db 在聚合器上(db 是你的数据库的名称),并且它应该有帮助。

占用的内存只有在GC触发后才会释放。 Memsql 将所有数据保存在内存中。即使我们删除了表、数据库、行等,如果 GC 没有发生,内存也将不可用。 从命令提示符强制执行 GC,它将释放内存:

memsql>触发full gc flush;

比较free -m触发命令前后。 你会看到区别:)