PDリカバリーユーザーガイド
PD RecoverはPDのディザスタリカバリツールであり、正常に起動またはサービスを提供できないPDクラスタを復旧するために使用されます。
ソースコードからコンパイル
- Goモジュールが使用されるため、 行く 1.23以降が必要です。
- PDプロジェクトのルートディレクトリで、
make pd-recoverコマンドを使用してbin/pd-recoverコンパイルおよび生成します。
注記:
通常、 PD Controlツールはリリース済みのバイナリまたはDockerに既に含まれているため、ソースコードをコンパイルする必要はありません。ただし、開発者ユーザーは上記のソースコードコンパイル手順を参照してください。
TiDB Toolkitをダウンロード
PD Recover インストール パッケージはTiDB Toolkitに含まれています。TiDB TiDB Toolkit をダウンロードするには、 TiDBツールをダウンロード参照してください。
以下のセクションでは、PDクラスタを復旧するための2つの方法、すなわち、稼働中のPDノードからの復旧と、PDクラスタ全体の再構築について説明します。
方法1:残存するPDノードを使用してPDクラスタを復旧する
クラスタ内のPDノードの過半数で回復不能なエラーが発生すると、クラスタはサービスを提供できなくなります。PDノードが残っている場合は、残っているPDノードを選択し、 Raftグループのメンバーを強制的に変更することでサービスを復旧できます。手順は以下のとおりです。
ステップ1:すべてのノードを停止する
リカバリプロセス中にPDパラメータとの相互作用によって発生するデータ破損やその他の回復不能なエラーを防ぐため、クラスタ内のTiDB、TiKV、およびTiFlashプロセスを停止してください。
ステップ2:生存しているPDノードを起動する
起動パラメータ--force-new-clusterを使用して、残存PDノードを起動し、ノードが元のデータディレクトリを使用するようにします。これは、コマンドラインで--data-dir使用して明示的に指定するか、 conf/pd.tomlでdata-dir事前に設定することができます。例:
./bin/pd-server --force-new-cluster --name=pd-127.0.0.10-2379 --data-dir=/path/to/existing/pd/data --client-urls=http://0.0.0.0:2379 --advertise-client-urls=http://127.0.0.1:2379 --peer-urls=http://0.0.0.0:2380 --advertise-peer-urls=http://127.0.0.1:2380 --config=conf/pd.toml
注記:
- コマンドラインで
--data-dir指定されていない場合は、conf/pd.tomlのdata-dir、存続しているPDノードの元のデータディレクトリを正しく指していることを確認してください。そうでない場合、pd-recover後続の操作で失敗する可能性があります。conf/pd.tomlとコマンドライン引数の両方でdata-dir指定されている場合、conf/pd.tomlのdata-dir設定が優先されます。
ステップ3: pd-recoverを使用してメタデータを修復する
この方法は少数派のPDノードがサービスを復旧することに依存するため、ノードに古いデータが含まれている可能性があります。1 alloc_id tsoデータがロールバックされると、クラスタデータが破損したり、利用できなくなったりする可能性があります。これを防ぐには、 pd-recover使用してメタデータを変更し、ノードが正しい割り当てIDとTSOサービスを提供できるようにする必要があります。以下に例を示します。
./bin/pd-recover --from-old-member --endpoints=http://127.0.0.1:2379 # Specify the corresponding PD address
注記:
このステップでは、storage内の「
alloc_idが自動的に安全な値である100000000だけ増加します。その結果、後続のクラスタはより大きなIDを割り当てることになります。さらに、手順
pd-recoverではTSOは変更されません。したがって、この手順を実行する前に、ローカル時刻が障害発生時刻よりも後であることを確認し、障害発生前にPDコンポーネント間でNTPクロック同期サービスが有効になっていることを確認してください。有効になっていない場合は、TSOのロールバックを防ぐために、ローカルクロックを将来の時刻に調整する必要があります。
ステップ4:PDノードを再起動する
プロンプトメッセージrecovery is successfulが表示されたら、PDノードを再起動してください。
ステップ5:PDをスケールアウトしてクラスターを起動する
デプロイツールを使用してPDクラスタをスケールアウトし、クラスタ内の他のコンポーネントを起動します。これでPDサービスが利用可能になります。
方法2:PDクラスタを完全に再構築する
この方法は、PDデータがすべて失われたものの、TiDB、TiKV、 TiFlashなどの他のコンポーネントのデータは残っているようなシナリオに適用可能です。
ステップ1:クラスターIDを取得する
クラスタIDは、PD、TiKV、またはTiDBのログから取得できます。クラスタIDを取得するには、サーバー上でログを直接表示してください。
PDログからクラスタIDを取得する(推奨)
PDログからクラスタIDを取得するには、次のコマンドを実行します。
grep "init cluster id" {{/path/to}}/pd.log
[2019/10/14 10:35:38.880 +00:00] [INFO] [server.go:212] ["init cluster id"] [cluster-id=6747551640615446306]
...
TiDBログからクラスタIDを取得する
TiDBログからクラスタIDを取得するには、次のコマンドを実行します。
grep "init cluster id" {{/path/to}}/tidb.log
2019/10/14 19:23:04.688 client.go:161: [info] [pd] init cluster id 6747551640615446306
...
TiKVログからクラスタIDを取得する
TiKVログからクラスタIDを取得するには、次のコマンドを実行します。
grep "connect to PD cluster" {{/path/to}}/tikv.log
[2019/10/14 07:06:35.278 +00:00] [INFO] [tikv-server.rs:464] ["connect to PD cluster 6747551640615446306"]
...
ステップ2:割り当てられたIDを取得する
指定する割り当て済みID値は、現在割り当てられている最大のID値よりも大きくなければなりません。割り当て済みIDを取得するには、モニターから取得するか、サーバー上で直接ログを確認してください。
モニターから割り当てられたIDを取得する(推奨)
モニターから割り当てられたIDを取得するには、表示しているメトリックが前回のPDリーダーのメトリックであることを確認する必要があります。また、PDダッシュボードの「現在のID割り当て」パネルから、最大の割り当て済みIDを取得できます。
PDログから割り当てられたIDを取得する
PDログから割り当てられたIDを取得するには、表示しているログが最後のPDリーダーのログであることを確認する必要があります。また、次のコマンドを実行することで、割り当てられた最大IDを取得できます。
grep "idAllocator allocates a new id" {{/path/to}}/pd*.log | awk -F'=' '{print $2}' | awk -F']' '{print $1}' | sort -r -n | head -n 1
4000
...
または、上記のコマンドをすべてのPDサーバーで実行して、最大のサーバーを見つけることもできます。
ステップ3:新しいPDクラスタをデプロイ
新しい PD クラスターをデプロイする前に、既存の PD クラスターを停止し、以前のデータ ディレクトリを削除するか、 --data-dirを使用して新しいデータ ディレクトリを指定する必要があります。
ステップ4:pd-recoverを使用する
PDノード1でのみpd-recoverプログラムを実行してください。再割り当てを避けるため、 -alloc-idパラメータには割り当て済みIDよりも大きな値を設定することをお勧めします。たとえば、監視またはログから取得した最大割り当て済みIDが9000の場合、 -alloc-idパラメータには10000以上の値を渡すことをお勧めします。
./pd-recover -endpoints http://10.0.1.13:2379 -cluster-id 6747551640615446306 -alloc-id 10000
ステップ5:クラスター全体を再起動する
リカバリが成功したことを示すメッセージが表示されたら、クラスター全体を再起動してください。
FAQ
クラスターIDを取得する際に、複数のクラスターIDが見つかりました。
PDクラスタが作成されると、新しいクラスタIDが生成されます。古いクラスタのクラスタIDは、ログを確認することで確認できます。
pd-recoverを実行すると、エラー「 dial tcp 10.0.1.13:2379: connect: connection refusedが返されます。
PD サービスは、 pd-recover実行する際に必要です。PD Recover を使用する前に、PD クラスタをデプロイ起動してください。