我已经使用datastax java driver 1.0.1
和cassandra 1.2.6将代码库从Thrift
更改为CQL
。
使用Thrift时,我从一开始就经常出现超时错误,无法进行下去......采用CQL之后,按照其设计的表我获得了成功并减少了超时情况......
有了这个变化后,我能够插入大量数据,这些数据在使用Thrift时无法工作......但是在一个阶段后,数据文件夹大小约为3.5GB。我会经常收到写入超时异常。即使我重新设置相同的先前可用的用例,现在也会抛出超时异常。它是随机的,曾经有效现在不再有效。
CASSADNRA SERVER LOG
这是cassandra服务器部分日志调试模式,在我遇到错误时记录:
客户端异常是:
Caused by: com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency ONE (1 replica were required but only 0 acknowledged the write)
at com.datastax.driver.core.exceptions.WriteTimeoutException.copy(WriteTimeoutException.java:54)
at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:214)
at com.datastax.driver.core.ResultSetFuture.getUninterruptibly(ResultSetFuture.java:169)
at com.datastax.driver.core.Session.execute(Session.java:107)
at com.datastax.driver.core.Session.execute(Session.java:76)
基础设施: 使用一台配置为16GB内存,8GB堆大小,i7处理器的单节点cassandra,此处的yaml文件已进行超时调整,其他配置均为默认。
- read_request_timeout_in_ms: 30000
- range_request_timeout_in_ms: 30000
- write_request_timeout_in_ms: 30000
- truncate_request_timeout_in_ms: 60000
- request_timeout_in_ms: 30000
应用场景: 我正在运行一个将“组合”(我的项目术语)存储在cassandra中的应用程序。目前测试使用100个并行线程存储250,000个组合。每个线程存储一个组合。实际情况需要支持数千万个组合,但这需要不同的硬件和多节点集群。
存储一个组合大约需要2秒,并涉及以下操作:
- 527个INSERT INTO查询
- 506个UPDATE查询
- 954个SELECT查询
100个并行线程同时存储100个组合。
我发现写入超时的行为是随机的,有时可以工作到200,000个组合,然后会抛出超时异常,而有时甚至无法工作10,000个组合。这种行为是随机的。