Kuidas mitte endale jalga tulistada, kasutades Liquibase

Kunagi ei ole olnud, ja nĂŒĂŒd jĂ€lle!

Uuel projektil otsustasime alustada Liquibase'i kasutamist, et tulevikus probleeme vĂ€ltida. Selgus, et mitte kĂ”ik noored meeskonnaliikmed ei oska seda Ă”igesti kasutada. Ma korraldasin sisemise töötuba, mille otsustasin hiljem artikliks ĂŒmber kirjutada.

Artikkel sisaldab kasulikke nÀpunÀiteid ja kirjeldust kolmest kÔige silmatorkavamast lÔksust, millesse vÔib sattuda, töötades relatsiooniliste andmebaaside migreerimise tööriistadega, sealhulgas Liquibase'iga. Suunatud Java arendajatele tasemel Junior ja Middle, vÔivad kogenumad arendajad leida seda huvitavaks struktuuri ja korduse mÔttes, mis on tÔenÀoliselt juba tuttav.

Kuidas mitte endale jalga tulistada, kasutades Liquibase

Liquibase ja Flyway on peamised konkureerivad tehnoloogiad relatsiooniliste struktuuride versioonihalduse probleemide lahendamiseks Java maailmas. Esimene on tÀiesti tasuta ja seda valitakse praktikas sagedamini, seetÔttu on Liquibase valitud selle vÀljaande peategelaseks. Siiski vÔivad mÔned kirjeldatud praktikad olla universaalsed, sÔltuvalt teie rakenduse arhitektuurist.

Relaatsioonistruktuuride migreerimine on sunnitud meetod, et vĂ”idelda relatsiooniliste andmehoidlate madala paindlikkuse vastu. OOP ajastul eeldas andmebaaside kasutamine, et me kirjeldame skeemi ĂŒks kord ja ei puutu sellesse enam. Kuid reaalsus on alati selline, et kĂ”ik muutub, ning tabelite struktuuris on muutused piisavalt tihti vajalikud. Loomulikult on see protsess sageli valulik ja ebameeldiv.

Ei hakka sĂŒvenema tehnoloogia ja juhiste kirjeldamisse, kuidas biblioteeki oma projektis kasutada; selle teema kohta on juba piisavalt artikleid kirjutatud:

Lisaks on juba olnud suurepÀrane artikkel kasulike nÔuannete teemal:

NÔuanded

Soovin jagada oma nĂ”uandeid ja kommentaare, mis on sĂŒndinud probleemide lahendamise kaudu, mis on seotud migreerimisega, verd, higi ja valu.

1. Enne töö alustamist tutvuge parimate praktikate jaotisega aadressil veebilehel Liquibase

Seal on kirjeldatud lihtsaid, kuid vĂ€ga olulisi asju, ilma milleta raamatukogu kasutamine vĂ”ib teile elu keerulisemaks muuta. NĂ€iteks struktuuri mittesĂŒsteemne lĂ€henemine muudetud kogumite haldamisele toob varem vĂ”i hiljem segadust ja katkenud migratsioone. Kui sĂ”ltuvad andmebaasi struktuuri ja teenuste loogika muutused ei toimu samaaegselt, on suur tĂ”enĂ€osus, et see toob kaasa punased testid vĂ”i rikutud keskkonna. Lisaks sisaldavad Liquibase'i kasutamise soovitused ametlikul saidil punkti rollback skriptide vĂ€ljatöötamise ja kontrollimise kohta koos pĂ”hiskriptidega migratsiooniks. Ja artiklis https://habr.com/ru/post/178665/ on nĂ€ited koodist, mis puudutavad migratsioone ja rollback mehhanismi.

2. Kui olete hakanud kasutama migratsiooni tööriistu, vÀltige kÀsitsi parandusi andmebaasi struktuuris.

Nagu öeldakse: "Üks kord Persil — alati Persil". Kui teie rakenduse andmebaasi hakkab haldama Liquibase, siis igasugune kĂ€sitsi muudatus toob koheselt kaasa jĂ€rjepidevuse rikkumise ning muudatuste usaldusvÀÀrsus langeb nulli. Potentsiaalne oht on mitu tundi, mis kulub andmebaasi taastamiseks, halvemal juhul — serveri rike. Kui teie meeskonnas on „vana kooli“ DBA arhitekt, siis selgitage talumatult ja pĂ”hjalikult, kui halvasti lĂ€heb, kui ta lihtsalt toimetab andmebaasi oma Ă€ranĂ€gemise jĂ€rgi, kasutades navigeeritavat SQL arendajat.

