在 Cassandra 中设置一个表,设置如下:
- 主键列
shard
- 1 到 1000 之间的整数last_used
- 时间戳
- 值列:
value
- 一个 22 个字符的字符串
如果如何使用此表的示例:
shard last_used | value
------------------------------------
457 5/16/2012 4:56pm NBJO3poisdjdsa4djmka8k >-- Remove from front...
600 6/17/2013 5:58pm dndiapas09eidjs9dkakah |
...(1 million more rows) |
457 NOW NBJO3poisdjdsa4djmka8k <-- ..and put in back
该表用作一个巨大的队列。很多线程都试图“弹出”具有最低last_used
值的行,然后及时将last_used
值更新为当前时刻。这意味着一旦读取了一行,因为last_used
它是主键的一部分,该行将被删除,然后在“队列末尾”将具有相同shard
,value
和更新时间的新行添加到表中。last_used
之所以shard
存在,是因为有太多进程试图pop
将最旧的行从队列的前面移到后面,如果只有一个进程可以同时访问队列,它们就会严重地相互瓶颈。这些行被随机分成 1000 个不同的“碎片”。每次线程从队列的开头“弹出”一行时,它都会选择一个当前没有其他线程正在使用的分片(使用 redis)。
天哪,我们一定是哑巴!
我们遇到的问题是这个操作变得非常慢,大约 30 秒,几乎是永恒。
我们只使用 Cassandra 不到一个月,所以我们不确定我们在这里做错了什么。我们已经得到一些迹象,也许我们不应该在同一张桌子上写太多和读太多。我们不应该在 Cassandra 中这样做吗?或者我们的操作方式或我们配置它的方式是否存在一些细微差别,我们需要更改和/或调整?如何解决这个问题?
更多信息
- 我们正在使用 MurMur3Partitioner(新的随机分区器)
- 该集群目前在 9 台服务器上运行,每台服务器具有 2GB RAM。
- 复制因子为 3
非常感谢!