我们在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 Enterprise Edition(4.5.2) . Cassandra 2.0.10 . 数据中心有4个节点,我们处理的键空间 replication_factor
设置为3.查询 CONSISTENCY_LEVEL
设置为 LOCAL_QUORUM
.
java驱动程序是数据stax enterprise 2.1.1
提前致谢 . 任何帮助,将不胜感激 .
1 回答
我假设在您的示例中,删除和插入的SOME_UUID是相同的 .
它可能是删除(逻辑删除)和传播到所有节点的新插入(根据您的复制因子)之间的竞争条件 . 如果删除和插入标记有相同的时间戳,则删除将获胜 . 您可能会遇到某些节点上删除获胜的情况,而其他节点上的插入获胜 .
您可以尝试将RF降低到1,正如@ BryceAtNetwork23所建议的那样 .
另一个测试是在delete和insert for循环之间的示例代码中插入延迟(如500ms) . 这将为插入通过之前的删除提供时间 .
根据您的数据模型,此处的最佳解决方案可能是避免删除 .