ペシミスティックモードでシャードテーブルからデータをマージおよび移行する
このドキュメントでは、ペシミスティックモード(デフォルトモード)でデータ移行(DM)によって提供されるシャーディングサポート機能を紹介します。この機能を使用すると、アップストリームのMySQLまたはMariaDBインスタンスの同じテーブルスキーマを持つテーブルのデータを、ダウンストリームのTiDBの1つの同じテーブルにマージして移行できます。
制限
DMには、ペシミスティックモードでの次のシャーディングDDL使用制限があります。
- 論理シャーディンググループ(1つの同じダウンストリームテーブルにマージおよび移行する必要があるすべてのシャードテーブルで構成される)の場合、移行を実行するためにシャードテーブルのソースを正確に含む1つのタスクを使用するように制限されます。
- 論理シャーディンググループでは、すべてのアップストリームシャーディングテーブルで同じDDLステートメントを同じ順序で実行する必要があり(スキーマ名とテーブル名は異なる場合があります)、現在のDDL操作が完全に行われない限り次のDDLステートメントを実行できません。終了した。
- たとえば、
column B
を追加する前にcolumn A
からtable_1
を追加した場合、column A
を追加する前にcolumn B
からtable_2
を追加することはできません。 DDLステートメントを別の順序で実行することはサポートされていません。
- たとえば、
- シャーディンググループでは、対応するDDLステートメントをすべてのアップストリームシャードテーブルで実行する必要があります。
- たとえば、1に対応する
DM-worker-2
つ以上のアップストリームシャードテーブルでDDLステートメントが実行されない場合、DDLステートメントを実行した他のDMワーカーは、移行タスクを一時停止し、DM-worker-2
がアップストリームDDLステートメントを受信するのを待ちます。
- たとえば、1に対応する
- シャーディンググループの移行タスクは
DROP DATABASE
をサポートしていませDROP TABLE
。- DM-workerの同期ユニットは、アップストリームシャードテーブルの
DROP DATABASE
ステートメントを自動的に無視しDROP TABLE
。
- DM-workerの同期ユニットは、アップストリームシャードテーブルの
- シャーディンググループの移行タスクは
TRUNCATE TABLE
をサポートしていません。- DM-workerの同期ユニットは、アップストリームシャードテーブルの
TRUNCATE TABLE
ステートメントを自動的に無視します。
- DM-workerの同期ユニットは、アップストリームシャードテーブルの
- シャーディンググループ移行タスクは
RENAME TABLE
をサポートしますが、次の制限があります(オンラインDDLは別のソリューションでサポートされています)。- テーブルの名前を変更できるのは、他のテーブルで使用されていない新しい名前のみです。
- 1つの
RENAME TABLE
ステートメントには、1つのRENAME
操作のみを含めることができます。
- シャーディンググループの移行タスクでは、各DDLステートメントに1つのテーブルのみに対する操作が含まれている必要があります。
- 各シャードテーブルのテーブルスキーマは、インクリメンタルレプリケーションタスクの開始点で同じである必要があります。これにより、異なるシャードテーブルのDMLステートメントを、明確なテーブルスキーマと、それに続くシャーディングDDLを使用してダウンストリームに移行できるようになります。ステートメントは正しく照合および移行できます。
- テーブルルーティングのルールを変更する必要がある場合は、すべてのシャーディングDDLステートメントの移行が完了するのを待つ必要があります。
- シャーディングDDLステートメントの移行中に、
dmctl
を使用してrouter-rules
を変更すると、エラーが報告されます。
- シャーディングDDLステートメントの移行中に、
- DDLステートメントが実行されているシャーディンググループに新しいテーブルを
CREATE
追加する必要がある場合は、テーブルスキーマが新しく変更されたテーブルスキーマと同じであることを確認する必要があります。- たとえば、元の
table_1
とtable_2
の両方に最初は2つの列(a、b)があり、シャーディングDDL操作後に3つの列(a、b、c)があるため、移行後、新しく作成されたテーブルにも3つの列( a、b、c)。
- たとえば、元の
- DDLステートメントを受信したDMワーカーは、他のDMワーカーがDDLステートメントを受信するのを待つためにタスクを一時停止するため、データ移行の遅延が増加します。
バックグラウンド
現在、DMはROW
形式のbinlogを使用して移行タスクを実行します。 binlogには、テーブルスキーマ情報は含まれていません。 ROW
のbinlogを使用してデータを移行する場合、複数のアップストリームテーブルを同じダウンストリームテーブルに移行していない場合、ダウンストリームテーブルのテーブルスキーマを更新できる1つのアップストリームテーブルのDDL操作のみが存在します。 ROW
のbinlogは、自己記述の性質を持っていると見なすことができます。移行プロセス中に、DMLステートメントは、列の値とダウンストリームのテーブルスキーマに応じて作成できます。
ただし、シャーディングされたテーブルをマージおよび移行するプロセスで、アップストリームテーブルでDDLステートメントを実行してテーブルスキーマを変更する場合は、生成されたDMLステートメント間の不整合を回避するために、追加の操作を実行してDDLステートメントを移行する必要があります。列の値と実際のダウンストリームテーブルスキーマによって。
簡単な例を次に示します。
上記の例では、マージプロセスが簡略化されており、アップストリームには2つのMySQLインスタンスのみが存在し、各インスタンスには1つのテーブルしかありません。移行が開始されると、2つのシャーディングされたテーブルのテーブルスキーマバージョンはschema V1
としてマークされ、DDLステートメントの実行後のテーブルスキーマバージョンはschema V2
としてマークされます。
ここで、移行プロセスで、2つのアップストリームシャードテーブルから受信したbinlogデータの時系列が次のようになっていると仮定します。
- 移行が開始されると、DM-workerの同期ユニットは、2つのシャーディングされたテーブルから
schema V1
のDMLイベントを受け取ります。 t1
で、インスタンス1からのシャーディングDDLイベントが受信されます。t2
以降、同期ユニットはインスタンス1からschema V2
のDMLイベントを受信します。ただし、インスタンス2からは、schema V1
のDMLイベントを引き続き受信します。t3
で、インスタンス2からのシャーディングDDLイベントが受信されます。t4
以降、同期ユニットはインスタンス2からもschema V2
のDMLイベントを受信します。
シャードテーブルのDDLステートメントは移行プロセス中に処理されないと想定します。インスタンス1のDDLステートメントがダウンストリームに移行された後、ダウンストリームテーブルスキーマがschema V2
に変更されます。ただし、たとえば2の場合、DM-workerの同期ユニットはまだt2
からt3
までのschema V1
のDMLイベントを受信しています。したがって、 schema V1
のDMLステートメントがダウンストリームにマイグレーションされると、DMLステートメントとテーブル・スキーマの間の不整合がエラーを引き起こし、データを正常にマイグレーションできない可能性があります。
原則
このセクションでは、ペシミスティックモードでの上記の例に基づいて、シャーディングされたテーブルをマージするプロセスでDMがDDLステートメントを移行する方法を示します。
この例では、 DM-worker-1
はMySQLインスタンス1からデータを移行し、 DM-worker-2
はMySQLインスタンス2からデータを移行しますDM-master
は複数のDMワーカー間のDDL移行を調整します。 DDLステートメントを受信するDM-worker-1
から開始して、DDL移行プロセスは次のように簡略化されます。
DM-worker-1
はMySQLインスタンス1からt1
でDDLステートメントを受信し、対応するDDLおよびDMLステートメントのデータ移行を一時停止し、DDL情報をDM-master
に送信します。DM-master
は、受信したDDL情報に基づいてこのDDLステートメントの移行を調整する必要があると判断し、このDDLステートメントのロックを作成し、DDLロック情報をDM-worker-1
に送り返し、同時にDM-worker-1
をこのロックの所有者としてマークします。DM-worker-2
は、MySQLインスタンス2からt3
でDDLステートメントを受信するまでDMLステートメントの移行を続行し、このDDLステートメントのデータ移行を一時停止し、DDL情報をDM-master
に送信します。DM-master
は、受信したDDL情報に基づいて、このDDLステートメントのロックがすでに存在していると判断し、ロック情報をDM-worker-2
に直接送信します。- タスク開始時の構成情報、アップストリームMySQLインスタンスのシャードテーブル情報、およびデプロイメントトポロジ情報に基づいて、
DM-master
は、マージするすべてのアップストリームシャードテーブルのこのDDLステートメントを受信したと判断し、このDDLステートメントをダウンストリームに移行するためのDDLロック(DM-worker-1
)。 DM-worker-1
は、ステップ2で受信したDDLロック情報に基づいてDDLステートメント実行要求を検証し、このDDLステートメントをダウンストリームに移行して、結果をDM-master
に送信します。この操作が成功すると、DM-worker-1
は後続の(t2
のbinlogから開始して)DMLステートメントの移行を続行します。DM-master
は、DDLが正常に実行されたというロック所有者からの応答を受信し、DDLロックを待機している他のすべてのDMワーカー(DM-worker-2
)に、このDDLステートメントを無視して、後続の(binlogから開始して)移行を続行するように要求します。t4
)DMLステートメント。
複数のDMワーカー間でのシャーディングDDL移行を処理するDMの特性は、次のように結論付けることができます。
- タスク構成とDMクラスタ展開トポロジー情報に基づいて、論理シャーディング・グループが
DM-master
に組み込まれ、DDL移行を調整します。グループメンバーは、移行タスクから分割された各サブタスクを処理するDMワーカーです)。 - binlogイベントからDDLステートメントを受信した後、各DMワーカーはDDL情報を
DM-master
に送信します。 DM-master
は、各DMワーカーから受信したDDL情報とシャーディンググループ情報に基づいて、DDLロックを作成または更新します。- シャーディンググループのすべてのメンバーが同じ特定のDDLステートメントを受け取った場合、これは、アップストリームシャードテーブルでのDDL実行前のすべてのDMLステートメントが完全に移行され、このDDLステートメントを実行できることを示します。その後、DMは後続のDMLステートメントの移行を続行できます。
- テーブルルーターによって変換された後、アップストリームシャードテーブルのDDLステートメントは、ダウンストリームで実行されるDDLステートメントと一致している必要があります。したがって、このDDLステートメントはDDL所有者が1回だけ実行する必要があり、他のすべてのDMワーカーはこのDDLステートメントを無視できます。
上記の例では、各DMワーカーに対応するアップストリームのMySQLインスタンスにマージする必要があるシャードテーブルは1つだけです。ただし、実際のシナリオでは、複数のシャードスキーマに複数のシャードテーブルがあり、1つのMySQLインスタンスにマージされる場合があります。そして、これが発生すると、シャーディングDDL移行の調整がより複雑になります。
1つのMySQLインスタンスにマージされる2つのシャードテーブル、つまりtable_1
とtable_2
があると仮定します。
データは同じMySQLインスタンスから取得されるため、すべてのデータは同じbinlogストリームから取得されます。この場合、時系列は次のようになります。
- DM-workerの同期ユニットは、移行の開始時に両方のシャーディングされたテーブルから
schema V1
のDMLステートメントを受け取ります。 t1
で、DM-workerの同期ユニットはtable_1
のDDLステートメントを受け取ります。t2
からt3
まで、受信したデータには、table_1
からschema V2
のDMLステートメントとtable_2
からschema V1
のDMLステートメントが含まれます。t3
で、DM-workerの同期ユニットはtable_2
のDDLステートメントを受け取ります。t4
以降、DM-workerの同期ユニットは両方のテーブルからschema V2
のDMLステートメントを受け取ります。
特にデータ移行中にDDLステートメントが処理されない場合、 table_1
のDDLステートメントがダウンストリームに移行され、ダウンストリームテーブルスキーマが変更されると、 table_2
からschema V1
のDMLステートメントは正常に移行できません。したがって、単一のDMワーカー内に、 DM-master
内と同様の論理シャーディンググループが作成されます。ただし、このグループのメンバーは、同じアップストリームMySQLインスタンス内の異なるシャーディングテーブルです。
ただし、DMワーカーがシャーディンググループの移行をそれ自体の中で調整する場合、 DM-master
によって実行されるものと完全に同じではありません。その理由は次のとおりです。
- DMワーカーが
table_1
のDDLステートメントを受信すると、移行を一時停止することはできず、後続のtable_2
のDDLステートメントを取得するためにbinlogの解析を続行する必要があります。これは、t2
からt3
の間で解析を継続する必要があることを意味します。 t2
からt3
までのbinlog解析プロセス中、シャーディングDDLステートメントが移行されて正常に実行されるまで、table_1
からschema V2
のDMLステートメントをダウンストリームに移行することはできません。
DMでは、DMワーカー内でDDLステートメントをシャーディングする単純化された移行プロセスは次のとおりです。
table_1
att1
のDDLステートメントを受信すると、DMワーカーはDDL情報とbinlogの現在の位置を記録します。- DM-workerは、
t2
からt3
の間でbinlogの解析を続行します。 - DM-workerは、
table_1
に属するschema V2
スキーマのDMLステートメントを無視し、table_2
に属するschema V1
スキーマのDMLステートメントをダウンストリームに移行します。 table_2
att3
のDDLステートメントを受信すると、DMワーカーはDDL情報とbinlogの現在の位置を記録します。- DMワーカーは、移行タスクの構成とアップストリームスキーマおよびテーブルの情報に基づいて、MySQLインスタンス内のすべてのシャーディングテーブルのDDLステートメントが受信されたと判断し、それらをダウンストリームに移行してダウンストリームテーブルスキーマを変更します。
- DM-workerは、新しいbinlogストリームを解析する開始点を、ステップ1で保存された位置に設定します。
- DM-workerは、binlogの解析を
t2
からt3
の間で再開します。 - DM-workerは、
table_1
に属するschema V2
スキーマのDMLステートメントをダウンストリームに移行し、table_2
に属するschema V1
スキーマのDMLステートメントを無視します。 - ステップ4で保存されたbinlog位置を解析した後、DMワーカーは、ステップ3で無視されたすべてのDMLステートメントが再びダウンストリームにマイグレーションされたと判断します。
- DM-workerは、binlogの位置
t4
から移行を再開します。
上記の分析から、DMは、シャーディングDDLの移行を処理する際の調整と制御に、主に2レベルのシャーディンググループを使用していると結論付けることができます。簡略化されたプロセスは次のとおりです。
- 各DMワーカーは、アップストリームMySQLインスタンス内の複数のシャーディングテーブルで構成される対応するシャーディンググループのDDLステートメントの移行を個別に調整します。
- DM-workerは、すべてのシャーディングされたテーブルのDDLステートメントを受信した後、DDL情報を
DM-master
に送信します。 DM-master
は、受信したDDL情報に基づいて、DMワーカーで構成されるシャーディンググループのDDL移行を調整します。- すべてのDMワーカーからDDL情報を受信した後、
DM-master
はDDLロック所有者(特定のDMワーカー)にDDLステートメントの実行を要求します。 - DDLロックの所有者はDDLステートメントを実行し、結果を
DM-master
に返します。次に、所有者は、DDL移行の内部調整中に、以前に無視されたDMLステートメントの移行を再開します。 DM-master
は、所有者がDDLステートメントを正常に実行したことを確認した後、他のすべてのDMワーカーに移行を続行するように要求します。- 他のすべてのDMワーカーは、DDL移行の内部調整中に、以前に無視されたDMLステートメントの移行を個別に再開します。
- 無視されたDMLステートメントの移行が再度終了すると、すべてのDMワーカーは通常の移行プロセスを再開します。