Cassandra ドキュメント

バージョン

これはプレリリースバージョンのドキュメントです。

バックアップ

Apache Cassandra は、不変の SSTable ファイルにデータを保存します。Apache Cassandra データベースのバックアップは、SSTable ファイルとして保存されるデータベースデータのバックアップコピーです。バックアップは、次のようないくつかの目的で使用されます。

  • 耐久性のためにデータコピーを保存する

  • ノード/パーティション/ネットワーク障害によりテーブルデータが失われた場合にテーブルを復元できるようにする

  • SSTable ファイルを異なるマシンに転送できるようにする (移植性のために)

バックアップの種類

Apache Cassandra は、2 種類のバックアップ戦略をサポートしています。

  • スナップショット

  • 増分バックアップ

スナップショットは、特定の時点でのテーブルの SSTable ファイルのコピーであり、ハードリンクによって作成されます。テーブルを作成するための DDL も保存されます。スナップショットは、ユーザーによって作成されるか、自動的に作成される場合があります。cassandra.yaml ファイルの snapshot_before_compaction 設定は、各コンパクションの前にスナップショットが作成されるかどうかを決定します。デフォルトでは、snapshot_before_compaction は false に設定されています。cassandra.yamlauto_snapshot を true (デフォルト) に設定することにより、キースペースの切り捨てやテーブルの削除の前に、スナップショットを自動的に作成できます。切り捨ては、自動スナップショットにより遅れる可能性があり、cassandra.yaml の別の設定で、コーディネーターが切り捨ての完了を待つ時間を決定します。デフォルトでは、Cassandra は自動スナップショットの完了を 60 秒間待ちます。

増分バックアップは、メンテーブルが SSTable としてディスクにフラッシュされるときに、ハードリンクによって作成されたテーブルの SSTable ファイルのコピーです。通常、増分バックアップは、バックアップ時間とディスク容量を削減するためにスナップショットとペアで使用されます。増分バックアップはデフォルトでは有効になっておらず、cassandra.yaml (incremental_backups 設定を使用) または nodetool を使用して明示的に有効にする必要があります。有効にすると、Cassandra は、フラッシュされた各 SSTable またはキースペースデータの backups/ サブディレクトリにローカルにストリーミングされた各 SSTable へのハードリンクを作成します。システムテーブルの増分バックアップも作成されます。

データディレクトリ構造

Cassandra データディレクトリの構造は、キースペースのさまざまなディレクトリと、テーブルディレクトリ内のデータファイルを持つテーブルで構成されます。特定のテーブルのバックアップとスナップショットをそれぞれ保存するためのディレクトリバックアップとスナップショットも、テーブルディレクトリ内に保存されます。Cassandra のディレクトリ構造を図1に示します。

Data directory structure for backups

図1. Cassandra データのディレクトリ構造

バックアップとスナップショットのサンプルテーブルの設定

このセクションでは、増分バックアップとスナップショットを示すために使用できるいくつかのサンプルデータを作成します。3ノードのCassandraクラスタを使用しました。まず、キースペースが作成されます。次に、キースペース内にテーブルが作成され、テーブルデータが追加されます。cqlkeyspacecatalogkeyspace の2つのキースペースを使用し、それぞれに2つのテーブルを配置しました。

キースペース cqlkeyspace を作成します

CREATE KEYSPACE cqlkeyspace
   WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

cqlkeyspace キースペースに 2 つのテーブル tt2 を作成します。

USE cqlkeyspace;
CREATE TABLE t (
   id int,
   k int,
   v text,
   PRIMARY KEY (id)
);
CREATE TABLE t2 (
   id int,
   k int,
   v text,
   PRIMARY KEY (id)
);

テーブルにデータを追加します

INSERT INTO t (id, k, v) VALUES (0, 0, 'val0');
INSERT INTO t (id, k, v) VALUES (1, 1, 'val1');

INSERT INTO t2 (id, k, v) VALUES (0, 0, 'val0');
INSERT INTO t2 (id, k, v) VALUES (1, 1, 'val1');
INSERT INTO t2 (id, k, v) VALUES (2, 2, 'val2');

テーブルを照会してデータを一覧表示します

SELECT * FROM t;
SELECT * FROM t2;

結果は次のようになります

id | k | v
----+---+------
 1 | 1 | val1
 0 | 0 | val0

 (2 rows)


id | k | v
----+---+------
 1 | 1 | val1
 0 | 0 | val0
 2 | 2 | val2

 (3 rows)

2 番目のキースペース catalogkeyspace を作成します

CREATE KEYSPACE catalogkeyspace
   WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

