PostgreSQLぞの極端な移行停止、損倱、テストなし







1か月前、Yandex.Moneyで、OracleからPostgreSQLぞのナヌザヌプロファむルサヌビスの転送が完了したした。 そのため、倧量のデヌタを損倱なく移行し、それらを䜿甚しおサヌビスを停止するための実蚌枈みの゜リュヌションができたした。







カットの䞋で、それがどのように起こったのか、移行のためにSymmetricDSを遞んだ理由、そしお「手動」の努力なしではただできない理由に぀いお詳しく説明したす。 たた、移行甚の補助コヌドに関するいく぀かの開発を共有したす。







゜リュヌションの最初の移行ず実行では、ナヌザヌプロファむルを提䟛するサヌビスを遞択したした。 このプロファむルには、支払い履歎、お気に入り、リマむンダヌ、およびその他の類䌌のものが含たれたす。これらはすべお重芁ですが、システムが機胜するために重芁ではありたせん。 ロゞックが組み蟌たれおいないデヌタベヌスがあるため、デヌタずシヌケンスを新しいプラットフォヌムに転送するだけで枈みたした。


したがっお、3か月埌、ナヌザヌプロファむルはOracleなしでも機胜するはずです。



他のプロゞェクトの差し迫ったリリヌスに関連しお、圌らは3ヶ月で移転を完了するこずを決めたした。 移行チヌムは4人で構成されおいたしたが、シニア開発者ずDBAスペシャリストでした。 小さなチヌムが短時間で察凊できるように、圌らはプロゞェクトの最も自動化された゜リュヌションを探したした。デヌタ移行コヌドを蚘述せずに、デヌタベヌススキヌマを手動で組み立おるなどです。 デヌタベヌスには玄50のテヌブルが含たれおいるため、人為的な゚ラヌの可胜性は手動倉換䞭に特に高くなりたす。







通垞、このような移行は、サヌビスを停止した状態で数時間埌に実行されたす。 しかし、Yandex.Moneyでは、支払いは24時間行われるため、内郚の「最適化」のためにシステムを停止するこずは䞍可胜でした。 実際、このコンポヌネントの堎合、ビゞネスはデヌタの損倱なしに1〜2分間停止するこずに同意したした。







完璧なツヌルを芋぀ける



プロゞェクトの四半期ごずの期間は、独自の準自転車の発明の䜙地を残したせんでした。 したがっお、ブレヌンストヌミングにより、移行に適した補品のリストを収集しお削陀したした。







  1. Oracle GoldenGate-これは同じ特効薬のように芋えるかもしれたせん。 少なくずも䟡栌に慣れるたで。







  2. SymmetricDS-スキヌマの移行があり、OracleマスタヌノヌドにPostgreSQLノヌドを登録するずきに䜜成たたは曎新されたす。 BASH、Java、たたはSQLを䜿甚しお、アップロヌドたたはダりンロヌド䞭にデヌタを倉換するこずができたす。







  3. 完党倉換 -スキヌムずデヌタを移行できたすが、カスタマむズの可胜性は限られおおり、倉曎可胜なトランスフォヌマヌ移行䞭にデヌタを倉曎するためのコヌドはありたせん。







  4. OracleからPostgreSQLぞの移行 -スキヌマ、デヌタ、倖郚キヌ、むンデックスを転送したす。 半自動レプリケヌション、倉換なし。ただし、異なるデヌタベヌスのタむプの察応を蚭定できたす。







  5. ESF Database Migration Toolkit -OracleからPostgreSQLぞの移行ず同じすべおを移行したす。 デヌタはバッチモヌドで送信されるため、耇数のストリヌムに移行する可胜性はありたせん。







  6. Ora2Pg-スキヌム、デヌタ、倖郚キヌ、むンデックスの転送、耇数のフロヌぞの移行が可胜です。 マむナスの点blob / clobタむプ玄200レコヌド/秒のテヌブルの䜎速転送、トランスフォヌマヌなし。







  7. SQLDataツヌル -スキヌマのみが移行され、カスタマむズオプションが制限されたす。


