2013-04-11 92 views
3

我想设计我的集群,并且希望根据表/列家族的大小设置适当的key_cache和row_cache大小 。 与mysql类似,我们在Cassandra/CQL中有类似的东西吗?如何以MB为单位获取Cassandra Table/ColumnFamily大小

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

键缓存和行缓存的工作方式不同。了解计算大小的差异很重要。

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

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

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

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

+0

让我告诉你我的应用程序设计。所以基本上,我有一个Web服务,并且每个请求应用程序执行大约500 <#ofDatabaseQueries <1000。总行数约为10亿,随着时间的推移它会不断增加,每行不超过100库仑(按照表格),并且没有列有大量数据。显然,我将使用云并在不同节点之间分发数据,但出于测试目的,我正在使用单个节点。我认为最好的方法是缓存所有行,以便每个请求的数据库查询数可以正确处理。 – piyush 2013-04-11 12:53:21

+0

行缓存可能是一个很好的选择,但如果可以的话,您应该尝试减少每个请求的数据库查询数。 Cassandra可能每个节点每秒处理10k次读取,因此每个节点每秒只有10个请求。 – Richard 2013-04-11 12:59:11

+0

从哪里得到这个数字10k读取/秒/节点,是不是取决于硬件?这是一个很好的信息顺便说一句,你可以分享一些链接,我可以看到这些性能相关的信息。 查询/请求并不都是唯一的,所以我猜,行缓存会对我有帮助,我是cassandra的新手,我正在阅读关于它的所有内容。 – piyush 2013-04-11 13:20:52

相关问题