cassandra高音量写入有时会无声地失败

时间:2015-12-22 21:40:52

标签: java cassandra datastax datastax-java-driver

我正在使用Datastax Cassandra java驱动程序记录实时交易数据。我已将Cassandra配置为单个节点,复制因子为1,一致性级别为ALL。

我经常写的不记录,但不会失败。 java客户端不会抛出任何错误,并且会调用异步执行成功回调。 Trace似乎没有显示任何异常:

  

[CassandraClient] - 在2015年12月22日星期一22:54:04添加到/10.0.0.118 [SharedPool-Worker-1]上可记忆的交易

     

[CassandraClient] - 在2015年12月22日星期一22:54:04附加到/10.0.0.118 [SharedPool-Worker-1]上的提交日志

     

[CassandraClient] - 协调员使用/10.0.0.118

但是,当我查看cassandra shell中的数据时,请注意跳过的ID(忽略错误的日期):

  

cqlsh:密钥空间>从交易中选择*,其中按日期排序限制10;

 date                     | id     | price  | volume
--------------------------+--------+--------+------------
 1970-01-17 19:00:19+0000 | 729286 | 435.96 |  3.4410000
 1970-01-17 19:00:19+0000 | 729284 | 436.00 | 17.4000000
 1970-01-17 19:00:19+0000 | 729283 | 436.00 |  0.1300000
 1970-01-17 19:00:19+0000 | 729277 | 436.45 |  5.6972000
 1970-01-17 19:00:19+0000 | 729276 | 436.44 |  1.0000000
 1970-01-17 19:00:19+0000 | 729275 | 436.44 |  0.9728478
 1970-01-17 19:00:19+0000 | 729274 | 436.43 |  0.0700070
 1970-01-17 19:00:19+0000 | 729273 | 436.45 |  0.0369260
 1970-01-17 19:00:19+0000 | 729272 | 436.43 |  1.0000000
 1970-01-17 19:00:19+0000 | 729271 | 436.43 |  1.0000000

为什么有些插入会无声地失败?指示指向时间戳问题,但我没有检测到模式。

类似的问题:Cassandra - Write doesn't fail, but values aren't inserted

可能与:Cassandra update fails silently with several nodes

有关

1 个答案:

答案 0 :(得分:0)

写入成功并且缺少某些记录的事实是C * 覆盖缺失的行的症状。您可能会看到此类行为的原因是滥用绑定语句。

通常人们准备语句:

PreparedStatement ps = ...;
BoundStatement bs = ps.bind();
然后他们发出类似的话:

for (int i = 0; i < myHugeNumberOfRowsToInsert; i++) {
    session.executeAsync(bs.bind(xx));    
}

这实际上会产生奇怪的行为,因为绑定语句在大多数executeAsync调用中是相同的,并且如果循环足够快以排队(比如说)6个查询在驱动程序触发第一个查询之前,所有提交的查询共享相同的绑定数据。一个简单的解决方法是实际发出不同的 BoundStatement

for (int i = 0; i < myHugeNumberOfRowsToInsert; i++) {
    session.executeAsync(new BoundStatement(ps).bind(xx));    
}

这将保证每个语句唯一,并且根本不可能覆盖