PD Recover ユーザーガイド
PD Recover は、正常に起動またはサービスを提供できない PD クラスターを復旧するために使用される PD の災害復旧ツールです。
ソースコードからコンパイルする
- Go モジュールが使用されるため、 行く以降が必要です。
- 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 ノードを起動します。次に例を示します。
./bin/pd-server --force-new-cluster --name=pd-127.0.0.10-2379 --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
ステップ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を使用する
1 つの PD ノードで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 クラスターをデプロイ起動するを実行する場合は、PD サービスが必要です。