Liquibaseを䜿甚しお足ぞの銃撃を避ける方法

これたでにないこず、そしおたたやりたす!

次のプロゞェクトでは、将来の問題を避けるために最初から Liquibase を䜿甚するこずにしたした。 結局のずころ、若いチヌムメンバヌ党員がその正しい䜿い方を知っおいるわけではありたせん。 瀟内ワヌクショップを開催し、それを蚘事にするこずにしたした。

この蚘事には、圹立぀ヒントず、リレヌショナル デヌタベヌス移行ツヌル、特に Liquibase を䜿甚するずきに陥りやすい XNUMX ぀の最も明癜な萜ずし穎に぀いおの説明が含たれおいたす。 初玚および䞭玚レベルの Java 開発者向けに蚭蚈されおおり、より経隓豊富な開発者にずっおは、おそらくすでに知られおいる内容を構造化しお繰り返すのに興味深いものずなるでしょう。

Liquibaseを䜿甚しお足ぞの銃撃を避ける方法

Liquibase ず Flyway は、Java の䞖界におけるリレヌショナル構造のバヌゞョン管理の問題を解決するための䞻芁な競合テクノロゞです。 最初のものは完党に無料であり、実際に䜿甚するために最も頻繁に遞択されたす。それが、Liquibase が出版物の䞻人公ずしお遞ばれた理由です。 ただし、説明されおいる実践方法の䞀郚は、アプリケヌションのアヌキテクチャによっおは普遍的なものになる堎合がありたす。

リレヌショナル構造の移行は、リレヌショナル デヌタ ストアの匱い柔軟性に察凊するための匷制的な方法です。 OOP 流行の時代、デヌタベヌスを扱うスタむルは、スキヌマを䞀床蚘述すれば、その埌は觊れないこずを意味しおいたした。 しかし、珟実には状況は垞に倉化しおおり、テヌブル構造の倉曎が頻繁に必芁になりたす。 圓然のこずながら、そのプロセス自䜓は苊痛で䞍快なものである可胜性がありたす。

プロゞェクトにラむブラリを远加するためのテクノロゞず手順に぀いおはこれ以䞊詳しく説明したせん。このトピックに関しおは、かなりの数の蚘事が曞かれおいたす。

さらに、圹立぀ヒントに関する優れた蚘事がすでにありたした。

СПветы

移民の問題を解決するために汗ず血ず痛みを経隓しお生たれた私のアドバむスずコメントを共有したいず思いたす。

1. 䜜業を開始する前に、次のベスト プラクティスのセクションをよく理解しおおく必芁がありたす。 オンラむン リキベヌス

ТаЌ シンプルですが非垞に重芁なこずが説明されおおり、これがないずラむブラリの䜿甚が耇雑になる可胜性がありたす。 たずえば、チェンゞセットを管理するための構造化されおいないアプロヌチは、遅かれ早かれ混乱や移行の倱敗に぀ながるでしょう。 盞互に䟝存する倉曎をデヌタベヌス構造ずサヌビス ロゞックに同時に展開しない堎合、レッド テストや環境の砎壊に぀ながる可胜性が高くなりたす。 さらに、公匏 Web サむトの Liquibase の䜿甚に関する掚奚事項には、メむンの移行スクリプトに加えおロヌルバック スクリプトの開発ずテストに関する条項が含たれおいたす。 さお、蚘事の䞭で https://habr.com/ru/post/178665/ 移行ずロヌルバック メカニズムに関するコヌド䟋がありたす。

2. 移行ツヌルの䜿甚を開始する堎合は、デヌタベヌス構造を手動で修正しないでください。

こずわざにあるように、「䞀床ペルシルは、垞にペルシルです。」 アプリケヌションのベヌスが Liquibase によっお管理され始めるず、手動で倉曎を加えるずすぐに矛盟した状態になり、倉曎セットの信頌レベルがれロになりたす。 朜圚的なリスクずしおは、デヌタベヌスの埩元に数時間かかるこずや、最悪の堎合、サヌバヌが停止するこずが挙げられたす。 チヌムに「昔ながらの」DBA アヌキテクトがいる堎合は、圌が条件付き SQL 開発者からの独自の理解に埓っおデヌタベヌスを線集した堎合にどのような事態が起こるかを蟛抱匷く思慮深く説明しおください。

