TiDB Binlog FAQ
このドキュメントは、TiDB Binlogに関するよくある質問(FAQ)を集めたものです。
TiDB Binlogを有効にすると、TiDBのパフォーマンスにどのような影響がありますか?
クエリへの影響はありません。
INSERT
、およびDELETE
のトランザクションにはわずかなパフォーマンスの影響がありUPDATE
。レイテンシーでは、トランザクションがコミットされる前に、TiKVプリライトステージでp-binlogが同時に書き込まれます。一般に、binlogの書き込みはTiKVの事前書き込みよりも高速であるため、レイテンシーは増加しません。ポンプの監視パネルでbinlogの書き込みの応答時間を確認できます。
TiDB Binlogのレプリケーションレイテンシはどのくらいですか?
TiDB Binlogレプリケーションの遅延は秒単位で測定されます。これは、通常、オフピーク時に約3秒です。
DrainerがダウンストリームのMySQLまたはTiDBクラスタにデータを複製するために必要な特権は何ですか?
ダウンストリームのMySQLまたはTiDBクラスタにデータを複製するには、Drainerに次の権限が必要です。
- 入れる
- アップデート
- 消去
- 作成
- 落とす
- 変更
- 実行する
- 索引
- 選択する
ポンプディスクがほぼいっぱいになった場合はどうすればよいですか?
PumpのGCが正常に機能するかどうかを確認します。
- Pumpの監視パネルのgc_tso時間が設定ファイルの時間と同じであるかどうかを確認します。
GCが正常に機能する場合は、次の手順を実行して、単一のポンプに必要なスペースの量を減らします。
PumpのGCパラメータを変更して、データを保持する日数を減らします。
ポンプインスタンスを追加します。
ドレイナーの複製が中断された場合はどうすればよいですか?
次のコマンドを実行して、Pumpのステータスが正常であるかどうか、およびoffline
状態にないすべてのPumpインスタンスが実行されているかどうかを確認します。
binlogctl -cmd pumps
次に、Drainerモニターまたはログが対応するエラーを出力するかどうかを確認します。もしそうなら、それに応じてそれらを解決します。
DrainerがダウンストリームのMySQLまたはTiDBクラスタにデータを複製するのが遅い場合はどうすればよいですか?
次の監視項目を確認してください。
Drainerイベントの監視メトリックについては、Drainerが
DELETE
秒あたりINSERT
、およびUPDATE
のトランザクションをダウンストリームに複製する速度を確認してください。SQLクエリ時間の監視メトリックについては、DrainerがダウンストリームでSQLステートメントを実行するのにかかる時間を確認してください。
レプリケーションが遅い場合の考えられる原因と解決策:
レプリケートされたデータベースに主キーまたは一意のインデックスのないテーブルが含まれている場合は、テーブルに主キーを追加します。
Drainerとダウンストリームの間のレイテンシーが高い場合は、Drainerの
worker-count
パラメーターの値を増やします。データセンター間のレプリケーションでは、Drainerをダウンストリームにデプロイすることをお勧めします。下流の負荷が高くない場合は、Drainerの
worker-count
パラメータの値を大きくしてください。
Pumpインスタンスがクラッシュした場合はどうすればよいですか?
Pumpインスタンスがクラッシュした場合、Drainerはこのインスタンスのデータを取得できないため、データをダウンストリームに複製できません。このPumpインスタンスが通常の状態に回復できる場合、Drainerはレプリケーションを再開します。そうでない場合は、次の手順を実行します。
binlogctlを使用して、このPumpインスタンスの状態を
offline
に変更しますを使用して、このPumpインスタンスのデータを破棄します。Drainerはこのポンプインスタンスのデータを取得できないため、ダウンストリームとアップストリームのデータに一貫性がありません。この状況では、完全バックアップと増分バックアップを再度実行してください。手順は次のとおりです。
ドレイナーを停止します。
アップストリームで完全バックアップを実行します。
tidb_binlog.checkpoint
のテーブルを含むダウンストリームのデータをクリアします。フルバックアップをダウンストリームに復元します。
Drainerをデプロイし、最初のレプリケーションの開始点として
initialCommitTs
(完全バックアップのスナップショットタイムスタンプとしてinitialCommitTs
を設定)を使用します。
チェックポイントとは何ですか?
チェックポイントは、Drainerがダウンストリームに複製するcommit-ts
を記録します。 Drainerが再起動すると、チェックポイントを読み取り、対応するcommit-ts
から開始してデータをダウンストリームに複製します。 ["write save point"] [ts=411222863322546177]
Drainerログは、対応するタイムスタンプとともにチェックポイントを保存することを意味します。
チェックポイントは、さまざまなタイプのダウンストリームプラットフォームに対してさまざまな方法で保存されます。
MySQL / TiDBの場合、
tidb_binlog.checkpoint
のテーブルに保存されます。Kafka / fileの場合、対応する構成ディレクトリのファイルに保存されます。
kafka / fileのデータにはcommit-ts
が含まれているため、チェックポイントが失われた場合、ダウンストリームで最新のデータを使用することにより、ダウンストリームデータの最新のcommit-ts
をチェックできます。
ドレイナーは、開始時にチェックポイントを読み取ります。 Drainerがチェックポイントを読み取れない場合は、構成されたinitialCommitTs
を初期レプリケーションの開始点として使用します。
Drainerに障害が発生し、ダウンストリームのデータが残っている場合に、Drainerを新しいマシンに再デプロイするにはどうすればよいですか?
ダウンストリームのデータが影響を受けない場合は、対応するチェックポイントからデータを複製できる限り、新しいマシンにDrainerを再デプロイできます。
チェックポイントが失われていない場合は、次の手順を実行します。
新しいDrainerをデプロイして開始します(Drainerはチェックポイントを読み取り、レプリケーションを再開できます)。
チェックポイントが失われた場合は、次の手順を実行します。
新しいドレイナーを配置するには、古いドレイナーの
commit-ts
つを新しいドレイナーのinitialCommitTs
として取得します。
フルバックアップとbinlogバックアップファイルを使用してクラスタのデータを復元するにはどうすればよいですか?
クラスタをクリーンアップし、完全バックアップを復元します。
バックアップファイルの最新データを復元するには、Reparoを使用して
start-tso
={完全バックアップのスナップショットタイムスタンプ+1}およびend-ts
=0に設定します(または、特定の時点を指定できます)。
プライマリ-セカンダリレプリケーションでignore-error
を有効にすると、重大なエラーが発生する場合にDrainerを再デプロイするにはどうすればよいですか?
ignore-error
を有効にした後でTiDBがbinlogの書き込みに失敗したときに重大なエラーがトリガーされた場合、TiDBはbinlogの書き込みを停止し、binlogデータの損失が発生します。レプリケーションを再開するには、次の手順を実行します。
Drainerインスタンスを停止します。
クリティカルエラーをトリガーした
tidb-server
つのインスタンスを再起動し、binlogの書き込みを再開します(クリティカルエラーがトリガーされた後、TiDBはPumpにbinlogを書き込みません)。アップストリームで完全バックアップを実行します。
tidb_binlog.checkpoint
のテーブルを含むダウンストリームのデータをクリアします。フルバックアップをダウンストリームに復元します。
Drainerをデプロイし、最初のレプリケーションの開始点として
initialCommitTs
(完全バックアップのスナップショットタイムスタンプとしてinitialCommitTs
を設定)を使用します。
ポンプまたはドレイナーノードを一時停止または閉じることができるのはいつですか?
ポンプまたはドレイナーの状態の説明と、プロセスを開始および終了する方法については、 TiDBBinlogクラスターの操作を参照してください。
サービスを一時的に停止する必要がある場合は、ポンプノードまたはドレイナーノードを一時停止します。例えば:
バージョンアップグレード
プロセスが停止した後、新しいバイナリを使用してサービスを再起動します。
サーバのメンテナンス
サーバーがダウンタイムのメンテナンスを必要とする場合は、プロセスを終了し、メンテナンスの終了後にサービスを再開します。
サービスが不要になったら、ポンプノードまたはドレイナーノードを閉じます。例えば:
ポンプスケールイン
あまり多くのポンプサービスを必要としない場合は、それらのいくつかを閉じます。
レプリケーションタスクのキャンセル
データをダウンストリームデータベースに複製する必要がなくなった場合は、対応するDrainerノードを閉じます。
サービスの移行
サービスを別のサーバーに移行する必要がある場合は、サービスを閉じて、新しいサーバーに再デプロイします。
ポンプまたはドレイナープロセスを一時停止するにはどうすればよいですか?
プロセスを直接強制終了します。
ノート:
kill -9
コマンドは使用しないでください。そうしないと、PumpまたはDrainerノードは信号を処理できません。PumpまたはDrainerノードがフォアグラウンドで実行されている場合は、 Ctrl + Cを押して一時停止します。
binlogctlで
pause-pump
またはpause-drainer
コマンドを使用します。
binlogctlでupdate-pump
またはupdate-drainer
drainerコマンドを使用して、PumpまたはDrainerサービスを一時停止できますか?
いいえupdate-pump
またはupdate-drainer
コマンドは、対応する操作を実行するようにポンプまたはドレイナーに通知することなく、PDに保存されている状態情報を直接変更します。 2つのコマンドを誤用すると、データレプリケーションが中断され、データが失われる可能性があります。
binlogctlでupdate-pump
またはupdate-drainer
drainerコマンドを使用して、PumpまたはDrainerサービスを閉じることはできますか?
いいえupdate-pump
またはupdate-drainer
コマンドは、対応する操作を実行するようにポンプまたはドレイナーに通知することなく、PDに保存されている状態情報を直接変更します。 2つのコマンドを誤用すると、データレプリケーションが中断され、データの不整合が発生する可能性があります。例えば:
- Pumpノードが正常に実行されているか
paused
状態にある場合、update-pump
コマンドを使用してPump状態をoffline
に設定すると、Drainerノードは7Pumpからのoffline
データのプルを停止します。この状況では、最新のbinlogをDrainerノードに複製できないため、アップストリームとダウンストリームの間でデータの不整合が発生します。 - Drainerノードが正常に実行されているときに、
update-drainer
コマンドを使用してDrainer状態をoffline
に設定すると、新しく開始されたPumpノードはonline
状態のDrainerノードにのみ通知します。この状況では、offline
DrainerはPumpノードからbinlogデータを時間内にプルできず、アップストリームとダウンストリームの間でデータの不整合が発生します。
binlogctlのupdate-pump
コマンドを使用して、ポンプの状態をpaused
に設定できるのはいつですか。
いくつかの異常な状況では、ポンプはその状態を正しく維持できません。次に、 update-pump
コマンドを使用して状態を変更します。
たとえば、Pumpプロセスが異常終了した場合(パニックが発生したときにプロセスを直接終了した場合、または誤ってkill -9
コマンドを使用してプロセスを強制終了した場合)、PDに保存されたPump状態情報はonline
のままです。この状況で、現時点でサービスを回復するためにPumpを再起動する必要がない場合は、 update-pump
コマンドを使用してPumpの状態をpaused
に更新します。そうすれば、TiDBがbinlogを書き込み、Drainerがbinlogをプルするときに中断を回避できます。
binlogctlのupdate-drainer
drainerコマンドを使用して、Drainerの状態をpaused
に設定できるのはいつですか。
一部の異常な状況では、Drainerノードがその状態を正しく維持できず、レプリケーションタスクに影響を及ぼしています。次に、 update-drainer
コマンドを使用して状態を変更します。
たとえば、Drainerプロセスが異常終了した場合(パニックが発生したときにプロセスを直接終了した場合、または誤ってkill -9
コマンドを使用してプロセスを強制終了した場合)、PDに保存されたDrainer状態情報はonline
のままです。ポンプノードが開始されると、終了したドレイナーノードへの通知に失敗し( notify drainer ...
エラー)、ポンプノードに障害が発生します。この状況では、 update-drainer
コマンドを使用してDrainerの状態をpaused
に更新し、Pumpノードを再起動します。
ポンプまたはドレイナーノードを閉じるにはどうすればよいですか?
現在、binlogctlのoffline-pump
またはoffline-drainer
コマンドのみを使用して、PumpまたはDrainerノードを閉じることができます。
binlogctlでupdate-pump
コマンドを使用して、ポンプの状態をoffline
に設定できるのはいつですか。
次の状況では、 update-pump
コマンドを使用してポンプ状態をoffline
に設定できます。
- Pumpプロセスが異常終了し、サービスを回復できない場合、レプリケーションタスクは中断されます。レプリケーションを回復し、binlogデータの損失を受け入れる場合は、
update-pump
コマンドを使用してPump状態をoffline
に設定します。次に、DrainerノードはPumpノードからのbinlogのプルを停止し、データの複製を続行します。 - いくつかの古いポンプノードは、履歴タスクから残されています。それらのプロセスは終了し、それらのサービスはもはや必要ありません。次に、
update-pump
コマンドを使用して状態をoffline
に設定します。
その他の状況では、 offline-pump
コマンドを使用して、通常のプロセスであるポンプサービスを閉じます。
終了してpaused
に設定されているPumpノードを閉じたい場合、binlogctlのupdate-pump
コマンドを使用してPump状態をoffline
に設定できますか?
Pumpプロセスが終了し、ノードがpaused
状態の場合、ノード内のすべてのbinlogデータがそのダウンストリームのDrainerノードで消費されるわけではありません。したがって、そうすると、アップストリームとダウンストリームの間でデータの不整合が発生する可能性があります。この状況では、Pumpを再起動し、 offline-pump
コマンドを使用してPumpノードを閉じます。
binlogctlのupdate-drainer
drainerコマンドを使用して、Drainerの状態をoffline
に設定できるのはいつですか。
一部の古いDrainerノードは、履歴タスクから残されています。それらのプロセスは終了し、それらのサービスはもはや必要ありません。次に、 update-drainer
コマンドを使用して状態をoffline
に設定します。
change pump
のchange drainer
やドレイナーの変更などのSQL操作を使用して、ポンプまたはドレイナーサービスを一時停止または閉じることはできますか?
いいえ。これらのSQL操作の詳細については、 SQLステートメントを使用してPumpまたはDrainerを管理するを参照してください。
これらのSQL操作は、PDに保存されている状態情報を直接変更し、binlogctlのupdate-pump
およびupdate-drainer
コマンドと機能的に同等です。 PumpまたはDrainerサービスを一時停止または閉じるには、binlogctlツールを使用します。
アップストリームデータベースでサポートされている一部のDDLステートメントがダウンストリームデータベースで実行されたときにエラーを引き起こす場合はどうすればよいですか?
問題を解決するには、次の手順に従います。
drainer.log
を確認してください。 Drainerプロセスが終了する前に、最後に失敗したDDL操作をexec failed
で検索します。DDLバージョンをダウンストリームと互換性のあるバージョンに変更します。ダウンストリームデータベースでこの手順を手動で実行します。
drainer.log
を確認してください。失敗したDDL操作を検索し、この操作のcommit-ts
を見つけます。例えば:[2020/05/21 09:51:58.019 +08:00] [INFO] [syncer.go:398] ["add ddl item to syncer, you can add this commit ts to `ignore-txn-commit-ts` to skip this ddl if needed"] [sql="ALTER TABLE `test` ADD INDEX (`index1`)"] ["commit ts"=416815754209656834].drainer.toml
の構成ファイルを変更します。ignore-txn-commit-ts
項目にcommit-ts
を追加し、Drainerノードを再起動します。
TiDBがbinlogへの書き込みに失敗してスタックし、 listener stopped, waiting for manual stop
ていることがログに表示されます
TiDB v3.0.12以前のバージョンでは、binlogの書き込みに失敗すると、TiDBが致命的なエラーを報告します。 TiDBは自動的に終了せず、サービスを停止するだけで、スタックしているように見えます。ログにlistener stopped, waiting for manual stop
のエラーが表示されます。
binlog書き込み失敗の具体的な原因を特定する必要があります。 binlogがダウンストリームにゆっくりと書き込まれるために障害が発生した場合は、Pumpをスケールアウトするか、binlogを書き込むためのタイムアウト時間を増やすことを検討できます。
v3.0.13以降、エラー報告ロジックが最適化されています。 binlogの書き込みに失敗すると、トランザクションの実行が失敗し、TiDB Binlogはエラーを返しますが、TiDBがスタックすることはありません。
TiDBは重複したbinlogをPumpに書き込みます
この問題は、ダウンストリームおよびレプリケーションロジックには影響しません。
binlogの書き込みが失敗するかタイムアウトになると、TiDBは、書き込みが成功するまで、次に使用可能なPumpノードへのbinlogの書き込みを再試行します。したがって、Pumpノードへのbinlogの書き込みが遅く、TiDBタイムアウト(デフォルトは15秒)が発生した場合、TiDBは書き込みが失敗したと判断し、次のPumpノードへの書き込みを試みます。 binlogがタイムアウトの原因となるPumpノードに実際に正常に書き込まれる場合、同じbinlogが複数のPumpノードに書き込まれます。 Drainerがbinlogを処理するとき、同じTSOでbinlogを自動的に重複排除するため、この重複書き込みはダウンストリームおよびレプリケーションロジックに影響を与えません。
Reparoは、完全および増分復元プロセス中に中断されます。ログの最後のTSOを使用してレプリケーションを再開できますか?
はい。 Reparoは、起動時にセーフモードを自動的に有効にしません。次の手順を手動で実行する必要があります。
- Reparoが中断された後、最後のTSOを
checkpoint-tso
としてログに記録します。 - Reparo構成ファイルを変更し、構成項目
start-tso
をcheckpoint-tso + 1
に設定し、stop-tso
をcheckpoint-tso + 80,000,000,000
に設定し(checkpoint-tso
の約5分後)、safe-mode
をtrue
に設定します。 Reparoを起動すると、Reparoはデータをstop-tso
に複製してから、自動的に停止します。 - Reparoが自動的に停止した後、
start-tso
からcheckpoint tso + 80,000,000,001
に設定し、stop-tso
から0
に設定し、safe-mode
からfalse
に設定します。 Reparoを起動して、レプリケーションを再開します。