我有两个cassandra表,一个记录表和一个计数器表 . 计数器表为记录表中的每种记录保留一个计数器 .
当我将新记录插入记录表时,我将同时更新计数器表 . 但新记录可能已经在记录表中 . 可以两次插入相同的记录,但之后我会将计数器添加两次,这是不正确的 .
我现在有两个解决方案 .
-
使用新记录键从cassandra中获取记录 . 如果它不为null,我将不会插入记录并增加计数器 .
-
使用轻量级事务让cassandra检查记录是否已存在 .
解决方案2将使插入“原子”,但文档说它会有性能损失 . 在解决方案1中,我发送了2个查询,这也将导致性能下降 .
目前我正在使用解决方案1.我是cassandra轻量级事务的新手,所以我不知道原子性的成本 . 有谁知道哪种解决方案更好?
1 回答
基本上你有几个选择:
插入"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:
The results:
请注意,仲裁意外地快一点,但可能在误差范围内和/或可能是由于群集拓扑的细节 .