catalogkeyspace に 2 つのテーブル journalmagazine を作成します。

USE catalogkeyspace;
CREATE TABLE journal (
   id int,
   name text,
   publisher text,
   PRIMARY KEY (id)
);

CREATE TABLE magazine (
   id int,
   name text,
   publisher text,
   PRIMARY KEY (id)
);

テーブルにデータを追加します

INSERT INTO journal (id, name, publisher) VALUES (0, 'Apache Cassandra Magazine', 'Apache Cassandra');
INSERT INTO journal (id, name, publisher) VALUES (1, 'Couchbase Magazine', 'Couchbase');

INSERT INTO magazine (id, name, publisher) VALUES (0, 'Apache Cassandra Magazine', 'Apache Cassandra');
INSERT INTO magazine (id, name, publisher) VALUES (1, 'Couchbase Magazine', 'Couchbase');

テーブルを照会してデータを一覧表示します

SELECT * FROM catalogkeyspace.journal;
SELECT * FROM catalogkeyspace.magazine;

結果は次のようになります

id | name                      | publisher
----+---------------------------+------------------
 1 |        Couchbase Magazine |        Couchbase
 0 | Apache Cassandra Magazine | Apache Cassandra

 (2 rows)

id | name                      | publisher
----+---------------------------+------------------
 1 |        Couchbase Magazine |        Couchbase
 0 | Apache Cassandra Magazine | Apache Cassandra

 (2 rows)

スナップショット

このセクションでは、スナップショットの作成を示します。スナップショットを作成するために使用されるコマンドは、nodetool snapshot であり、次のように使用します。

$ nodetool help snapshot

結果は次のようになります

NAME
       nodetool snapshot - Take a snapshot of specified keyspaces or a snapshot
       of the specified table

SYNOPSIS
       nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]
               [(-pp | --print-port)] [(-pw <password> | --password <password>)]
               [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]
               [(-u <username> | --username <username>)] snapshot
               [(-cf <table> | --column-family <table> | --table <table>)]
               [(-kt <ktlist> | --kt-list <ktlist> | -kc <ktlist> | --kc.list <ktlist>)]
               [(-sf | --skip-flush)] [(-t <tag> | --tag <tag>)] [--] [<keyspaces...>]

