首页 文章

Cassandra轻量级交易性能惩罚

提问于
浏览
2

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

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

我现在有两个解决方案 .

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

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

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

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

1 回答

  • 5

    基本上你有几个选择:

    • 插入"trusted" unique - 你"somehow"“提前知道您插入的任何项目都不存在于表格中,因此您只需插入并递增计数器而不检查任何内容

    • 使用轻量级事务插入 - 使用IF NOT EXISTS(几乎保证一致性,除非增量计数器失败/超时 - 在极少数情况下,您可能会遇到计数不足或超量) . 此选项允许并发客户端 .

    • 具有一致性级别ONE的读/写(如果您运行频繁的插入,则可能会遇到写入和读取之间的一致性问题;还要确保 NO concurrent clients 执行相同的操作)

    • 具有一致性级别QUORUM的读/写(读取将与上次写入一致,但是,您仍然必须确保没有并发客户端 .

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

    The schema:

    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)
    );
    

    The results:

    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
    

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

相关问题