0

我们遇到了在cassandra表中写入数据的问题。Cassandra插入失败

流程如下..我们使用一些主键从XXX中删除所有记录。 然后在循环中插入新的。

execute("DELETE FROM XXX WHERE key = {SOME_UUID}"); 

for(int i = 0; i < 5; ++i) { 
    execute("INSERT INTO XXX (key, field1, field2) VALUES ({SOME UUID},'field1','field2')"; 
} 

结果:有时不是所有的行都插入表中。查询表后,我们看到并未插入所有行。

的环境,我们有:

我们使用DataStax企业版(4.5.2)。卡桑德拉2.0.10。 数据中心有4个节点,我们的密钥空间设置为replication_factor设置为3. 查询CONSISTENCY_LEVEL设置为LOCAL_QUORUM

java驱动程序是数据stax企业2.1.1

在此先感谢。 任何帮助,将不胜感激。

+0

日志是否显示任何内容(尝试在dbug中运行)? – 2014-09-29 12:55:54

+0

在日志中没有可疑的东西。没有例外。没有查询被标记为失败... – Daa 2014-09-29 14:17:58

+0

尝试将您的写入一致性降至“ONE”并查看是否有所作为。 – Aaron 2014-09-29 14:50:51

回答

1

我在你的例子中假设SOME_UUID对于删除和插入是相同的。

这可能是删除(逻辑删除)和传播到所有节点的新插入(根据您的复制因子)之间的竞争条件。如果删除和插入标记有相同的时间戳,则删除将获胜。您可能会遇到在某些节点上删除成功的情况,而在其他节点上,插入成功。

您可以尝试将RF降至1,如@ BryceAtNetwork23建议的那样。

另一个测试是在删除和插入for循环之间的示例代码中插入一个延迟(如500ms)。这会给插入前的删除传播时间。

根据您的数据模型,这里最好的解决方案可能是避免删除。

+0

那么我们试着CL = 1。keyspace的RF是2,CL = 1。我们遇到了同样的问题。所以我们切换到RF = 3 CL = QUORUM。我们试图在删除和插入之间加入一些延迟,看起来像是有帮助的...所以我们可以假设看到Cassandra这样的行为是正常的吗? – Daa 2014-09-29 22:52:36

+1

@Daa虽然我不认为这应该真的被认为是“正常”的行为,但我可以告诉你,经常从表中删除数据被认为是Cassandra的反模式。也许有一种方法可以让你人为地过期(而不是删除它)并添加一个新的? – Aaron 2014-09-30 00:12:20

+1

关于具有相同时间戳的查询:请注意,在驱动程序即将推出的版本2.1.2中,如果使用Cassandra> = 2.1.0,则时间戳将生成客户端,因此不应再发生。 – 2014-09-30 07:46:04