3. Kui muudatuskomplekt on juba hoidlasse pushitud, vÀltige redigeerimist

Kui mĂ”ni teine arendaja teeb pull'i ja rakendab muutuste komplekti, mida hiljem muudetakse, siis kindlasti meenutab ta sind head sĂ”naga, kui ta saab rakenduse kĂ€ivitamisel vea. Kui muutuste komplekti muutmine jĂ”uab kuidagi arendusse, tuleb minna libedale teele kiirparanduste tegemiseks. Probleemi olemus seisneb muudatuste valideerimise kontrollimises rakendades hash-summat — see on Liquibase'i peamine mehhanism. Muutuste komplekti koodi muutmisel muutub hash-summa. Muutuste komplekti redigeerimine on vĂ”imalik ainult siis, kui on olemas vĂ”imalus ilma andmete kaota, kĂ€ivitada kogu andmebaas nullist. Sellisel juhul vĂ”ib SQL-i vĂ”i XML-i koodi refaktoreerimine vastupidi elu lihtsamaks teha, muutes migreerimised loetavamaks. NĂ€iteks vĂ”ib vĂ€lja tuua olukorra, kus rakenduse kĂ€ivitamisel oli algse andmebaasi skeem meeskonnas kooskĂ”lastatud.

4. Hoia kontrollitud andmebaasi varukoopiaid, kui see on vÔimalik

Siin on kÔik selge. Kui migratsioon peaks ebaÔnnestuma, saab kÔik alati tagasi pöörata. Liquibase'il on muudatuste tagasisööte tööriist, kuid tagasipöördumisskriptid kirjutab samuti arendaja ning nendes vÔivad esineda probleemid sama tÔenÀosusega kui pÔhichanget set'i skriptides. See tÀhendab, et varukoopiate tegemine on kasulik igal juhul.

5. Kasuta arenduses usaldusvÀÀrseid andmebaasi varukoopiaid, kui see on vÔimalik.

Kui see ei ole lepingutega ja privaatsusega vastuolus, andmebaasis ei ole isikuandmeid ning see ei kaalu nagu kaks pĂ€ikest — enne eluserveritel migratsiooni rakendamist saab kontrollida, kuidas see arendaja masinas töötab, ja tuvastada peaaegu 100% potentsiaalsed probleemid migratsiooni ajal.

6. Suhtle meeskonna teiste arendajatega.

Korrektselt korraldatud arendusprotsessis teavad kĂ”ik meeskonnas, kes millega tegeleb. Kuid reaalsuses pole see sageli nii, seetĂ”ttu, kui oma ĂŒlesande raames valmistad ette muudatusi andmebaasi struktuuris, on soovitatav teavitada sellest kogu meeskonda. Kui keegi teeb muudatusi samal ajal — tuleks ettevaatlikult korraldada. Kolleegidega tasub suhelda ka pĂ€rast töö valmimist, mitte ainult alguses. Paljusid potentsiaalseid probleeme chengset'idega saab lahendada code review etapis.

7. MÔtle, mida teed!

Tundub iseenesestmĂ”istetav soovitus, mis kehtib igas olukorras. Siiski oleks paljusid probleeme saanud vĂ€ltida, kui arendaja oleks veel kord analĂŒĂŒsinud, mida ta teeb ja millist mĂ”ju see vĂ”ib avaldada. Migratsioonide töötlemine nĂ”uab alati tĂ€iendavat tĂ€helepanu ja hoolikust.

KĂŒĂŒnesed

Vaatame nĂŒĂŒd tĂŒĂŒpilisi kĂŒĂŒsi, kuhu vĂ”ite sattuda, kui ei jĂ€rgita ĂŒlaltoodud soovitusi, ja mida tegelikult teha?

Situatsioon 1. Kaks arendajat pĂŒĂŒavad samal ajal uusi chengset'e lisada

Kuidas mitte endale jalga tulistada, kasutades Liquibase
Vassil ja Petja soovivad luua versiooni 4 muudatusetappide komplekti, teadmata ĂŒksteisest. Nad on teinud muudatusi andmebaasi struktuuris ja esitanud pull requesti erinevate muudatusfailidega. JĂ€rgmine tegevusmehhanism on nagu jĂ€rgmine:

