Cassandra轻量级交易性能损失

时间:2016-06-07 02:30:36

标签: performance cassandra consistency nosql

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

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

我现在有两个解决方案。

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

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

  3. 解决方案2将使插入“原子”,但文档说它会有性能损失。在解决方案1中,我发送了2个查询,这也将导致性能下降。

    目前我正在使用解决方案1.我是cassandra轻量级事务的新手,因此我不知道原子性的成本。有谁知道哪种解决方案更好?

1 个答案:

答案 0 :(得分:5)

基本上你有几个选择:

  1. 插入"信任"独特 - 你"某种程度上""提前知道您插入的任何项目都不存在于表格中,因此您只需插入并递增计数器而不检查任何内容
  2. 使用轻量级事务进行插入 - 使用IF NOT EXISTS(几乎可以保证一致性,除非增量计数器失败/超时 - 在极少数情况下,您可能会遇到计数不足或超量)。此选项允许并发客户端。
  3. 读取/写入一致性级别为ONE(如果您运行频繁的插入,可能会遇到写入和读取之间的一致性问题;还要确保没有并发客户端做同样的事情)
  4. 读取/写入一致性级别QUORUM(读取将与上次写入一致,但您仍需确保没有并发客户端。
  5. 有一天,我正在针对 m3.large 个实例(https://aws.amazon.com/ec2/instance-types/)的3x Cassandra集群进行简单测试 在单个线程中,每个分区有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
    

    请注意,仲裁意外地快一点,但可能在误差范围内和/或可能是由于群集拓扑的细节。