如何获得以MB为单位的Cassandra Table / Columnfamily大小

时间:2013-04-11 10:58:37

标签: nosql cassandra cql

我想设计我的集群,并希望设置key_cache和row_cache的正确大小 取决于表/列家庭的大小。 与mysql类似,我们在Cassandra / CQL中有这样的东西吗?

SELECT table_name AS "Tables", 
round(((data_length + index_length) / 1024 / 1024), 2) "Size in MB" 
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME";

或者分别查找数据大小和索引大小的任何其他方法。

或者将我的表完全放入内存需要每个节点的配置 不考虑任何复制因素。

1 个答案:

答案 0 :(得分:1)

密钥缓存和行缓存的工作方式不同。了解计算尺寸的差异非常重要。

密钥缓存是文件中用于行位置的偏移缓存。它基本上是从(键,文件)到偏移的映射。因此,缩放密钥缓存大小取决于行数,而不是整体数据大小。您可以在'nodetool cfstats'中的'Number of keys'参数中找到行数。请注意,这是每个节点,而不是总计,但这是您要决定的高速缓存大小。默认大小为min(堆的5%(以MB为单位),100MB),这对于大多数应用程序来说可能已足够。这里的一个微妙之处是行可能存在于多个文件(SSTables)中,数量取决于您的写入模式。但是,这种重复在(大约)来自nodetool的估计计数中得到了解释。

行缓存缓存实际行。要获得此大小估计,您可以使用'nodetool cfstats'中的'使用空间'参数。但是,行缓存会缓存反序列化的数据,只缓存最新的副本,因此大小可能会大不相同(更高或更低)。

还有第三个可配置的缓存 - 您的操作系统文件系统缓存。在大多数情况下,这实际上比行缓存更好。它避免了在内存中复制数据,因为在使用行缓存时,最有可能的数据也会出现在文件系统缓存中。从文件系统缓存中的SSTable读取比我实验中的行缓存慢30%(前一段时间,可能不再有效但不太可能有显着差异)。行缓存的主要用例是当您要确保缓存一个相对较小的CF时。否则使用文件系统缓存可能是最好的。

总之,Cassandra默认的大型密钥缓存,没有行缓存是大多数设置的最佳选择。如果您知道您的访问模式不适用于默认值或者您遇到性能问题,则应该只使用缓存。