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

Cassandra client code with high read throughput with row_cache optimization

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

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

使用像上面这样的低数字,我可以轻松地编写一个基于内存中哈希图的缓存,这将使我在较小的工作集大小下每秒至少读取一百万次。我如何让 cassandra 自动为我做这件事?还是即使对于很小的工作集大小,它也不应该达到接近内存映射的性能?

Can someone point me to cassandra client code that can achieve a read throughput of at least hundreds of thousands of reads/s if I keep reading the same record (or even a small number of records) over and over?

这种情况有一些解决方案

一个想法是使用行缓存,但要小心,对单个列的任何 update/delete 都会使缓存中的整个分区无效,从而失去所有好处。行缓存的最佳用途是用于小型数据集,并且经常被读取但几乎从不修改。

您确定您的 cassandra 压力场景永远不会一遍又一遍地更新或写入同一个分区吗?

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

对于那些感兴趣的人,我还验证了 redis 在 cassandra、mongo 和简单的 get/put 小型工作集工作负载的 redis 中是最快的,但即使是 redis 也是最好的 ~ 35K/s 的读取吞吐量(在设计上很大程度上独立于请求大小),这几乎无法接近本机 hashmap 性能,后者仅 returns 指针并且可以在超过 2 million/s 时轻松完成。 =10=]