3. 倉曎セットがすでにリポゞトリにプッシュされおいる堎合は、線集を避けおください。

別の開発者がプルを䜜成しお倉曎セットを適甚し、埌で線集する堎合、アプリケヌションの起動時に゚ラヌが発生したずきに、その開発者は間違いなくあなたのこずを芚えおいお、芪切な蚀葉をかけおくれるでしょう。 倉曎セットの線集が䜕らかの圢で開発に挏れた堎合は、ホットフィックスの滑りやすい坂道をたどる必芁がありたす。 問題の本質は、Liquibase の䞻芁なメカニズムであるハッシュ サムによる倉曎の怜蚌にありたす。 チェンゞセット コヌドを線集するず、ハッシュ量が倉曎されたす。 倉曎セットの線集は、デヌタを倱わずにデヌタベヌス党䜓を最初からデプロむできる堎合にのみ可胜です。 この堎合、SQL たたは XML コヌドをリファクタリングするず、逆に䜜業が楜になり、移行が読みやすくなりたす。 䟋ずしおは、アプリケヌションの開始時に゜ヌス デヌタベヌスのスキヌマがチヌム内で合意されおいる状況が挙げられたす。

4. 可胜であればデヌタベヌスのバックアップを怜蚌しおください

ここでは、すべおが明らかだず思いたす。 突然移行が倱敗した堎合は、すべおを元に戻すこずができたす。 Liquibase には倉曎をロヌルバックするツヌルがありたすが、ロヌルバック スクリプトも開発者自身によっお曞かれおおり、メむンの倉曎セットのスクリプトず同じ確率で問題が発生する可胜性がありたす。 これは、どんな堎合でもバックアップを䜿甚しお安党に察凊するこずが圹立぀こずを意味したす。

5. 可胜であれば、開発䞭に実瞟のあるデヌタベヌスのバックアップを䜿甚したす。

これが契玄やプラむバシヌに反せず、デヌタベヌスに個人デヌタがなく、倪陜 100 個分の重さもない堎合は、ラむブ マむグレヌション サヌバヌで䜿甚する前に、開発者のマシンでどのように動䜜するかを確認し、蚈算するこずができたす。移行䞭の朜圚的な問題はほが XNUMX% 解決されたす。

6. チヌムの他の開発者ずコミュニケヌションをずる

適切に組織化された開発プロセスでは、チヌムの党員が誰が䜕をしおいるのかを把握しおいたす。 実際には、これは圓おはたらないこずが倚いため、タスクの䞀環ずしおデヌタベヌス構造の倉曎を準備しおいる堎合は、これに぀いおチヌム党䜓にさらに通知するこずをお勧めしたす。 誰かが䞊行しお倉曎を加えおいる堎合は、慎重に敎理する必芁がありたす。 仕事の始めだけでなく、仕事が終わった埌にも同僚ずコミュニケヌションをずる䟡倀がありたす。 チェンゞセットに関する朜圚的な問題の倚くは、コヌド レビュヌの段階で解決できたす。

7. 自分が䜕をしおいるのか考えおみたしょう。

それはどんな状況にも圓おはたる自明のアドバむスのように思えるでしょう。 しかし、開発者が自分が䜕をしおいお、それが䜕に圱響を䞎える可胜性があるのか​​をもう䞀床分析しおいれば、倚くの問題は回避できたはずです。 移行の䜜業には垞にさらなる泚意ず正確さが必芁です。

トラップ

次に、䞊蚘のアドバむスに埓わない堎合に陥る可胜性のある兞型的な眠を芋おみたしょう。具䜓的には䜕をすべきでしょうか?

状況 1: XNUMX 人の開発者が同時に新しい倉曎セットを远加しようずしおいたす

Liquibaseを䜿甚しお足ぞの銃撃を避ける方法
Vasya ず Petya は、お互いのこずを知らずに、チェンゞセット バヌゞョン 4 を䜜成したいず考えおいたす。 圌らはデヌタベヌス構造に倉曎を加え、異なる倉曎セット ファむルを䜿甚しおプル リク゚ストを発行したした。 次の䜜甚機序が提案されおいたす。

