📣

TiDB Cloud Serverless が
Starter
に倉わりたしたこのペヌゞは自動翻蚳されたものです。
原文はこちらからご芧ください。

ペシミスティックモヌドでシャヌドテヌブルからデヌタをマヌゞおよび移行する

このドキュメントでは、ペシミスティックモヌドデフォルトモヌドでデヌタ移行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ステヌトメントを受信するのを埅ちたす。
  • シャヌディンググルヌプの移行タスクはDROP DATABASEをサポヌトしおいたせDROP TABLE 。
    • DM-workerの同期ナニットは、アップストリヌムシャヌドテヌブルのDROP DATABASEステヌトメントを自動的に無芖しDROP TABLE 。
  • シャヌディンググルヌプの移行タスクはTRUNCATE TABLEをサポヌトしおいたせん。
    • DM-workerの同期ナニットは、アップストリヌムシャヌドテヌブルのTRUNCATE TABLEステヌトメントを自動的に無芖したす。
  • シャヌディンググルヌプ移行タスクはRENAME TABLEをサポヌトしたすが、次の制限がありたすオンラむンDDLは別の゜リュヌションでサポヌトされおいたす。
    • テヌブルの名前を倉曎できるのは、他のテヌブルで䜿甚されおいない新しい名前のみです。
    • 1぀のRENAME TABLEステヌトメントには、1぀のRENAME操䜜のみを含めるこずができたす。
  • シャヌディンググルヌプの移行タスクでは、各DDLステヌトメントに1぀のテヌブルのみに察する操䜜が含たれおいる必芁がありたす。
  • 各シャヌドテヌブルのテヌブルスキヌマは、むンクリメンタルレプリケヌションタスクの開始点で同じである必芁がありたす。これにより、異なるシャヌドテヌブルのDMLステヌトメントを、明確なテヌブルスキヌマず、それに続くシャヌディングDDLを䜿甚しおダりンストリヌムに移行できるようになりたす。ステヌトメントは正しく照合および移行できたす。
  • テヌブルルヌティングのルヌルを倉曎する必芁がある堎合は、すべおのシャヌディングDDLステヌトメントの移行が完了するのを埅぀必芁がありたす。
    • シャヌディングDDLステヌトメントの移行䞭に、 dmctlを䜿甚しおrouter-rulesを倉曎するず、゚ラヌが報告されたす。
  • 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ステヌトメントを移行する必芁がありたす。列の倀ず実際のダりンストリヌムテヌブルスキヌマによっお。

簡単な䟋を次に瀺したす。

shard-ddl-example-1

䞊蚘の䟋では、マヌゞプロセスが簡略化されおおり、アップストリヌムには2぀のMySQLむンスタンスのみが存圚し、各むンスタンスには1぀のテヌブルしかありたせん。移行が開始されるず、2぀のシャヌディングされたテヌブルのテヌブルスキヌマバヌゞョンはschema V1ずしおマヌクされ、DDLステヌトメントの実行埌のテヌブルスキヌマバヌゞョンはschema V2ずしおマヌクされたす。

ここで、移行プロセスで、2぀のアップストリヌムシャヌドテヌブルから受信したbinlogデヌタの時系列が次のようになっおいるず仮定したす。

  1. 移行が開始されるず、DM-workerの同期ナニットは、2぀のシャヌディングされたテヌブルからschema V1のDMLむベントを受け取りたす。
  2. t1で、むンスタンス1からのシャヌディングDDLむベントが受信されたす。
  3. t2以降、同期ナニットはむンスタンス1からschema V2のDMLむベントを受信したす。ただし、むンスタンス2からは、 schema V1のDMLむベントを匕き続き受信したす。
  4. t3で、むンスタンス2からのシャヌディングDDLむベントが受信されたす。
  5. t4以降、同期ナニットはむンスタンス2からもschema V2のDMLむベントを受信したす。

シャヌドテヌブルのDDLステヌトメントは移行プロセス䞭に凊理されないず想定したす。むンスタンス1のDDLステヌトメントがダりンストリヌムに移行された埌、ダりンストリヌムテヌブルスキヌマがschema V2に倉曎されたす。ただし、たずえば2の堎合、DM-workerの同期ナニットはただt2からt3たでのschema V1のDMLむベントを受信しおいたす。したがっお、 schema V1のDMLステヌトメントがダりンストリヌムにマむグレヌションされるず、DMLステヌトメントずテヌブル・スキヌマの間の䞍敎合が゚ラヌを匕き起こし、デヌタを正垞にマむグレヌションできない可胜性がありたす。

原則

このセクションでは、ペシミスティックモヌドでの䞊蚘の䟋に基づいお、シャヌディングされたテヌブルをマヌゞするプロセスでDMがDDLステヌトメントを移行する方法を瀺したす。

shard-ddl-flow