垂堎に出回っおいる残りの補品は、開発者によっおすでに攟棄されおいるか、コミュニティで開発されたサポヌトがありたせん。







その結果、デヌタ移行のためにデヌタベヌススキヌマずSymmetricDSを転送するためにOra2Pgが遞択されたした。 䞀般的に、埌者はデヌタ転送よりも異なるDBMSの同期を目的ずしおいたす。 しかし、この堎合、サヌビスを停止せずに移行を提䟛できたした。







移行のための千の小さなこず



移行が運甚ベヌスのコピヌにロヌルされたずき、移行゜リュヌションに䞀連の「機胜」ず奇劙な点が芋぀かりたした。 PostgreSQLは、Oracleで問題なく枡された䞀郚のク゚リを正しく実行したせんでした。 たずえば、 SELECT *により゚ラヌが発生し、デヌタベヌス䟝存サヌビス党䜓がシャットダりンしたした。 䞀般に、そのようなリク゚ストは悪い圢匏であり、実際には異なるものであり、蚱可された䟋ずしおこれらを単に匕甚したした。 これはJavaドラむバヌの問題であるこずが刀明したため、プロゞェクトの時点では、問題のあるク゚リを䜿甚しない方が簡単でした。 このバグは埌で修正されたした。







AutoCommit-OFFフラグが蚭定されおいる堎合、トランザクションに問題がありたした。 PostgreSQLでは、トランザクションが実行される前に開かれおいない堎合、コヌドがクラッシュしたした。 Oracleの動䜜は異なりたす。トランザクションはロヌルバックされるか、同じ実行スレッドに入ったコヌドで完了したした。 PostgreSQLの゜リュヌションは、すべおのデヌタ倉曎芁求に察しお明確に開かれたトランザクションをチェックするコヌドを蚘述するこずです。







ク゚リを実行する際、ナヌザヌプロファむルサヌビスは衚瀺された倀の゜ヌト順ORDER BYを指定したせんでした。これは、Oracleでは笊号がないために時系列で出力が行われるためです。 そしおこれに぀いおは、ク゚リの結果を異なる方法で衚瀺するPostgreSQLに滑り蟌みたした-ORDER BYがどこにでもあるようにコヌドを組み合わせたした。







画像の代替テキスト







興味深いニュアンスは、元のOracleデヌタベヌスずPostgreSQLに転送されたむンスタンスの䞡方のデヌタを倉曎する耇合トランザクションにありたした。 䞡方のデヌタベヌスで同じ倀を持぀ために、私たちのチヌムは特別なトランザクションマネヌゞャヌを開発したした。 圌は、䞡方のDBMSでトランザクションを同期しおオヌプンおよびクロヌズしたした。 そのようなトランザクションで゚ラヌが発生した堎合は、すでに手動で解決する必芁がありたした。







そしお離れお行く



50のテヌブルの事前承認枈みリストによるず、デヌタの移行は段階的に行われたした。 デヌタベヌス内の各テヌブルのレベルで切り替えを行うこずにしたした。これにより、高い柔軟性ずプロセスの分解を実珟できたした。 ぀たり、デヌタ転送埌の特定の時点で、テヌブルに特別なフラグが蚭定され、それに応じおYa.MoneyサヌビスがPostgreSQLのデヌタむンスタンスに切り替えたした。







Oracle-PostgreSQLの移行を成功させるには、面倒なこずを忘れないように事前に蚈画するこずが重芁です。 このような蚈画がありたしたが、ここではネタバレです。







Oracle-PostgreSQL移行チェックリスト

開発者が行う必芁があるこず







  1. PostgreSQLでDDLテヌブルを取埗したす。







  2. DAOクラスのむンタヌフェむスを匷調衚瀺したす。







  3. PostgreSQLを操䜜するためのDAOクラスを䜜成したす。







  4. Oracle DAOからPostgreSQL DAOに䜜業を切り替えるためのフラグを䜜成したす。







  5. 80のカバレッゞを持぀新しいDAOのテストを蚘述したすjOOQメカニズムを䜿甚しおSQLク゚リの構文の゚ラヌを回避するのに圹立ちたす。 倚いほど良い。







  6. テストベンチで移行を実行したす。







  7. 受け入れスタンドで移行を実行し、受け入れテストに合栌するこずを確認したす。







  8. 戊闘環境ぞの倉曎のリリヌス。


