Cassandra客户端代码具有高读取吞吐量和row_cache优化

时间:2016-04-22 16:11:05

标签: caching memory cassandra client

如果我一遍又一遍地阅读相同的记录(甚至是少量记录),有人可以指向cassandra客户端代码,该代码可以实现至少数十万次读取的读取吞吐量吗?我相信row_cache_size_in_mb应该将经常使用的记录缓存在内存中,但将其设置为10MB似乎没有任何区别。

我当然尝试了cassandra-stress,但是1KB记录(-col size=UNIFORM\(1000..1000\))达到的最高读取吞吐量是~15K / s。

如上所述,我可以很容易地编写一个基于内存的基于哈希映射的缓存,这样,对于一个小的工作集大小,每秒至少会有一百万次读取。我怎么让cassandra自动为我做这个?或者,即使对于微小的工作集大小,它是否应该在接近内存映射时实现性能?

2 个答案:

答案 0 :(得分:0)

  

如果我一遍又一遍地阅读相同的记录(甚至是少量记录),有人能指出cassandra客户端代码可以实现至少数十万次读取的读取吞吐量吗?

此方案有一些解决方案

一个想法是使用行缓存但要小心,对单个列的任何更新/删除都会使整个分区从缓存中失效,因此您将失去所有好处。行缓存最佳用法适用于小型数据集,并且经常被读取但几乎从未修改过。

您确定您的cassandra-stress场景从未一次又一次地更新或写入同一分区吗?

答案 1 :(得分:0)

以下是我的发现:当我将row_cache,counter_cache和key_cache都设置为相当大的值时,我能够使用“top”来验证cassandra根本没有磁盘I / O;这三个似乎都是确保没有磁盘活动所必需的。然而,尽管磁盘I / O为零,但即使一遍又一遍地读取单个记录,吞吐量也<20K / s。这可能证实了(在我的评论中也暗示过)cassandra即使其操作完全在内存中也会产生序列化和反序列化的成本,即,它不是为了与本机hashmap性能竞争而设计的。因此,如果您希望获得小工作集工作负载的本机散列图速度,但如果映射变大则扩展到磁盘,则需要在cassandra(或任何其他键值存储库)之上编写自己的缓存mongo,redis等等。

对于那些感兴趣的人,我还验证了redis在cassandra,mongo和redis中是最快的,用于简单的get / put小工作集工作负载,但即使redis也能达到~35K / s的读取吞吐量(很大程度上是独立的) ,按设计,请求大小),几乎没有接近本地hashmap性能,只返回指针,并可以超过200万/秒舒适地做到。