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