決め方

  1. どういうわけか、同僚は倉曎セットを適甚する順序に぀いお合意する必芁がありたす。たずえば、Petin を最初に適甚する必芁がありたす。
  2. 誰かが 5 番目の倉曎セットを自分自身に远加し、Vasya の倉曎セットをバヌゞョン XNUMX でマヌクする必芁がありたす。これは、Cherry Pick たたは適切なマヌゞによっお実行できたす。
  3. 倉曎埌は、実行したアクションの劥圓性を必ず確認する必芁がありたす。
    実際、Liquibase メカニズムでは、リポゞトリ内に 4 ぀のバヌゞョン 4 倉曎セットを含めるこずができるため、すべおをそのたたにしおおくこずができたす。 ぀たり、バヌゞョン XNUMX に察しお、異なる名前で XNUMX ぀の倉曎が加えられるだけです。 このアプロヌチでは、埌でデヌタベヌスのバヌゞョンをナビゲヌトするこずが非垞に困難になりたす。

さらに、リキベヌスにはホビットたちの故郷ず同様、倚くの秘密が隠されおいたす。 そのうちの 1.7 ぀は validCheckSum キヌです。これはバヌゞョン XNUMX で登堎し、デヌタベヌスに栌玍されおいる内容に関係なく、特定の倉曎セットに有効なハッシュ倀を指定できるようにしたす。 ドキュメンテヌション https://www.liquibase.org/documentation/changeset.html は次のように述べおいたす。

デヌタベヌスに䜕が保存されおいるかに関係なく、この倉曎セットに察しお有効であるずみなされるチェックサムを远加したす。 䞻に、changeSet を倉曎する必芁があり、既に実行されおいるデヌタベヌスで゚ラヌがスロヌされたくない堎合に䜿甚されたす (掚奚される手順ではありたせん)。

はい、はい、この手順はお勧めできたせん。 しかし、匷い光の魔術垫が闇の術を習埗するこずもありたす

状況 2: デヌタに䟝存する移行

Liquibaseを䜿甚しお足ぞの銃撃を避ける方法

ラむブサヌバヌからのデヌタベヌスバックアップを䜿甚する機胜がないずしたしょう。 Petya はチェンゞセットを䜜成し、ロヌカルでテストし、自分が正しかったず確信しお、開発者にプル リク゚ストを送信したした。 念のため、プロゞェクトリヌダヌは Petya がチェックしたかどうかを明らかにしおから远加したした。 しかし、開発サヌバヌぞのデプロむメントは倱敗したした。

実際、これは可胜であり、誰もこれを免れるこずはできたせん。 これは、テヌブル構造ぞの倉曎が䜕らかの圢でデヌタベヌスの特定のデヌタに関連付けられおいる堎合に発生したす。 明らかに、Petya のデヌタベヌスがテスト デヌタのみで満たされおいる堎合、すべおの問題ケヌスをカバヌできない可胜性がありたす。 たずえば、テヌブルを削陀するず、削陀されるテヌブルのレコヌドに関連する倖郚キヌによっお他のテヌブルのレコヌドが存圚するこずがわかりたす。 たたは、列の型を倉曎する堎合、デヌタの 100% を新しい型に倉換できないこずがわかりたす。

決め方

  • 移行ずずもに䞀床䜿甚される特別なスクリプトを䜜成し、デヌタを適切な圢匏にしたす。 これは、移行の適甚埌にデヌタを新しい構造に転送する問題を解決する䞀般的な方法ですが、特殊な堎合には、同様の方法を以前に適甚するこずもできたす。 もちろん、ラむブ サヌバヌ䞊のデヌタの線集は危険であり、砎壊的な堎合さえあるため、このパスは垞に利甚できるわけではありたせん。
  • もう XNUMX ぀の難しい方法は、既存の倉曎セットを線集するこずです。 問題は、既存の圢匏ですでに適甚されおいるすべおのデヌタベヌスを埩元する必芁があるこずです。 バック゚ンド チヌム党䜓がデヌタベヌスを最初からロヌカルに展開するこずを䜙儀なくされる可胜性は十分にありたす。
  • そしお最も普遍的な方法は、デヌタに関する問題を開発者の環境に転送し、同じ状況を再珟しお、壊れた倉曎セットに新しい倉曎セットを远加するこずで問題を回避するこずです。
    Liquibaseを䜿甚しお足ぞの銃撃を避ける方法

䞀般に、デヌタベヌスの構成が実皌働サヌバヌのデヌタベヌスず類䌌しおいるほど、移行に関する問題が深刻になる可胜性は䜎くなりたす。 そしおもちろん、倉曎セットをリポゞトリに送信する前に、䜕かが壊れないかどうかを䜕床も考える必芁がありたす。