OPTIONS
       -cf <table>, --column-family <table>, --table <table>
           The table name (you must specify one and only one keyspace for using
           this option)

       -h <host>, --host <host>
           Node hostname or ip address

       -kt <ktlist>, --kt-list <ktlist>, -kc <ktlist>, --kc.list <ktlist>
           The list of Keyspace.table to take snapshot.(you must not specify
           only keyspace)

       -p <port>, --port <port>
           Remote jmx agent port number

       -pp, --print-port
           Operate in 4.0 mode with hosts disambiguated by port number

       -pw <password>, --password <password>
           Remote jmx agent password

       -pwf <passwordFilePath>, --password-file <passwordFilePath>
           Path to the JMX password file

       -sf, --skip-flush
           Do not flush memtables before snapshotting (snapshot will not
           contain unflushed data)

       -t <tag>, --tag <tag>
           The name of the snapshot

       -u <username>, --username <username>
           Remote jmx agent username

       --
           This option can be used to separate command-line options from the
           list of argument, (useful when arguments might be mistaken for
           command-line options

       [<keyspaces...>]
           List of keyspaces. By default, all keyspaces

スナップショットの設定

コマンドラインで Nodetool を使用してスナップショットを作成するデモのために、cassandra.yaml ファイルで auto_snapshots 設定を false に設定しました。

auto_snapshot: false

また、コンパクションの前に自動的にスナップショットを作成するのを無効にするために、snapshot_before_compactionfalse に設定します

snapshot_before_compaction: false

スナップショットの作成

スナップショットを作成する前に、スナップショットを検索すると、何も一覧表示されません

$ find -name snapshots

サンプルキースペースとテーブルを使用してスナップショットを作成します。

キースペース内のすべてのテーブルのスナップショットを作成する

上記の構文を使用して、catalogkeyspace キースペース内のすべてのテーブルに対して catalog-ks という名前のスナップショットを作成します。

$ nodetool snapshot --tag catalog-ks catalogkeyspace

結果は次のようになります

Requested creating snapshot(s) for [catalogkeyspace] with snapshot name [catalog-ks] and
options {skipFlush=false}
Snapshot directory: catalog-ks

上記の find コマンドを使用すると、スナップショットと snapshots ディレクトリが、次のようなファイルとともに表示されます。

./cassandra/data/data/catalogkeyspace/journal-296a2d30c22a11e9b1350d927649052c/snapshots
./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/snapshots

同様に、複数のキースペース内のすべてのテーブルのスナップショットを作成できます。

$ nodetool snapshot --tag catalog-cql-ks catalogkeyspace, cqlkeyspace

キースペース内の単一テーブルのスナップショットを作成する

単一テーブルのスナップショットを作成するには、nodetool snapshot コマンドの構文は次のようになります。

$ nodetool snapshot --tag <tag> --table <table>  --<keyspace>

上記の構文を使用して、キースペース catalogkeyspace 内のテーブル magazine のスナップショットを作成します。

$ nodetool snapshot --tag magazine --table magazine  catalogkeyspace

結果は次のようになります

Requested creating snapshot(s) for [catalogkeyspace] with snapshot name [magazine] and
options {skipFlush=false}
Snapshot directory: magazine

同じキースペースから複数のテーブルのスナップショットを作成する

キースペース内の複数のテーブルのスナップショットを作成するには、Keyspace.table のリストを --kt-list オプションで指定する必要があります。たとえば、cqlkeyspace キースペース内のテーブル tt2 のスナップショットを作成します。

$ nodetool snapshot --kt-list cqlkeyspace.t,cqlkeyspace.t2 --tag multi-table

結果は次のようになります

Requested creating snapshot(s) for ["CQLKeyspace".t,"CQLKeyspace".t2] with snapshot name [multi-
table] and options {skipFlush=false}
Snapshot directory: multi-table

同じテーブルセットの複数のスナップショットを作成し、別の名前でタグ付けできます。例として、cqlkeyspace キースペース内の同じテーブルセット tt2 の別のスナップショットを作成し、スナップショットに異なるタグを付けます。

$ nodetool snapshot --kt-list cqlkeyspace.t, cqlkeyspace.t2 --tag multi-table-2

結果は次のようになります

Requested creating snapshot(s) for ["CQLKeyspace".t,"CQLKeyspace".t2] with snapshot name [multi-
table-2] and options {skipFlush=false}
Snapshot directory: multi-table-2

異なるキースペースから複数のテーブルのスナップショットを作成する

異なるキースペースにある複数のテーブルのスナップショットを作成する場合、コマンド構文は、複数のテーブルが同じキースペースにある場合と同じです。各 <keyspace>.<table> は、--kt-list オプションで個別に指定する必要があります。

たとえば、cqlkeyspace のテーブル tcatalogkeyspace のテーブル journal のスナップショットを作成し、スナップショットに multi-ks というタグを付けます。

$ nodetool snapshot --kt-list catalogkeyspace.journal,cqlkeyspace.t --tag multi-ks

結果は次のようになります

Requested creating snapshot(s) for [catalogkeyspace.journal,cqlkeyspace.t] with snapshot
name [multi-ks] and options {skipFlush=false}
Snapshot directory: multi-ks

スナップショットの一覧表示

スナップショットを一覧表示するには、nodetool listsnapshots コマンドを使用します。前の例で作成したすべてのスナップショットが一覧表示されます。

$ nodetool listsnapshots

結果は次のようになります

Snapshot Details:
Snapshot name Keyspace name   Column family name True size Size on disk
multi-table   cqlkeyspace     t2                 4.86 KiB  5.67 KiB
multi-table   cqlkeyspace     t                  4.89 KiB  5.7 KiB
multi-ks      cqlkeyspace     t                  4.89 KiB  5.7 KiB
multi-ks      catalogkeyspace journal            4.9 KiB   5.73 KiB
magazine      catalogkeyspace magazine           4.9 KiB   5.73 KiB
multi-table-2 cqlkeyspace     t2                 4.86 KiB  5.67 KiB
multi-table-2 cqlkeyspace     t                  4.89 KiB  5.7 KiB
catalog-ks    catalogkeyspace journal            4.9 KiB   5.73 KiB
catalog-ks    catalogkeyspace magazine           4.9 KiB   5.73 KiB

Total TrueDiskSpaceUsed: 44.02 KiB

スナップショットディレクトリの検索

snapshots ディレクトリは、find –name snapshots コマンドで一覧表示できます。

$ find -name snapshots

結果は次のようになります

./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/snapshots
./cassandra/data/data/cqlkeyspace/t2-d993a390c22911e9b1350d927649052c/snapshots
./cassandra/data/data/catalogkeyspace/journal-296a2d30c22a11e9b1350d927649052c/snapshots
./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/snapshots

特定のテーブルのスナップショットを一覧表示するには、まずそのテーブルのスナップショットディレクトリに移動します。たとえば、catalogkeyspace/journal テーブルのスナップショットを一覧表示します。

$ cd ./cassandra/data/data/catalogkeyspace/journal-296a2d30c22a11e9b1350d927649052c/snapshots && ls -l

結果は次のようになります

total 0
drwxrwxr-x. 2 ec2-user ec2-user 265 Aug 19 02:44 catalog-ks
drwxrwxr-x. 2 ec2-user ec2-user 265 Aug 19 02:52 multi-ks

snapshots ディレクトリには、スナップショット内の SSTable ファイルが一覧表示されます。schema.cql ファイルも各スナップショットに作成され、スナップショットから復元するときに CQL を使用してテーブルを再作成できるスキーマを定義します。

$ cd catalog-ks && ls -l

結果は次のようになります

total 44
-rw-rw-r--. 1 ec2-user ec2-user   31 Aug 19 02:44 manifest.jsonZ
-rw-rw-r--. 4 ec2-user ec2-user   47 Aug 19 02:38 na-1-big-CompressionInfo.db
-rw-rw-r--. 4 ec2-user ec2-user   97 Aug 19 02:38 na-1-big-Data.db
-rw-rw-r--. 4 ec2-user ec2-user   10 Aug 19 02:38 na-1-big-Digest.crc32
-rw-rw-r--. 4 ec2-user ec2-user   16 Aug 19 02:38 na-1-big-Filter.db
-rw-rw-r--. 4 ec2-user ec2-user   16 Aug 19 02:38 na-1-big-Index.db
-rw-rw-r--. 4 ec2-user ec2-user 4687 Aug 19 02:38 na-1-big-Statistics.db
-rw-rw-r--. 4 ec2-user ec2-user   56 Aug 19 02:38 na-1-big-Summary.db
-rw-rw-r--. 4 ec2-user ec2-user   92 Aug 19 02:38 na-1-big-TOC.txt
-rw-rw-r--. 1 ec2-user ec2-user  814 Aug 19 02:44 schema.cql

スナップショットのクリア

スナップショットは、nodetool clearsnapshot コマンドでクリアまたは削除できます。特定のsnapshot名を指定するか、–allオプションを指定する必要があります。

たとえば、キースペース cqlkeyspace から magazine という名前のスナップショットを削除します

$ nodetool clearsnapshot -t magazine cqlkeyspace

または、–all オプションを使用して、cqlkeyspace からすべてのスナップショットを削除します

$ nodetool clearsnapshot -all cqlkeyspace

増分バックアップ

以下のセクションでは、増分バックアップの設定と作成について説明します。

増分バックアップの設定

増分バックアップを作成するには、cassandra.yamlincremental_backupstrue に設定します。

incremental_backups: true

これは増分バックアップを作成するために必要な唯一の設定です。デフォルトでは、incremental_backups 設定は false に設定されています。これは、データフラッシュごとに新しいSSTableファイルが作成され、複数のCQLステートメントを実行すると、backups ディレクトリがすぐにいっぱいになり、テーブルデータの保存に必要なストレージを使い果たしてしまう可能性があるためです。増分バックアップは、nodetoolコマンドnodetool enablebackupを使用してコマンドラインで有効にすることもできます。増分バックアップは、nodetool disablebackupコマンドで無効にすることができます。増分バックアップの状態、つまり有効になっているかどうかは、nodetool statusbackupで確認できます。

増分バックアップの作成

各テーブルが作成された後、nodetool flushコマンドでテーブルデータをフラッシュします。これで増分バックアップが作成されます。

$ nodetool flush cqlkeyspace t
$ nodetool flush cqlkeyspace t2
$ nodetool flush catalogkeyspace journal magazine

増分バックアップの検索

増分バックアップは、Cassandraのdataディレクトリ内のテーブルディレクトリ内に作成されます。バックアップは、以下のコマンドで検索できます。

$ find -name backups

結果は次のようになります

./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/backups
./cassandra/data/data/cqlkeyspace/t2-d993a390c22911e9b1350d927649052c/backups
./cassandra/data/data/catalogkeyspace/journal-296a2d30c22a11e9b1350d927649052c/backups
./cassandra/data/data/catalogkeyspace/magazine-446eae30c22a11e9b1350d927649052c/backups

増分バックアップの作成

このセクションでは、以前に作成したキースペースとテーブルを使用して、増分バックアップがどのように作成されるかを詳しく説明します。

キースペースとテーブルをフラッシュします

$ nodetool flush cqlkeyspace t

バックアップを検索すると、テーブルデータがまだ追加されていなくても、backupsディレクトリの中にバックアップディレクトリが表示されます。

$ find -name backups

結果は次のようになります

./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/backups

backupsディレクトリを確認すると、バックアップファイルも存在しないことがわかります。

$ cd ./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/backups && ls -l

結果は次のようになります

total 0

データに行が追加された場合、nodetool flushコマンドを実行すると、テーブルデータがフラッシュされ、増分バックアップが作成されます。

$ nodetool flush cqlkeyspace t
$ cd ./cassandra/data/data/cqlkeyspace/t-d132e240c21711e9bbee19821dcea330/backups && ls -l

結果は次のようになります

total 36
-rw-rw-r--. 2 ec2-user ec2-user   47 Aug 19 00:32 na-1-big-CompressionInfo.db
-rw-rw-r--. 2 ec2-user ec2-user   43 Aug 19 00:32 na-1-big-Data.db
-rw-rw-r--. 2 ec2-user ec2-user   10 Aug 19 00:32 na-1-big-Digest.crc32
-rw-rw-r--. 2 ec2-user ec2-user   16 Aug 19 00:32 na-1-big-Filter.db
-rw-rw-r--. 2 ec2-user ec2-user    8 Aug 19 00:32 na-1-big-Index.db
-rw-rw-r--. 2 ec2-user ec2-user 4673 Aug 19 00:32 na-1-big-Statistics.db
-rw-rw-r--. 2 ec2-user ec2-user   56 Aug 19 00:32 na-1-big-Summary.db
-rw-rw-r--. 2 ec2-user ec2-user   92 Aug 19 00:32 na-1-big-TOC.txt

cqlkeyspace/tなどの任意のテーブルのbackupsディレクトリは、そのテーブルのdataディレクトリに作成されます。

別のデータ行を追加してフラッシュすると、別の増分バックアップファイルセットが作成されます。SSTableファイルにはタイムスタンプが付けられており、最初の増分バックアップと2番目の増分バックアップが区別されます。

total 72
-rw-rw-r--. 2 ec2-user ec2-user   47 Aug 19 00:32 na-1-big-CompressionInfo.db
-rw-rw-r--. 2 ec2-user ec2-user   43 Aug 19 00:32 na-1-big-Data.db
-rw-rw-r--. 2 ec2-user ec2-user   10 Aug 19 00:32 na-1-big-Digest.crc32
-rw-rw-r--. 2 ec2-user ec2-user   16 Aug 19 00:32 na-1-big-Filter.db
-rw-rw-r--. 2 ec2-user ec2-user    8 Aug 19 00:32 na-1-big-Index.db
-rw-rw-r--. 2 ec2-user ec2-user 4673 Aug 19 00:32 na-1-big-Statistics.db
-rw-rw-r--. 2 ec2-user ec2-user   56 Aug 19 00:32 na-1-big-Summary.db
-rw-rw-r--. 2 ec2-user ec2-user   92 Aug 19 00:32 na-1-big-TOC.txt
-rw-rw-r--. 2 ec2-user ec2-user   47 Aug 19 00:35 na-2-big-CompressionInfo.db
-rw-rw-r--. 2 ec2-user ec2-user   41 Aug 19 00:35 na-2-big-Data.db
-rw-rw-r--. 2 ec2-user ec2-user   10 Aug 19 00:35 na-2-big-Digest.crc32
-rw-rw-r--. 2 ec2-user ec2-user   16 Aug 19 00:35 na-2-big-Filter.db
-rw-rw-r--. 2 ec2-user ec2-user    8 Aug 19 00:35 na-2-big-Index.db
-rw-rw-r--. 2 ec2-user ec2-user 4673 Aug 19 00:35 na-2-big-Statistics.db
-rw-rw-r--. 2 ec2-user ec2-user   56 Aug 19 00:35 na-2-big-Summary.db
-rw-rw-r--. 2 ec2-user ec2-user   92 Aug 19 00:35 na-2-big-TOC.txt

増分バックアップとスナップショットからの復元

テーブルが削除された後にテーブルを復元するための2つの主要なツール/コマンドは次のとおりです。

  • sstableloader

  • nodetool refresh

スナップショットには、増分バックアップとほぼ同じSSTableファイルセットが含まれていますが、いくつかの追加ファイルがあります。スナップショットには、CQLでテーブルを作成するためのスキーマDDLであるschema.cqlファイルが含まれています。テーブルバックアップにはDDLは含まれていません。増分バックアップから復元する場合は、スナップショットから取得する必要があります。