web-dev-qa-db-ja.com

Cassandraスナップショットを復元するにはどうすればよいですか?

Cassandraデータベースのバックアップと復元プロセスを構築しているので、必要なときに準備が整い、本番環境で機能するものを構築するための詳細を理解しています。ここでDatastaxの指示に従います:

http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_restore_c.html

まず、データベースを開発ボックスにシードしてから、バックアップ/復元を機能させようとしています。バックアップスクリプトは次のとおりです。

#!/bin/bash

cd /opt/Apache-cassandra-2.0.9
./bin/nodetool clearsnapshot -t after_seeding makeyourcase
./bin/nodetool snapshot -t after_seeding makeyourcase

cd /var/lib/
tar czf after_seeding.tgz cassandra/data/makeyourcase/*/snapshots/after_seeding

はい、たぶんtarが最も効率的な方法ではないかもしれませんが、私は今、何かを動作させようとしているだけです。私はタールをチェックしました、そして、すべてのファイルはそこにあります。

データベースがバックアップされたら、Cassandraとアプリをシャットダウンし、次にrm -rf /var/lib/cassandra/をシャットダウンして完全な損失をシミュレートします。

次に、データベースを復元します。 http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_snapshot_restore_t.html からの復元「方法2」は、方法1よりもスキーマ作成コンポーネントと互換性があります。

したがって、方法2 /ステップ1、「スキーマを再作成する」:Cassandraを再起動してから、アプリを再起動します。アプリは、必要に応じて起動時にスキーマを再作成するように構築されています。起動すると、アプリのスキーマを含むCassandraノードが機能しますが、データはありません。

方法2 /ステップ2「スナップショットを復元する」:3つの代替方法が提供されます。最初の方法は、sstableloaderを使用することです http://www.datastax.com/documentation/cassandra/2.0/cassandra/tools) /toolsBulkloader_t.html 。ローダーが必要とするフォルダー構造は、スナップショットツールによって作成されたフォルダー構造とは異なり、すべてを所定の場所に移動する必要があります。すべての問題に行く前に、1つのテーブルで試してみます。

>./bin/sstableloader makeyourcase/users
Error: Could not find or load main class org.Apache.cassandra.tools.BulkLoader

うーん、それはうまくいきません。 BulkLoaderは./lib/Apache-cassandra-2.0.9.jarにありますが、ローダーはそのままで機能するように設定されていないようです。ツールをデバッグするのではなく、スナップショットディレクトリをmakeyourcase/users/snapshots /ディレクトリにコピーして、2番目の方法に移りましょう。スナップショットディレクトリを元の場所に戻しているので、これは簡単なはずです。そのため、tar xzf after_seeding.tgzでうまくいくはずです。

cd /var/lib/
tar xzf after_seeding.tgz
chmod -R u+rwx cassandra/data/makeyourcase

そして、スナップショットディレクトリをそれぞれの「スナップショット」ディレクトリの下に戻し、更新するとデータが復元されます。

cd /opt/Apache-cassandra-2.0.9
./bin/nodetool refresh -- makeyourcase users

これは文句なしに実行されます。テーブルごとにこれを実行する必要があるため、最初にテーブルのリストを生成する必要があることに注意してください。ただし、その前に、Cassandraログに興味深いものがあることに注意してください。

INFO 14:32:26,319 Loading new SSTables for makeyourcase/users...
INFO 14:32:26,326 No new SSTables were found for makeyourcase/users

したがって、スナップショットを元に戻しましたが、Cassandraは見つかりませんでした。スナップショットディレクトリを既存のSSTablesディレクトリの下に移動し、古いSSTableファイルを既存のディレクトリにコピーしてみました。ログに同じエラーがあります。Cassandraは、それらを見つけることが期待される場所にログを記録せず、単にそれらを見つけることができません。ドキュメントは、data/keyspaceという名前のディレクトリにそれらを置くように言っています/ table_name-UUIDですが、そのようなディレクトリはありません。data/ makeyourcase/users/snapshots/1408820504987-users /という名前のディレクトリがありますが、そこにスナップショットディレクトリまたは個々のファイルを配置しても機能しませんでした。

3番目の選択肢である「ノードの再起動方法」は、マルチノードの本番環境には適していないように見えるので、試さなかった。

編集:

これを次の人のために完全に明確にするために、ここでは、受け入れられた回答を適用する予備の作業用バックアップおよび復元スクリプトを示します。

myc_backup.sh:

#!/bin/bash

cd ~/bootstrap/Apache-cassandra-2.0.9
./bin/nodetool clearsnapshot -t after_seeding makeyourcase
./bin/nodetool snapshot -t after_seeding makeyourcase

cd /var/lib/
tar czf after_seeding.tgz cassandra/data/makeyourcase/*/snapshots/after_seeding

myc_restore.sh:

#!/bin/bash

cd /var/lib/
tar xzf after_seeding.tgz
chmod -R u+rwx cassandra/data/makeyourcase

cd ~/bootstrap/Apache-cassandra-2.0.9
TABLE_LIST=`./bin/nodetool cfstats makeyourcase | grep "Table: " | sed -e 's+^.*: ++'`
for TABLE in $TABLE_LIST; do
    echo "Restore table ${TABLE}"
    cd /var/lib/cassandra/data/makeyourcase/${TABLE}
    if [ -d "snapshots/after_seeding" ]; then
        cp snapshots/after_seeding/* .
        cd ~/bootstrap/Apache-cassandra-2.0.9
        ./bin/nodetool refresh -- makeyourcase ${TABLE}
        cd /var/lib/cassandra/data/makeyourcase/${TABLE}
        rm -rf snapshots/after_seeding
        echo "    Table ${TABLE} restored."
    else
        echo "    >>> Nothing to restore."
    fi
done
19
Don Branson

詳細を追加しました:

以下を使用して、特定のキースペースのスナップショットを実行できます。

$ nodetool snapshot <mykeyspace> -t <SnapshotDirectoryName>

これにより、データのスナップショットディレクトリ内にスナップショットファイルが作成されます。

データを削除するときはsnapshotsフォルダーを削除しないでください。削除すると、復元できなくなります(別の場所/マシンに移動している場合を除きます)。

$ pwd
/var/lib/cassandra/data/mykeyspace/mytable
$ ls
mykeyspace-mytable-jb-2-CompressionInfo.db mykeyspace-mytable-jb-2-Statistics.db
mykeyspace-mytable-jb-2-Data.db mykeyspace-mytable-jb-2-Filter.db mykeyspace-mytable-jb-2-Index.db
mykeyspace-mytable-jb-2-Summary.db mykeyspace-mytable-jb-2-TOC.txt snapshots


$ rm *
rm: cannot remove `snapshots': Is a directory

復元の準備ができたら、スナップショットデータをキースペース/テーブルディレクトリ(テーブルごとに1つ)にコピーします。

$ pwd
/var/lib/cassandra/data/mykeyspace/mytable
$ Sudo cp snapshots/<SnapshotDirectoryName>/* .

あなたは言及しました:

そして、スナップショットディレクトリをそれぞれの「スナップショット」ディレクトリの下に戻し、更新するとデータが復元されます。

問題は、スナップショットデータをスナップショットディレクトリに復元していることだと思います。それはテーブルディレクトリに直接行くはずです。他のすべては正しいようです、私に知らせてください。

9
phact

ドキュメントはそれらをdata/keyspace/table_name-UUIDという名前のディレクトリに置くように言っていますが、そのようなディレクトリはありません。

cassandra 2.0を使用しており、このUUIDはcassandra 2.2で始まる

3