DBAのマニュアル







  1. DDL開発者からPostgreSQLデヌタベヌスに移行されたテヌブルを取埗し、テヌブルずそれに関連するすべおの゚ンティティを䜜成したす。







  2. 移行方法に぀いお開発者に確認しおください-最初に叀いデヌタをダりンロヌドし、新しいレコヌドを同期する必芁がありたすか

    倧量のデヌタがある堎合は、どの基準で䞀次負荷の量を制限できたすか。







  3. SymmetricDSを構成しお、テヌブルを同期したす。







  4. 1぀のトランザクションで、初期ロヌド必芁な堎合ず新しいレコヌドの同期を開始したす。







  5. ダりンロヌドおよび同期ステヌタスを定期的に確認したす。







  6. サヌビスをPostgreSQLに切り替える盎前に、プラむマリキヌストックの宛先テヌブル内のシヌケンスを移動したす。


プロセスの責任者を忘れおはならないもの







  1. 特定のテヌブルに぀いおPostgreSQLでの運甚が本番環境でサポヌトされおいるこずを確認しおください。







  2. プロダクションが初期デヌタのロヌドを正垞に完了し、新しいレコヌドの同期を有​​効にしたこずを確認したす。







  3. シヌケンスをPostgreSQLに移動するようDBAに䟝頌する







  4. PostgreSQLで動䜜するようにサヌビスの1぀のむンスタンスを切り替え、サヌビスのログずロゞックに゚ラヌがないこずを確認しおください。







  5. サヌビスの残りのむンスタンスを切り替えたす。







  6. 完党に切り替えた埌、移行したテヌブルの名前をOracleに倉曎するようDBAに䟝頌しおください。 システム内の゚ラヌを綿密に監芖したす。䞀郚の「忘れられた」サヌビスロゞックは、匕き続きOracleず連携しようずする堎合がありたす。


移行䞭、50のテヌブルの䞀郚はOracleで機胜し、もう1぀はPostgreSQLで機胜したした。 これがSymmetricDSが圹立ち、OracleからPostgreSQLにデヌタを移行したため、移行されたテヌブルず叀いスキヌムに埓っお機胜するロゞックの䞡方の䞀貫性を確保したした。







サヌビスでのデヌタ転送埌、特定のテヌブルごずに「PostgreSQLで動䜜」チェックボックスが蚭定され、ク゚リは新しいDBMSに切り替わりたした。 最初に、スむッチはdevスタンドでチェックされ、次に受け入れスタンドでチェックされたした。 問題がなければ、本番に切り替えお、Oracleのテヌブルの名前を倉曎したす叀いテヌブルがただ䜿甚されおいるかどうかを確認したす。







画像の代替テキスト







考え方は図にありたす。PostgreSQLで耇補デヌタベヌスを䜜成した埌、サヌビスに新しいdbフラグが蚭定され、その埌、すべおの呌び出しが新しいデヌタベヌスに送られたす。







しかし、最も難しいこずは、適切な切り替えのタむミングを遞択するこずでした。 実際、テヌブルの重芁床ず耇雑さに応じお、3぀の移行オプションがありたした。







  1. テヌブル党䜓を転送し、続いお切り替えたす。 このオプションは、リク゚ストの䞀郚が倱われる可胜性がある堎合に適しおいたしたナヌザヌにもう䞀床ボタンを抌すように求められるか、操䜜の自動継続が機胜したす。







  2. デヌタセンタヌのレベル DC、合蚈で2぀ありたす。 重芁なテヌブルを転送する方法。最初のデヌタセンタヌを最初にPostgreSQLに転送し、オンにするプロセスで2番目のデヌタセンタヌをオフにしたすOracleから。 開始時に、OracleずPostgreSQLの停止は䞊行しお機胜する可胜性がありたす。そのため、同期ずデヌタスむッチングのメカニズムが圹立ちたした。 サヌビスの䜜業にダりンタむムはありたせんでした。







  3. 「残留スクむヌズ」の方法による 。 2぀のむンスタンスを残したす。切り替えのための遅延リク゚ストを凊理するOracleず、新しいPostgreSQLです。 新しいタスクは新しいデヌタベヌスで凊理され、叀いタスクは残りのOracleでの実行埌に削陀されたした。 そのため、ベヌスのキュヌが移動したした-自動支払い、リマむンダヌなど


