如何找到一个cassandra keyspace占用的总数space?

How to find the total space occupied by a cassandra keyspace?

我正在尝试查找 cassandra 密钥占用的总物理大小space。

我有一个消息生成器,可以将大量消息转储到 cassandra。我想找出 cassandra Table 中消息的总物理大小。

当我这样做时 du -h /mnt/data/keyspace linux 说只有 12kb。我确信数据大小远大于此。其余数据必须或者在内存表中或者应该在压缩中。

如何找到该键 space 在 cassandra 中占用的总数 space?

我尝试了

     nodetool cfstats <keyspace>

但它只给我那个特定节点。并且字节也存在于 memtable 中。我实际上想要跨集群中所有节点实际写入磁盘的 k​​eyspaces 的总大小。有什么命令可以找到这个吗?

感谢您的帮助。

什么是压缩?

SStables 是不可变的——一旦 memtable 被刷新到磁盘,它就会保持不变,直到它被删除(过期)或压缩。压缩是将 sstables 组合在一起的过程。当您的工作负载更新很重并且您可能在 SSTables 中存储了多个 CQL 行实例时,这一点很重要(请参阅 nodetool cfhistograms 中每次读取的 sstables)。当您去读取该行时,您可能必须扫描多个 sstables 才能找到最新版本的数据(在 c* 中最后写入获胜)。当我们压缩时,我们可能会在磁盘上占用额外的 space(尤其是大小分层压缩,这可能占用——这是理论上的最大值——压缩时你的数据大小的 50%)所以保持可用磁盘 space。但是,压缩不会从您的 keyspace 目录中带走数据。这不是您的数据所在的位置。

那我的数据去哪儿了?

您的怀疑是正确的,尚未刷新到磁盘的数据必须位于 memtables 中。这些数据将在您提交日志后立即写入磁盘填满(2.0 中默认为 1gb 或 2.1 中为 8gb)或者一旦你的 memtables 变得太大——memtable_total_space_in_mb.

如果你想在 sstables 中查看你的数据,你可以手动刷新它:

nodetool flush

并且您的 memtables 将以 SSTables 的形式放入您的 KS 目录中。或者耐心等待,直到达到提交日志或内存表阈值。

但是 cassandra 写的不是持久的吗?

是的,您的内存表数据也存储在提交日志中。如果你的机器断电等,已经写入的数据仍然保存在磁盘上,提交日志数据将在启动时重播!

我用nodetool status <keyspace>。负载列值与我使用 df -h 获得的值大致相同(我的 cassandra 安装在与系统不同的分区上。

您可以获取列族统计信息,过滤 space 已用并对数字求和:

nodetool cfstats <keyspace> | grep 'Space used (total), bytes' | awk -F ": " '{s+=}END{print s}'