【问题标题】:How to find the total space occupied by a cassandra keyspace?如何找到 cassandra 键空间占用的总空间?
【发布时间】:2015-07-07 01:27:54
【问题描述】:

我正在尝试查找 cassandra 键空间占用的总物理大小。

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

当我做du -h /mnt/data/keyspace 时,linux 说只有 12kb。我确信数据大小远大于此。其余数据必须要么在memtables中或者应该在compaction中。

如何找到该键空间在 cassandra 中占用的总空间?

我试过了

     nodetool cfstats <keyspace>

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

感谢您的帮助。

【问题讨论】:

  • 您可以在集群周围的键空间数据目录中 du -h 并添加。 JMX 中可能还有一个 sstable 大小的 mbean,但我认为它是每个表而不是键空间。
  • du -h 将不包括 memtable size 。如何确保正在进行的压缩完成?
  • 我以为你说你想要键空间的大小,因为它们被写入磁盘。
  • 你的 memtables 将永远是
  • 我有一个 msg 生成器,可以将大量消息转储到 cassandra 。我想找出 cassandra 表中消息的总物理大小。当我执行 du -h /mnt/data/keyspace 时,它​​说只有 12kb,因为我确信数据大小远不止于此。所以实际数据要么在内存表中,要么应该在压缩中。如何找到该键空间在 cassandra 中占用的总空间?感谢您的帮助。

标签: cassandra


【解决方案1】:

什么是压缩?

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

那我的数据去哪儿了?

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

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

nodetool flush

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

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

是的,您的 memtable 数据也存储在提交日志中。如果您的机器断电等,已写入的数据仍会保存到磁盘,并且提交日志数据将在启动时重放!

【讨论】:

  • 这似乎没有回答“我实际上想要跨集群中所有节点实际写入磁盘的键空间的总大小”的问题。有什么命令可以找到这个吗?'
【解决方案2】:

我使用nodetool status &lt;keyspace&gt;。 load 列的值与我​​使用df -h 得到的值大致相同(我的 cassandra 安装在与系统不同的分区上。

【讨论】:

  • AFAIK, nodetool status 不接受 &lt;keyspace&gt; 参数,但显示整个集群的状态。
【解决方案3】:

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

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

【讨论】:

  • 使用 numfmtawk 将字节转换为人类可读的(即 kiB、MiB 等):awk '{ split( "B KiB MiB GiB TiB PiB" , v ); s=1; while( $1&gt;1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }'
猜你喜欢
  • 2019-06-22
  • 2013-11-02
  • 1970-01-01
  • 2017-04-28
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 2019-08-16
相关资源
最近更新 更多