データ破損
etcdには、メンバー間で状態が分岐することを防ぐため、データ破損の自動検出機能が組み込まれています。
etcd 3.7では、以下のフィーチャーゲートと時間間隔フラグを使用してください。以前の実験的なデータ破損チェック用フラグは削除されています。設定オプション を参照してください。
データ破損検出の有効化
データ破損は、次の方法で検出できます。
- 初期チェック。
--feature-gates=InitialCorruptCheck=trueフラグで有効にします。 - 次の定期チェック。
- コンパクション済みリビジョンのハッシュ。
--feature-gates=CompactHashCheck=trueフラグで有効にします。 - 最新リビジョンのハッシュ。
--corrupt-check-timeフラグで有効にします。
- コンパクション済みリビジョンのハッシュ。
初期チェックは、etcdメンバーのブートストラップ中に実行します。 メンバーは自身の永続状態をほかのメンバーと比較し、不一致があれば終了します。
両方の定期チェックは、稼働中のクラスターでリーダーが実行します。 リーダーは自身の永続状態をほかのメンバーと比較し、不一致があればCORRUPT ALARMを発報します。 両チェックの目的は同じですが、性能と検出までの時間のバランスを取るため、両方を有効にする価値があります。
- コンパクション済みリビジョンのハッシュチェック - 定期的なコンパクションが必要です。性能への負荷はごく小さく、遅いフォロワーにも対応します。
- 最新リビジョンのハッシュチェック - 性能への負荷が高く、遅いフォロワーや頻繁なコンパクションには対応しません。
コンパクション済みリビジョンのハッシュチェック
--feature-gates=CompactHashCheck=trueフラグで有効にすると、1分ごとにチェックを実行します。
間隔は--compact-hash-check-timeフラグで調整できます。形式は1mが毎分、1hが毎時です。
このチェックはコンパクション処理を拡張し、クラスターメンバー間で比較できるチェックサムも計算します。
データベースの追加スキャンを行わないため負荷は非常に小さいものの、クラスターで定期的にコンパクションを行う必要があります。
最新リビジョンのハッシュチェック
--corrupt-check-timeフラグで有効にします。実行間隔の指定が必要で、形式は1mが毎分、1hが毎時です。
性能への負荷が高いため、数時間の間隔を推奨します。
チェックでは、指定リビジョンのetcdの全内容をスキャンしてチェックサムを計算する必要があります。
破損したメンバーのリストア
破損したメンバーをリストアする方法は3つあります。
- メンバーの永続状態を消去する
- メンバーを置き換える
- クラスター全体をリストアする
破損したメンバーをリストアした後、CORRUPT ALARMを解除できます。
メンバーの永続状態の消去
次の手順でメンバーの状態を消去できます。
- etcdインスタンスを停止します。
- etcdのデータディレクトリをバックアップします。
- etcdのデータディレクトリから
snapサブディレクトリを移動します。 --initial-cluster-state=existingを指定し、--initial-clusterにクラスターメンバーを列挙してetcdを起動します。
etcdメンバーは、リーダーから最新のスナップショットをダウンロードするはずです。
メンバーの置き換え
次の手順でメンバーを置き換えられます。
- etcdインスタンスを停止します。
- etcdのデータディレクトリをバックアップします。
- データディレクトリを削除します。
etcdctl member removeを実行し、クラスターからメンバーを削除します。etcdctl member addを実行し、メンバーを再度追加します。--initial-cluster-state=existingを指定し、--initial-clusterにクラスターメンバーを列挙してetcdを起動します。
クラスター全体のリストア
現在のリーダーからスナップショットを保存し、すべてのメンバーにリストアすることで、クラスターをリストアできます。
リーダーに対してetcdctl snapshot saveを実行し、クラスターのリストア手順
に従ってください。