- スナップショットとは何か、またどこで見つけられるか
- 問題がどのように現れるか
- 考えられる復旧戦略 と、それぞれが何を意味するのか
Keeper スナップショットの概要
スナップショットとは?
スナップショットはどこにありますか?
/var/lib/clickhouse/coordination/snapshots/ に保存され、keeper_server.xml ファイルの snapshot_storage_path でカスタムパスを指定している場合は、そちらに保存されます。スナップショットには連番の名前 (例: snapshot.23) が付けられ、新しいものほど番号が大きくなります。
マルチノードのクラスターでは、各 Keeper ノードごとに独自のスナップショットディレクトリがあります。
復旧には、ノード間でスナップショットの整合性が保たれていることが極めて重要です。
破損した Keeper スナップショットの主な症状と兆候
ログ上の指標:
スナップショットの破損を診断する前に、まず Keeper ログ で特定のエラーパターンを確認してください。
破損した Keeper スナップショットからの復旧
- さらなる破損を防ぐため、すべての Keeper ノードを停止する
- 協調ディレクトリ全体を安全な場所にコピーし、完全にバックアップを取る
- 少なくとも 1 つのノードに正常なデータがあることを確認するため、クラスターのクォーラムを確認する
1. 既存のバックアップから復元する
- Keeper のメタデータまたはスナップショットの破損により、現在のデータを復旧できない。
- 正常な Keeper の状態を含むバックアップがある。
- 最新のバックアップを特定し、メタデータの整合性を確認します。
- ClickHouse と Keeper のサービスを停止します。
- 問題のあるスナップショットとログを、バックアップディレクトリ内のものに置き換えます。
- Keeper クラスターを再起動し、メタデータが同期されていることを確認します。
2. 古いスナップショットへのロールバック
- 最新のスナップショットは破損しているが、古いスナップショットは引き続き使用できる。
- 整合性のある復旧に必要なインクリメンタルログが無傷で残っている。
- Keeper ディレクトリから有効な古いスナップショット (例: snapshot.19) を特定して選択します。
- より新しいスナップショットとログを削除します。
- Keeper を再起動し、ログを再生してメタデータの状態を再構築させます。
3. SYSTEM RESTORE REPLICA を使用したメタデータの復元
- Keeper のメタデータが失われている、または破損している一方で、テーブルデータは引き続きディスク上に存在している
- ZooKeeper/Keeper のメタデータが欠落しているため、テーブルが読み取り専用モードに切り替わっている
- ローカルで利用可能なデータパーツに基づいて、Keeper 内のメタデータを再作成する必要がある
-
テーブルデータが、config の
<path>で設定されたローカルの clickHouse-server データパスに存在することを確認します (デフォルトは/var/lib/clickhouse/data/) 。 - 影響を受ける各テーブルに対して、次を実行します。
- データベースレベルで復旧する場合 (Replicated データベースエンジンを使用している場合) :
- 同期が完了するまで待ちます:
is_readonly = 0になっていることをsystem.replicasで確認し、system.detached_partsを監視して復旧を検証します
仕組み
SYSTEM RESTORE REPLICA は既存のすべてのパーツをデタッチし、Keeper 内のメタデータを再作成したうえで (新しい空のテーブルであるかのように) 、すべてのパーツを再アタッチします。これにより、ネットワーク経由でデータを再ダウンロードせずに済みます。4. Keeper 内のレプリカのメタデータを削除して再作成する
- エラーがクラスター内の単一のレプリカで発生しており、そのレプリカの Keeper 内のメタデータが破損している、または不整合が生じている
- “Part XXXXX intersects previous part YYYYY” のようなエラーが発生する
- ローカルデータを保持したまま、レプリカの Keeper メタデータを完全にリセットする必要がある
- 影響を受けているレプリカで、テーブルをデタッチします。
- Keeper からレプリカのメタデータを削除します (任意のレプリカで実行) :
- テーブルを再アタッチします (読み取り専用モードになります) :
- レプリカのメタデータを復元します:
- 他のレプリカと同期します:
- 復旧後、すべてのレプリカで
system.detached_partsを確認します
force_restore_data フラグを使用する
サーバー起動時にすべてのレプリケートテーブルを自動復旧するには、次の手順を実行します。
- ClickHouseサーバー を停止します
- 復旧フラグを作成します:
- ClickHouseサーバーを起動します
- サーバーは自動的にフラグを削除し、すべてのレプリケートテーブルを復元します
- ログで復旧の進行状況を監視します
5. Keeper クラスターを再構築する
- 復旧に使用できる有効なスナップショット、ログ、またはバックアップがない。
- Keeper クラスター全体とそのメタデータを再作成する必要がある。
- ClickHouse クラスターと Keeper クラスターを完全に停止します。
- スナップショットとログのディレクトリをクリーンアップして、各 Keeper ノードをリセットします。
- 1 つの Keeper ノードをリーダーとして初期化し、他のノードを段階的に追加します。
- 外部の記録が利用できる場合は、メタデータを再インポートします。