2016-08-10 5 views
1

私は3つのノード2.xカサンドラクラスタを持っています。私のJavaプログラムはdatastaxドライバ(2.19)を使用して、CQL/DDL文を1つずつ実行してスキーマを作成します。私が気づいていることは、何度もスキーマを変更するとスキーマの合意が数回かかることです。長い時間を要する文章はかなりランダムです。カサンドラでスキーマ契約を迅速化するには?

私はスキーマ合意のスピードを向上させるためのヒントを探しています。

注: - 私がcqlshを使用してスキーマを作成すると、かなり高速です。

UPDATE 2016年8月12日

私は文を実行し、その後、私は待ち時間がどのくらいに少しより多くの洞察を得ることができるように、スキーマの合意を待つために、次のコードを追加しました。

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"); 
     } 
    } 
} 

何回も私は、コンソールに印刷出力「後のガットスキーマ協定」を取得し、これは私には意味がないものです限り多くの300として再試行をすることができます。基本的にアイドル状態のシステムで、どのようにしてスキーマ変更を実行するには時間がかかりますか?

答えて

1

これはあなたの質問への直接的な回答ではないかもしれませんが、datastaxドライバとcqlshの比較では遅くなることがあります。クライアントがスキーマを変更したときに、スキーマのリフレッシュをデバウンスしていたドライバには、(JAVA-1120)各スキーマ関連の文の実行から1秒遅らせる必要がないときに非効率的でした。

可能な場合は、java-driver 3.0.3以降にアップグレードすると問題が解決します。私はこれらの両方のオプションを試してみました

Cluster.builder() 
    .withQueryOptions(new QueryOptions().setRefreshSchemaIntervalMillis(0)) 
    //... more builder options 
    .build() 
+0

と私はスピードアップを見ていないです:

そうしないと、このようにデバウンススキーマの更新を無効にすることができます。 DDLを実行してから数分かかる場合があることに注意してください。スキーマを変更した時点では、多くのデータの読み書きは行われません。ディスクの平均待機時間もかなり低いので、このような長い時間がかかる可能性はありません。それはドライバの問題でなければならないようですが、私は何を突き止めることができません。 –