2

我是 MemSQL 的新手。我在集群上的 MemSQL 中创建了一个数据库和表,具有 5 个叶节点和 2 个聚合器节点。Spark 在同一个集群上运行。一切都处于默认模式。插入数据和删除相同。选择 * 不返回任何内容。但是当我看到 web clusterUI 时,每个叶子节点仍然消耗大约 6TB 的磁盘空间。

在此处输入图像描述 在此处输入图像描述 磁盘容量描述说“这是 MemSQL 使用的磁盘空间量相对于可用磁盘空间的总量。当它已满时,无法创建快照、事务日志或列存储数据”。

有了这个描述,我假设超过 6TB 的磁盘空间是因为 MemSQL 的使用。

可以请一些澄清

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

3 回答 3

5

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

1) 行存储表(没有 CLUSTERD COLUMNSTORE 索引的表)在每次写入时将日志写入磁盘。当日志变大时,日志会合并为快照,默认情况下,我们保留最后两个快照文件。因此,两个快照中较旧的一个可能包含您删除的数据。您可以使用 触发新快照SNAPSHOT <dbName>,这将使 GC 清理旧的(可能很大)快照。

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

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

对于列存储表,情况略有不同,但我假设“一切都是默认的”意味着没有列存储表。

于 2015-09-18T16:18:59.833 回答
2

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

如果是前者,磁盘使用量应该会立即减少,如果没有,我可以帮助您调查消耗它的原因。

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

于 2015-09-19T19:58:28.170 回答
-2

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

memsql> 触发完全 gc 刷新;

比较触发命令前后的free -m 。你会看到不同的:)

于 2016-04-28T09:14:42.997 回答