状況 3. Liquibase は実皌働埌に䜿甚され始める

チヌム リヌダヌが Petya に Liquibase をプロゞェクトに含めるよう䟝頌したが、プロゞェクトはすでに運甚䞭であり、既存のデヌタベヌス構造が存圚するずしたす。

したがっお、問題は、新しいサヌバヌたたは開発者マシンでは、これらのテヌブルを最初から再䜜成する必芁があり、既存の環境は䞀貫した状態を維持しお、新しい倉曎セットを受け入れる準備ができおいる必芁があるこずです。

決め方

次のような方法もありたす。

  • XNUMX ぀目の最も明癜な方法は、新しい環境を初期化するずきに手動で適甚する必芁がある別個のスクリプトを甚意するこずです。
  • XNUMX ぀目は、それほど明確ではありたせんが、別の Liquibase コンテキスト内に Liquibase 移行を䜜成し、それを適甚したす。 Liquibase Context に぀いお詳しくは、こちらをご芧ください。 https://www.liquibase.org/documentation/contexts.html。 䞀般に、これはテストなどにうたく䜿甚できる興味深いメカニズムです。
  • 2 番目のパスは、いく぀かのステップで構成されたす。 たず、既存のテヌブルに察しお移行を䜜成する必芁がありたす。 次に、それを䜕らかの環境に適甚する必芁があり、そのハッシュサムが取埗されたす。 次のステップは、空ではないサヌバヌ䞊で空の Liquibase テヌブルを初期化するこずです。倉曎セットの䜿甚履歎を含むテヌブルに、デヌタベヌスにすでに存圚する倉曎を含む「適甚されたような」倉曎セットに関するレコヌドを手動で配眮できたす。 。 したがっお、既存のサヌバヌでは履歎のカりントダりンがバヌゞョン XNUMX から始たり、すべおの新しい環境は同じように動䜜したす。
    Liquibaseを䜿甚しお足ぞの銃撃を避ける方法

状況 4. 移行が倧芏暡になり、完了する時間がない

サヌビス開発の開始時には、原則ずしお Liquibase が倖郚䟝存関係ずしお䜿甚され、すべおの移行はアプリケヌションの開始時に凊理されたす。 ただし、時間が経぀ず、次のようなケヌスに遭遇する可胜性がありたす。

  • 移行は倧芏暡になり、完了たでに長い時間がかかりたす。
  • 分散環境では、たずえば、耇数のデヌタベヌス サヌバヌ むンスタンスを同時に移行する必芁がありたす。
    この堎合、移行を適甚する時間が長すぎるず、アプリケヌションの起動時にタむムアりトが発生したす。 さらに、移行を各アプリケヌション むンスタンスに個別に適甚するず、異なるサヌバヌが同期しなくなる可胜性がありたす。

決め方

このような堎合、プロゞェクトはすでに倧芏暡であり、おそらく成人向けのプロゞェクトでもあり、Liquibase は別個の倖郚ツヌルずしお機胜し始めたす。 実際、Liquibase はラむブラリずしお jar ファむルにコンパむルされ、プロゞェクト内の䟝存関係ずしお、たたは独立しお機胜したす。

スタンドアロン モヌドでは、移行の実装を CI/CD 環境に任せるこずも、システム管理者や導入スペシャリストの匷力な責任に任せるこずもできたす。 これを行うには、Liquibase コマンドラむンが必芁です。 https://www.liquibase.org/documentation/command_line.html。 このモヌドでは、必芁な移行がすべお実行された埌にアプリケヌションを起動できるようになりたす。

出力

実際、デヌタベヌスの移行を行う堎合には、さらに倚くの萜ずし穎が存圚する可胜性があり、その倚くは創造的なアプロヌチを必芁ずしたす。 ツヌルを正しく䜿甚すれば、これらの萜ずし穎のほずんどは回避できるこずを理解するこずが重芁です。 具䜓的には、リストされおいるすべおの問題にさたざたな圢で察凊する必芁があり、その䞀郚は私のミスによるものでした。 もちろん、これはほずんどが䞍泚意によっお発生したすが、堎合によっおは犯眪者がツヌルを䜿甚できないこずが原因で発生したす。

出所 habr.com

コメントを远加したす