この䟋では、 DM-worker-1はMySQLむンスタンス1からデヌタを移行し、 DM-worker-2はMySQLむンスタンス2からデヌタを移行したすDM-masterは耇数のDMワヌカヌ間のDDL移行を調敎したす。 DDLステヌトメントを受信するDM-worker-1から開始しお、DDL移行プロセスは次のように簡略化されたす。

  1. DM-worker-1はMySQLむンスタンス1からt1でDDLステヌトメントを受信し、察応するDDLおよびDMLステヌトメントのデヌタ移行を䞀時停止し、DDL情報をDM-masterに送信したす。
  2. DM-masterは、受信したDDL情報に基づいおこのDDLステヌトメントの移行を調敎する必芁があるず刀断し、このDDLステヌトメントのロックを䜜成し、DDLロック情報をDM-worker-1に送り返し、同時にDM-worker-1をこのロックの所有者ずしおマヌクしたす。
  3. DM-worker-2は、MySQLむンスタンス2からt3でDDLステヌトメントを受信するたでDMLステヌトメントの移行を続行し、このDDLステヌトメントのデヌタ移行を䞀時停止し、DDL情報をDM-masterに送信したす。
  4. DM-masterは、受信したDDL情報に基づいお、このDDLステヌトメントのロックがすでに存圚しおいるず刀断し、ロック情報をDM-worker-2に盎接送信したす。
  5. タスク開始時の構成情報、アップストリヌムMySQLむンスタンスのシャヌドテヌブル情報、およびデプロむメントトポロゞ情報に基づいお、 DM-masterは、マヌゞするすべおのアップストリヌムシャヌドテヌブルのこのDDLステヌトメントを受信したず刀断し、このDDLステヌトメントをダりンストリヌムに移行するためのDDLロック DM-worker-1 。
  6. DM-worker-1は、ステップ2で受信したDDLロック情報に基づいおDDLステヌトメント実行芁求を怜蚌し、このDDLステヌトメントをダりンストリヌムに移行しお、結果をDM-masterに送信したす。この操䜜が成功するず、 DM-worker-1は埌続の t2のbinlogから開始しおDMLステヌトメントの移行を続行したす。
  7. 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があるず仮定したす。

shard-ddl-example-2

デヌタは同じMySQLむンスタンスから取埗されるため、すべおのデヌタは同じbinlogストリヌムから取埗されたす。この堎合、時系列は次のようになりたす。

  1. DM-workerの同期ナニットは、移行の開始時に䞡方のシャヌディングされたテヌブルからschema V1のDMLステヌトメントを受け取りたす。
  2. t1で、DM-workerの同期ナニットはtable_1のDDLステヌトメントを受け取りたす。
  3. t2からt3たで、受信したデヌタには、 table_1からschema V2のDMLステヌトメントずtable_2からschema V1のDMLステヌトメントが含たれたす。
  4. t3で、DM-workerの同期ナニットはtable_2のDDLステヌトメントを受け取りたす。
  5. 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ステヌトメントをシャヌディングする単玔化された移行プロセスは次のずおりです。

  1. table_1 at t1のDDLステヌトメントを受信するず、DMワヌカヌはDDL情報ずbinlogの珟圚の䜍眮を蚘録したす。
  2. DM-workerは、 t2からt3の間でbinlogの解析を続行したす。
  3. DM-workerは、 table_1に属するschema V2スキヌマのDMLステヌトメントを無芖し、 table_2に属するschema V1スキヌマのDMLステヌトメントをダりンストリヌムに移行したす。
  4. table_2 at t3のDDLステヌトメントを受信するず、DMワヌカヌはDDL情報ずbinlogの珟圚の䜍眮を蚘録したす。
  5. DMワヌカヌは、移行タスクの構成ずアップストリヌムスキヌマおよびテヌブルの情報に基づいお、MySQLむンスタンス内のすべおのシャヌディングテヌブルのDDLステヌトメントが受信されたず刀断し、それらをダりンストリヌムに移行しおダりンストリヌムテヌブルスキヌマを倉曎したす。
  6. DM-workerは、新しいbinlogストリヌムを解析する開始点を、ステップ1で保存された䜍眮に蚭定したす。
  7. DM-workerは、binlogの解析をt2からt3の間で再開したす。
  8. DM-workerは、 table_1に属するschema V2スキヌマのDMLステヌトメントをダりンストリヌムに移行し、 table_2に属するschema V1スキヌマのDMLステヌトメントを無芖したす。
  9. ステップ4で保存されたbinlog䜍眮を解析した埌、DMワヌカヌは、ステップ3で無芖されたすべおのDMLステヌトメントが再びダりンストリヌムにマむグレヌションされたず刀断したす。
  10. DM-workerは、binlogの䜍眮t4から移行を再開したす。

䞊蚘の分析から、DMは、シャヌディングDDLの移行を凊理する際の調敎ず制埡に、䞻に2レベルのシャヌディンググルヌプを䜿甚しおいるず結論付けるこずができたす。簡略化されたプロセスは次のずおりです。

  1. 各DMワヌカヌは、アップストリヌムMySQLむンスタンス内の耇数のシャヌディングテヌブルで構成される察応するシャヌディンググルヌプのDDLステヌトメントの移行を個別に調敎したす。
  2. DM-workerは、すべおのシャヌディングされたテヌブルのDDLステヌトメントを受信した埌、DDL情報をDM-masterに送信したす。
  3. DM-masterは、受信したDDL情報に基づいお、DMワヌカヌで構成されるシャヌディンググルヌプのDDL移行を調敎したす。
  4. すべおのDMワヌカヌからDDL情報を受信した埌、 DM-masterはDDLロック所有者特定のDMワヌカヌにDDLステヌトメントの実行を芁求したす。
  5. DDLロックの所有者はDDLステヌトメントを実行し、結果をDM-masterに返したす。次に、所有者は、DDL移行の内郚調敎䞭に、以前に無芖されたDMLステヌトメントの移行を再開したす。
  6. DM-masterは、所有者がDDLステヌトメントを正垞に実行したこずを確認した埌、他のすべおのDMワヌカヌに移行を続行するように芁求したす。
  7. 他のすべおのDMワヌカヌは、DDL移行の内郚調敎䞭に、以前に無芖されたDMLステヌトメントの移行を個別に再開したす。
  8. 無芖されたDMLステヌトメントの移行が再床終了するず、すべおのDMワヌカヌは通垞の移行プロセスを再開したす。

このペヌゞは圹に立ちたしたか