web-dev-qa-db-ja.com

Cassandraスナップショットの復元:ランダムな欠落データ

私はApache Cassandra(バージョン3.0.9)でスナップショットを復元するのに苦労しています。)言うまでもなく、私はdatastaxブログで説明されている手順と他のいくつかの手順に従っていますones(例えば: http://datascale.io/cloning-cassandra-clusters-fast-way/ )。それでも私は何かが欠けているかもしれません、そして私が復元をするたびにデータが欠落しています。

セットアップ:レプリケーション係数が3に設定された6ノードのクラスター(1 DC、3ラック、それぞれ2ノード)。マシンはAWSでホストされます。

バックアップ手順(各ノード):

  1. _nodetool snapshot mykeyspace_
  2. _cqlsh -e 'DESCRIBE KEYSPACE mykeyspace' > /tmp/mykeyspace.cql_
  3. nodetool ring | grep "$(ifconfig | awk '/inet /{print $2}' | head -1)" | awk '{print $NF ","}' | xargs > /tmp/tokens

Nodetool snapshotコマンドで生成されたファイルを取得し、トークンとcqlとともにS3にバックアップします。

復元手順(指定されていない限り、各ノードに対して):

(新しいVMを作成した後)

  1. スナップショット、トークン、キースペースをダウンロードする
  2. Cassandraサービスの停止
  3. _/var/lib/cassandra/commitlog/*_および_/var/lib/cassandra/system/_を削除します
  4. トークンを_cassandra.yaml_に挿入する
  5. Cassandraサービスの開始
  6. 1つのノードのみで_mykeyspace.cql_からmykeyspaceを復元します
  7. レプリケーションを待機し、サービスcassandraを停止します
  8. フォルダー_.db_内の_/var/lib/cassandra/data/mykeyspace/_ファイルを削除
  9. テーブルごとに、スナップショットファイル(_.db_、_.crc32_、_.txt_)を_/var/lib/cassandra/data/mykeyspace/$table/_にコピーします
  10. Cassandraサービスを再起動します
  11. 一度に1つのノードで_nodetool repair mykeyspace -full_を実行します。

結果:

行は常に欠落しており、各テーブルでほぼ同じ量ですが、同じ行になることはありません。トークンの前にキースペースを復元する、修復前に_nodetool refresh_を実行するなど、手順を少し「混同」しようとしましたが、毎回同じ問題に遭遇しました。

私は「良い」復元に程遠くないので、私はかなり明白な何かを見逃していると思います。ログを分析しても、エラー/失敗のメッセージが表示されないため、実際には役に立ちませんでした。

どんな助けでも歓迎します:)もちろん、私は必要に応じてより多くの情報を与えることができます。

編集:誰もいない?最初に忘れていたcassandra version(3.0.9)で質問を更新しました。もう一度復元を試みましたが、うまくいきませんでした。これ以上の考えはありません: (

5
P. Bender

さて、話の終わり、愚かな私! cassandra.yamlのinitial_token行が、復元手順中に誤って「seded」されました。 initial_tokenキーの「:」の後にスペースがない場合、cassandraは起動に失敗します。したがって、行はコメント化されたままになり、トークンは解釈されませんでした!

tldr:

  • initial_token:<values> =間違っています
  • initial_token: <values> =良い

このパラメータの重要性を強く主張してくれたJosh Purvisに感謝します:-)

0
P. Bender

そのブログ投稿のsedコマンドは、-Dcassandra.load_ring_state=false$JVM_OPTSに追加することになっていますが、現在の形式では効果がありません。

そのコマンドをブログの投稿から直接コピーしていた場合は、それが問題である可能性があります。代わりに、これをファイルの下部に配置することもできます。

Sudo sed -i '$ a\JVM_OPTS="$JVM_OPTS -Dcassandra.load_ring_state=false"' /etc/cassandra/cassandra-env.sh

また、この手順を実行した後、各ノードでnodetool repair -pr <ks>を1つずつ実行する必要があります。

0
Josh