对于在SELECT查询上有550万条记录的表,Cassandra读取超时激活正在发生。
com.datastax.driver.core.exceptions.ReadTimeoutException:Cassandra 在一致性LOCAL_ONE读取查询期间超时(1个响应是 需要但只有0副本响应) com.datastax.driver.core.exceptions.ReadTimeoutException.copy(ReadTimeoutException.java:88) 在 com.datastax.driver.core.exceptions.ReadTimeoutException.copy(ReadTimeoutException.java:25) 在 com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37) 在 com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:245) 在 com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:68) 在 com.batchjob.util.DataUtil.getFaIdClientIdKeysDataList(DataUtil.java:50)
我们正在尝试基于CURRENT_DATE列进行检索,如下面的查询
中所示net use
cassandra.yaml 文件配置:
Statement stmt = QueryBuilder.select().column("FA_ID").column("CLIENT_ID").from(tableName).allowFiltering().where(lt("CURRENT_DATE",localDate)).setFetchSize(5);
ResultSet rs = session.execute(stmt);
我们还有read_request_timeout_in_ms: 360000
write_request_timeout_in_ms: 360000
request_timeout_in_ms: 360000
counter_write_request_timeout_in_ms: 10000
tombstone_failure_threshold: 600000
指定的表,因为我们有删除墓碑的DELETE作业。
识别问题的任何解决方案都会对我们有所帮助!
基本上问题只发生在下面的表中,其中记录的数量是以百万计。 注意 - 此READ Timeout问题具有特定模式 - 通常是每周一发生。从星期二到星期日,不要在一周中的其他日子里开始工作。每天都会定期开始工作。
560万(表X) 370万(表Y) 用于获取记录的代码段:gc_grace_seconds = 86400(1 DAY)
以下是数据模型。目前,我们没有在表中的任何列上维护任何索引。
public List<DataDeleteObject> getFaIdClientIdKeysDataList(String tableName) {
List<DataDeleteObject> dataDeleteObjList = new ArrayList<DataDeleteObject>();
Statement stmt = QueryBuilder.select().column(CommonConstantInterface.FA_ID)
.column(CommonConstantInterface.CLIENT_ID).from(tableName)
.allowFiltering().where(lt(CommonConstantInterface.CURRENT_DATE, getCurrentDate()))
.setFetchSize(5);
ResultSet rs = config.getSession().execute(stmt);
DataDeleteObject fgaDO = null;
int count = 0;
while (!rs.isExhausted()) {
count++;
Row row = rs.one();
fgaDO = new DataDeleteObject();
fgaDO.setFaId(row.getString(CommonConstantInterface.FA_ID));
fgaDO.setClientId(row.getVarint(CommonConstantInterface.CLIENT_ID));
dataDeleteObjList.add(fgaDO);
}
return dataDeleteObjList;
}