3

我想设计我的集群,并希望根据表/列的大小设置适当的 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";

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

或者在不考虑任何复制因素的情况下,需要对每个节点进行什么配置才能将我的表完全放入内存中。

4

1 回答 1

1

键缓存和行缓存的工作方式完全不同。了解计算尺寸的差异很重要。

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

行缓存缓存实际行。要对此进行大小估计,您可以使用“nodetool cfstats”中的“已用空间”参数。但是,行缓存缓存反序列化的数据并且仅缓存最新的副本,因此大小可能完全不同(更高或更低)。

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

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

于 2013-04-11T12:34:08.157 回答