我有一个带有开箱即用配置的3节点2.x Cassandra集群。我的java程序使用datastax驱动程序(2.19)通过一次执行一个CQL / DDL语句来创建模式。我发现很多时候,对于多个语句,架构更改需要几十秒的架构协议。需要很长时间的声明几乎是随机的。
我正在寻找有关如何提高架构协议速度的提示。
注意: - 当我使用cqlsh创建架构时,它非常快。
更新08/12/2016
我添加了以下代码来执行语句,然后等待架构协议,以便我可以更深入地了解等待的时间。
private void executeStatement(String statement, PrintStream out) throws DBInstallerException {
int retries = 0;
final ResultSet resultSet = session.execute(statement);
if (!resultSet.getExecutionInfo().isSchemaInAgreement()) {
for (; retries < TOTAL_WAIT_FOR_SCHEMA_AGREEMENT_IN_SECONDS; retries++) {
Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
if (cluster.getMetadata().checkSchemaAgreement()) {
break;
}
}
}
if (retries >= TOTAL_WAIT_FOR_SCHEMA_AGREEMENT_IN_SECONDS) {
throw new DBInstallerException("Failed to get schema agreement after " + TOTAL_WAIT_FOR_SCHEMA_AGREEMENT_IN_SECONDS + " seconds");
} else {
if (retries > 0 ) {
out.println("INFO : Got schema agreement after " + retries + " retries");
}
}
}
很多时候我在&#34;之后得到&#34;获得了架构协议。输出打印到控制台,重试次数可以多达300次。这对我来说没有意义。如何在任何基本上空闲的系统上执行任何模式更改都需要花费很长时间。
答案 0 :(得分:1)
这可能不是您问题的直接答案,但它可能导致使用datastax驱动程序与cqlsh的速度变慢。驱动程序效率低下当客户端进行架构更改时,它不应该(JAVA-1120)将执行每个与架构相关的语句的返回时间延迟1秒。
如果你能够,升级到java-driver 3.0.3+将为你解决这个问题。
否则你可以像这样禁用模式刷新debouncing:
Cluster.builder()
.withQueryOptions(new QueryOptions().setRefreshSchemaIntervalMillis(0))
//... more builder options
.build()