スナップショットバックアップと復元
スナップショットバックアップは、クラウドネイティブなテーブルエンジン向けの軽量なバックアップモードです。データをコピーする代わりに、各パーツごとのロックノードを ClickHouse Keeper に書き込みます。これらのロックにより、スナップショットが保持されている限り、参照先のオブジェクトストレージパーツがサーバーによって削除されるのを防ぎます。その後、バックアップではデータを物理的にコピーするのではなく、オブジェクトストレージへの参照を記録するため、テーブルサイズに関係なくスナップショットをすばやく作成できます。
この軽量方式は、SharedMergeTree、SharedSet、および SharedJoin テーブルに適用されます。Log や Memory など、その他すべてのエンジンタイプでは、バックアップは自動的に標準のコピー方式バックアップにフォールバックします。
スナップショットを作成する
スナップショットバックアップでは、experimental_lightweight_snapshot = true を指定して、標準の BACKUP コマンドを使用します。id 設定は必須です。これはスナップショット名として使われ、unlock コマンドやオブザーバビリティ関連のコマンドで参照する際に使用されます。
この命令語は id と status を返します。id は system.backups で操作を追跡するために使用できます。
単一のテーブルを S3 にバックアップします:
データベース全体をバックアップする:
1つを除外してすべてのテーブルをバックアップします:
Azure Blob Storageでも同じコマンドを使用できます:
同じサービスへの復元
スナップショットにはデータのコピーではなくオブジェクトストレージ内のファイルへの参照が保存されるため、新規または別の ClickHouse サービスに復元するには、元のオブジェクトストレージへのアクセスが必要です。このため、サービス間の復元は SQL ではサポートされておらず、UI からのみ実行できます。SQL を使用する場合は、snapshot_from_current_service = 1 を指定することで、外部バックアップバケットから同じサービスにスナップショットを復元できます。この場合、リモートのスナップショットリーダーを介さず、オブジェクトは宛先ディスク経由で直接読み取られます。
AS 句を指定すると、元のテーブルはそのまま残したまま、新しいテーブル名で復元されます。元のテーブルを上書きするには、先に削除してください:
スナップショットのロックを解除する
各スナップショットは ClickHouse Keeper にロックを保持し、参照先のオブジェクトストレージ内のファイルがガベージコレクションの対象になるのを防ぎます。復元の完了後、またはスナップショットが不要になった時点で、これらのロックを解放するためにロックを解除してください。
方法は 2 つあります。1 つはシステムレベルのロック解除で、スナップショットのすべてのロックを一度に削除します。もう 1 つはテーブル単位のロック解除で、スナップショットの残りはそのままに、1 つのテーブルのロックだけを削除します。
システムレベルのロック解除 — スナップショットのすべてのロックを削除します:
テーブルごとのロック解除 — 1 つのテーブルに対してのみロックを解除します。
スナップショットの作成時に保存先が Keeper に格納されていた場合、FROM 句は省略可能です (system.snapshot_locks の info カラムで確認できます) :
ロックを解除すると、対応する行は system.snapshot_locks から消え、他のスナップショットから参照されていないパーツは system.snapshot_parts からも消えます。
オブザーバビリティ
system.backups
すべてのスナップショット操作は、通常のバックアップおよび復元操作とあわせて system.backups に表示されます。設定した id (または命令語によって返される UUID) を指定してクエリします。
system.snapshot_locks
system.snapshot_locks は、現在 Keeper に登録されているコミット済みのスナップショットを表示します。スナップショットがコミットされると、Keeper ノードが /clickhouse/snapshot/committed/{snapshot_id} に作成されます。サーバーは、データパートを削除する前に、コミット済みのスナップショットがそのデータパートをロックしているかどうかを確認します。ロックしている場合、そのデータパートの削除はスキップされます。ロックは、スナップショットを明示的にロック解除するまで維持されます。
| カラム | 型 | 説明 |
|---|---|---|
id | String | スナップショット ID |
info | String | スナップショットの宛先 (例: S3('...')) |
ctime | DateTime | このロックが Keeper に作成された時刻 |
lock_path | String | このロックの Keeper パス |
各行は 1 つのコミット済みスナップショットを表します。すでに有効なバックアップ宛先が存在しないスナップショットのロックが表示されている場合は、SYSTEM UNLOCK SNAPSHOT を実行して削除してください。
特定のスナップショットロックが存在するかどうかを確認するには:
system.snapshot_parts
system.snapshot_parts は、現在、少なくとも 1 つのスナップショットロックによって保持されているデータパーツを表示します。ロックされている各パーツについて、/clickhouse/snapshot/{table_uuid}/{part_name} に Keeper ノードが存在し、そのパーツの圧縮サイズと非圧縮サイズが格納されます。このテーブルはそれらのノードを読み取り、現在削除から保護されているパーツを表示します。
| カラム | 型 | 説明 |
|---|---|---|
name | String | データパーツ名 |
table_id | String | このパーツが属するテーブルの UUID |
data_compressed_bytes | UInt64 | このパーツの圧縮後のサイズ |
data_uncompressed_bytes | UInt64 | このパーツの非圧縮時のサイズ |
snapshots_size | UInt64 | 現在このパーツに対するロックを保持しているスナップショットの数 |
snapshots_size > 1 のパーツは複数のスナップショットから参照されており、保持中のすべてのスナップショットのロックが解除されるまで、オブジェクトストレージから削除されません。
ピン留めされているストレージの合計を確認するには:
スナップショットによってロックされているものの、すでに削除されているか、サーバー上でアクティブでなくなっているパーツ、つまりスナップショットロックのためだけにオブジェクトストレージに保持されているデータを見つけるには:
これは、元のデータが変更または削除された後もスナップショットを保持する場合のストレージオーバーヘッドを把握するのに役立ちます。