Cassandra轻量级交易性能处罚



我有两个cassandra表,一个记录表和一个计数器表。计数器表为记录表中的每种记录保留一个计数器。

当我在记录表中插入新记录时,我将同时更新计数器表。但有可能新记录已经在记录表中了。插入两次相同的记录是可以的,但我会添加两次计数器,这是不正确的。

我现在有两个解决方案。

  1. 使用新的记录密钥从cassandra获取一条记录。如果它不为空,我将不会插入记录并增加计数器。

  2. 使用轻量级事务让cassandra检查记录是否已经存在。

解决方案2将使插入成为"原子",但文档表示它将受到性能惩罚。在解决方案1中,我发送了2个查询,这也会对性能造成影响。

目前我使用的是解决方案1。我是cassandra轻量级交易的新手,所以我不知道原子性的成本。有人知道哪种解决方案更好吗?

基本上你有几个选项:

  1. 插入"可信的"唯一-您"不知何故"提前知道您插入的任何项目都不存在于表中,所以您只需插入并递增计数器,而不检查任何内容
  2. 使用轻量级事务插入-使用IF NOT EXISTS(几乎可以保证一致性,除非增量计数器失败/超时-在这种罕见的情况下,您可能会遇到计数不足或计数过高的情况)。此选项允许并发客户端
  3. 一致性级别为一的读/写(如果频繁运行插入,则可能会遇到写和读之间的一致性问题;还请确保没有并发客户端在做同样的事情)
  4. 读取/写入的一致性级别为QUORUM(读取将与上次写入一致,但是,您仍然必须确保没有并发客户端

有一天,我对m3的3x Cassandra集群运行了一个简单的测试。大型实例(https://aws.amazon.com/ec2/instance-types/)在单个线程中,有100个分区,每个分区中有100个插入(总共10k个插入),因此这不是IO饱和测试。

模式:

CREATE TABLE IF NOT EXISTS parent_children (
parentId uuid,
childId uuid, 
PRIMARY KEY (parentId, childId)
);
CREATE TABLE IF NOT EXISTS child_counters (
parentId uuid,
count counter, 
PRIMARY KEY (parentId)
);

结果:

Insertion Method    Latency per insert, ms
TRUSTED UNIQUE      1.6404
IF NOT EXISTS       4.2801
READ WRITE ONE      3.9382
READ WRITE QUORUM   3.7714

请注意,quorum出乎意料地快了一点,但这可能在误差范围内,和/或可能是由于集群拓扑的具体情况。

最新更新