バックアップ
Apache Cassandra は、不変の SSTable ファイルにデータを保存します。Apache Cassandra データベースのバックアップは、SSTable ファイルとして保存されるデータベースデータのバックアップコピーです。バックアップは、次のようないくつかの目的で使用されます。
-
耐久性のためにデータコピーを保存する
-
ノード/パーティション/ネットワーク障害によりテーブルデータが失われた場合にテーブルを復元できるようにする
-
SSTable ファイルを異なるマシンに転送できるようにする (移植性のために)
バックアップの種類
Apache Cassandra は、2 種類のバックアップ戦略をサポートしています。
-
スナップショット
-
増分バックアップ
スナップショットは、特定の時点でのテーブルの SSTable ファイルのコピーであり、ハードリンクによって作成されます。テーブルを作成するための DDL も保存されます。スナップショットは、ユーザーによって作成されるか、自動的に作成される場合があります。cassandra.yaml
ファイルの snapshot_before_compaction
設定は、各コンパクションの前にスナップショットが作成されるかどうかを決定します。デフォルトでは、snapshot_before_compaction
は false に設定されています。cassandra.yaml
で auto_snapshot
を true (デフォルト) に設定することにより、キースペースの切り捨てやテーブルの削除の前に、スナップショットを自動的に作成できます。切り捨ては、自動スナップショットにより遅れる可能性があり、cassandra.yaml
の別の設定で、コーディネーターが切り捨ての完了を待つ時間を決定します。デフォルトでは、Cassandra は自動スナップショットの完了を 60 秒間待ちます。
増分バックアップは、メンテーブルが SSTable としてディスクにフラッシュされるときに、ハードリンクによって作成されたテーブルの SSTable ファイルのコピーです。通常、増分バックアップは、バックアップ時間とディスク容量を削減するためにスナップショットとペアで使用されます。増分バックアップはデフォルトでは有効になっておらず、cassandra.yaml
(incremental_backups
設定を使用) または nodetool
を使用して明示的に有効にする必要があります。有効にすると、Cassandra は、フラッシュされた各 SSTable またはキースペースデータの backups/
サブディレクトリにローカルにストリーミングされた各 SSTable へのハードリンクを作成します。システムテーブルの増分バックアップも作成されます。
データディレクトリ構造
Cassandra データディレクトリの構造は、キースペースのさまざまなディレクトリと、テーブルディレクトリ内のデータファイルを持つテーブルで構成されます。特定のテーブルのバックアップとスナップショットをそれぞれ保存するためのディレクトリバックアップとスナップショットも、テーブルディレクトリ内に保存されます。Cassandra のディレクトリ構造を図1に示します。

図1. Cassandra データのディレクトリ構造
バックアップとスナップショットのサンプルテーブルの設定
このセクションでは、増分バックアップとスナップショットを示すために使用できるいくつかのサンプルデータを作成します。3ノードのCassandraクラスタを使用しました。まず、キースペースが作成されます。次に、キースペース内にテーブルが作成され、テーブルデータが追加されます。cqlkeyspace
と catalogkeyspace
の2つのキースペースを使用し、それぞれに2つのテーブルを配置しました。
キースペース cqlkeyspace
を作成します
CREATE KEYSPACE cqlkeyspace
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
cqlkeyspace
キースペースに 2 つのテーブル t
と t2
を作成します。
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 つのテーブル journal
と magazine
を作成します。
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_compaction
を false
に設定します
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
キースペース内のテーブル t
と t2
のスナップショットを作成します。
$ 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
キースペース内の同じテーブルセット t
と t2
の別のスナップショットを作成し、スナップショットに異なるタグを付けます。
$ 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
のテーブル t
と catalogkeyspace
のテーブル 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.yaml
で incremental_backups
を true
に設定します。
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
|
別のデータ行を追加してフラッシュすると、別の増分バックアップファイルセットが作成されます。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