Kuidas lahendada

  1. Kolleegid peavad kuidagi kokku leppima, millises jĂ€rjekorras nende muudatusetapid peaksid kĂ€ima, hĂŒpoteetiliselt peaks Petja muudatus olema esimesena kasutusele vĂ”etud.
  2. Keegi peab oma muudatustele lisama teise ja tĂ€histama Vassili muudatust versiooniga 5. Seda saab teha kas Cherry Picki vĂ”i ettevaatliku ĂŒhendamise kaudu.
  3. PĂ€rast muudatusi tuleb kindlasti kontrollida tehtud tegevuste kehtivust.
    Tegelikult vÔimaldavad Liquibase mehhanismid hoida hoidlas kahte versiooni 4 muudatusetappide komplekti, seega vÔib kÔik jÀtta nii, nagu on. TeisisÔnu, teil on lihtsalt kaks versiooni 4 muudatust erinevate nimedega. Sellise lÀhenemisega muutub hiljem andmebaasi versioonides navigeerimine vÀga keeruliseks.

Lisaks sellele sisaldab Liquibase, nagu hobbitite kodu, palju saladusi. Üks neist on vĂ”tme validCheckSum, mis ilmus versiooniga 1.7 ja vĂ”imaldab mÀÀrata kehtiva hash-summa vÀÀrtuse konkreetse muudatuskomplekti jaoks sĂ”ltumata sellest, mis andmebaasis talletatakse. Dokumentatsioon https://www.liquibase.org/documentation/changeset.html ĂŒtleb jĂ€rgmist:

Lisa kontrollsumma, mida peetakse selle muudatuskomplekti jaoks kehtivaks, sÔltumata sellest, mis andmebaasis on talletatud. Peamiselt kasutatakse olukordades, kus pead muutma muudatuskomplekti ja ei soovi, et andmebaasides, kus see on juba kÀinud, tekiks vigu (see pole soovitatav protseduur).

Jah, selline protseduur ei ole soovitatav. Kuid mÔnikord valdab tugev heledaid nÔidu ka tumedaid tehnikaid.

Situation 2. Migration that depends on data.

Kuidas mitte endale jalga tulistada, kasutades Liquibase

Oletame, et sul pole vĂ”imalik kasutada varukoopiaid elavatelt serveritelt. Peeter lĂ”i muudatuskomplekti, kontrollis seda kohaliku arenduse kĂ€igus ja tegi tĂ€ieliku usaldusega pull-requesti dev-keskkonda. Projekti juht kĂŒsis igaks juhuks, kas Peeter on selle ĂŒle kontrollinud, ja seejĂ€rel liitis. Kuid juurutamine dev-serveris kukkus lĂ€bi.

Tegelikult on see vĂ”imalik ja sellest keegi ei pÀÀse. See juhtub siis, kui tabelite struktuuri muutmine on mingil moel seotud andmetega andmebaasis. On ilmne, et kui Petja andmebaas on tĂ€idetud ainult testandmetega, siis vĂ”ib see mitte katta kĂ”iki probleemseid juhtumeid. NĂ€iteks, kui tabel kustutatakse, vĂ”ib selguda, et teistes tabelites on Foreign Key seosed, mis on seotud kustutatavate kirjetega. VĂ”i kui veeru tĂŒĂŒp muutub, vĂ”ib avastada, et kĂ”ik andmed ei pruugi uude tĂŒĂŒpi konverteeritavad olla.

Kuidas lahendada

  • Kirjutada spetsiaalsed skriptid, mis rakenduvad ĂŒhekordselt koos migreerimisega ja viivad andmed nĂ”utud vormi. See on ĂŒldine tee andmete edastamise probleemide lahendamiseks uutesse struktuuridesse juba pĂ€rast migreerimiste rakendamist, kuid midagi sellist vĂ”ib rakendada ka enne, erandlike juhtumite korral. Selline tee ei pruugi siiski alati kergesti kĂ€tte saada, kuna andmete redigeerimine elus serverites vĂ”ib olla ohtlik ja isegi hukatuslik.
  • Teine keeruline tee on redigeerida olemasolevat muudatuskomplekti. Probleem on selles, et kĂ”ik andmebaasid, kus see olemasolevas vormis juba rakendatud on, tuleb taastada. On tĂ€iesti vĂ”imalik, et kogu backend-meeskond peab kohalikult andmebaasi nullist ĂŒles seadma.
  • Ja kĂ”ige universaalsem tee on andmeprobleemi ĂŒmber tĂ”stmine arendaja keskkonda, luues sama olukorra ja lisades uue muudatuskomplekti, kuni katkise, mis vĂ”imaldab probleemi vĂ€ltida.
    Kuidas mitte endale jalga tulistada, kasutades Liquibase

Üldiselt, mida rohkem andmete koosseis on sarnane tootmisserveri andmebaasile, seda vĂ€iksem on tĂ”enĂ€osus, et migratsiooniprobleemid ulatuvad kaugele. Ja loomulikult, enne kui saadate muudatuskomplekti ladustamisele, tasub paar korda mĂ”elda, kas see ei riku midagi.