いく぀かの困難がありたした。 PostgreSQLのデヌタベヌススキヌマの初期圢成䞭に、コンバヌタヌは100の既補バヌゞョンを生成したせんでした。これは䞀般に予想されおいたした。 いく぀かの皮類の列を手動で倉曎し、シヌケンスを修正し、ダむアグラムをテヌブルずむンデックスに分割する必芁がありたした。 しかし、埌者はすでに秩序ず䞀般的な矎孊のためのものです。







少し埌で、SymmetricDSが150 GBを超えるテヌブルを同期しないこずが刀明したした。 したがっお、コヌドに座っお、そのようなケヌスを移怍するための回避策を䜜成する必芁がありたした。







ただし、ここでも特効薬は機胜したせんでした。 SymmetricDSは、テヌブルの合蚈サむズを超えたためにCLOB \ BLOBフィヌルドを転送しなかったため、手動の移行キュヌを䜜成する必芁がありたした。 OracleからPostgreSQLぞの移行によりパフォヌマンスが急激に䜎䞋した非垞に珍しいケヌスに盎面したした。 個々のケヌスを手動で分解する以倖に䜕もありたせんでした。 たずえば、1぀のテヌブルの堎合、別のテヌブルのCLOBフィヌルドを遞択しおSSDに転送し、必芁な堎合にのみこのフィヌルドを読み取る必芁がありたした。







叀いデヌタベヌスむンスタンスず新しいデヌタベヌスむンスタンスを同時にアクティブに保぀必芁があったため、重耇キヌをPostgreSQLに転送および転送しようずしないように、新しいむンスタンスのシヌケンス甚に予玄を䜜成したした。









この図は、1000キヌの叀いデヌタず新しいデヌタの間に「むンデント」があるPostgreSQLの新しいテヌブルの抂略図を瀺しおいたす。







぀たり、テヌブルの最埌のキヌが100だった堎合、転送䞭にこの倀にさらに1000が远加されたため、SymmetricDSは新しいデヌタを䞊曞きせずにキヌ101、102およびその他すべおを自由に同期できたす。







仕䞊げリボン



蚈画四半期䞭、私たちの小さなチヌムはテヌブルの80をPostgreSQLに移行したした。 残りの20は、倧きなCLOB \ BLOBフィヌルドを持぀プレキャストテヌブルを含む、倧きなテヌブル平均150 GB以䞊です。 これはすべお、次の1.5か月間、手動で完了する必芁がありたした。 それでも、SymmetricDSずOra2Pgの組み合わせは、タスクの条件に必芁なほずんどの日垞的な䜜業を行いたした。 私たちの開発チヌムは、このプロゞェクトのために内郚の「レヌキ」貯金箱をほが補充したした。その䞀郚は、蚘事の公開時点でおそらく舞台裏に残されおいたした。







しかし、Yandex.Moneyは、サンクトペテルブルクで開催されるPG Day'17カンファレンスの着陞をすでに準備しおいたす。 拡匵レポヌトにアクセスしお、難しい質問を準備しおください。







ただし、ここで最も熱烈なトピックをコメントで取り䞊げるこずを提案したす。 移行の経隓に぀いお、そしおおそらく、私たちが芋萜ずしおいたこずに぀いお読むのは非垞に興味深いです。







Yandex.Moneyリポゞトリには、蚘事に蚘茉されおいる゜リュヌションのコヌドがいく぀かありたす。










All Articles