Situatsioon 3. Liquibase hakkab rakenduma juba pÀrast tootmisse minekut

Oletame, et meeskonnajuhataja palus Petjal projektis Liquibase kÀivitada, kuid projekt on juba tootmises ja olemasolev andmebaasi struktuur on juba olemas.

Seega on probleem selles, et igasugustes uutes serverites vÔi arendajate masinates tuleb nende tabelite andmed luua algusest peale, samas kui juba olemasolev keskkond peab jÀÀma konsistentseks ja valmis uute muudatuste vastuvÔtmiseks.

Kuidas lahendada

Siin on mitmeid lÀhenemisviise:

  • Esimene ja kĂ”ige ilmsem lahendus on omada eraldi skripti, mida tuleb kĂ€sitsi rakendada uue keskkonna kĂ€ivitamisel.
  • Teine, vĂ€hem ilmne lahendus, on kasutada Liquibase'i migratsiooni, mis asub teises Liquibase'i kontekstis, ja rakendada seda. Rohkem teavet Liquibase'i konteksti kohta saab lugeda siit: https://www.liquibase.org/documentation/contexts.html. Üldiselt on see huvitav mehhanism, mida saab edukalt kasutada nĂ€iteks testimiseks.
  • Kolmas tee koosneb mitmest sammust. Esiteks peab olema loodud migreerimine juba olemasolevatele tabelitele. SeejĂ€rel tuleb see rakendada mingisuguses keskkonnas ja sel moel saadakse selle hash-summa. JĂ€rgmine samm on alustada meie mitte-tĂŒhjal serveril tĂŒhjade Liquibase tabelite loomist, ja ajalooliste muudatuste tabelisse saab kĂ€sitsi lisada kirje "nagu oleks rakendatud" muudatusest koos juba andmebaasis olemasolevate muudatustega. Nii hakkab ajaloo arvestus olemasoleval serveril minema versioonist 2, samas kui kĂ”ik uued keskkonnad toimivad samamoodi.
    Kuidas mitte endale jalga tulistada, kasutades Liquibase

Situatsioon 4. Migratsioonid muutuvad tohutuks ja ei jÔua lÀbi viia

Teenuse arendamise alguses kasutatakse tavaliselt Liquibase't vÀlise sÔltuvusena, ja kÔik migratsioonid töödeldakse rakenduse kÀivitamisel. Kuid aja jooksul vÔite kohtuda jÀrgmiste juhtumitega:

  • Migratsioonid muutuvad tohutuks ja kestavad pikka aega.
  • Tekkib vajadus migratsiooniks jaotatud keskkondades, nĂ€iteks samal ajal mitmes andmebaasi serveri instantsis.
    Sel juhul vĂ”ib migratsioonide liiga pikaajaline rakendamine viia rakenduse kĂ€ivitamisel ajutiseks katkestamiseks. Lisaks vĂ”ib migratsioonide rakendamine iga rakenduse instantsi eraldi pĂ”hjustada erinevate serverite sĂŒnkroonimata olekuid.

Kuidas lahendada

Sellistes olukordades on teie projekt juba suur, vÔib-olla isegi tÀiskasvanu eas, ja Liquibase hakkab toimima kui eraldi vÀline tööriist. Asi on selles, et Liquibase koguneb mooduliks jar failiks ning vÔib töötada nii sÔltuvusena projekti sees kui ka iseseisvalt.

Iseseisvas reĆŸiimis saab migratsioonide rakendamise ĂŒlesande usaldada teie CI/CD keskkonnale vĂ”i teie sĂŒsteemiadministraatorite kindlatele Ă”lgadele. Selleks on vajalik Liquibase kĂ€surea kasutamine https://www.liquibase.org/documentation/command_line.html. Sellises reĆŸiimis on vĂ”imalus kĂ€ivitada rakendus juba pĂ€rast kĂ”igi vajalike migratsioonide sooritamist.

KokkuvÔte

Tegelikult vÔib andmebaasi migratsioonide kÀigus olla palju rohkem lÔkse ja paljusid neist tuleb loominguliselt kÀsitleda. Oluline on mÔista, et Ôige tööriista kasutamise korral on enamik neist lÔksudest vÀltimatud. Ma olen isiklikult kohtunud kÔikide loetletud probleemidega, mÔned neist olid ka minu enda eksimuste tagajÀrg. Peamiselt tekib see loomulikult hooletuse tÔttu, kuid mÔnel juhul ka tööriista kuritarvitamise tÔttu.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster