Kuidas Liquibase'i abil endale jalga mitte tulistada

Seda pole kunagi juhtunud ja siin see jÀlle on!

JÀrgmise projekti puhul otsustasime algusest peale kasutada Liquibase'i, et tulevikus probleeme vÀltida. Nagu selgus, ei oska kÔik noored meeskonnaliikmed seda Ôigesti kasutada. Tegin sisemise töötoa, mille otsustasin siis artikliks muuta.

See artikkel sisaldab kasulikke nÀpunÀiteid ja kirjeldusi kolmest kÔige ilmsemast lÔksust, millesse vÔite sattuda relatsioonilise andmebaasi migratsioonitööriistadega, eriti Liquibase'iga töötades. MÔeldud juunior- ja kesktaseme Java-arendajatele, kogenumatele arendajatele vÔib see olla huvitav struktureerida ja korrata seda, mis on tÔenÀoliselt juba teada.

Kuidas Liquibase'i abil endale jalga mitte tulistada

Liquibase ja Flyway on peamised konkureerivad tehnoloogiad relatsioonistruktuuride versioonikontrolli probleemide lahendamisel Java maailmas. Esimene on tĂ€iesti tasuta, praktikas valitakse seda sagedamini kasutamiseks, mistĂ”ttu valiti vĂ€ljaande kangelaseks Liquibase. MĂ”ned kirjeldatud tavad vĂ”ivad olenevalt teie rakenduse arhitektuurist siiski olla ĂŒldised.

Relatsiooniline migratsioon on sunnitud viis relatsiooniandmete hoidlate nĂ”rga paindlikkusega toimetulemiseks. OOP-i moeajastul tĂ€hendas andmebaasiga töötamise stiil seda, et me kirjeldame skeemi ĂŒks kord ja ei puuduta seda enam. Kuid reaalsus on alati see, et asjad muutuvad ja tabelite struktuuri muutmist on vaja ĂŒsna sageli. Loomulikult on protsess ise valus ja ebameeldiv.

Ma ei sĂŒvene teie projekti raamatukogu lisamise tehnoloogia kirjeldusse ja juhistesse, sellel teemal on kirjutatud piisavalt artikleid:

Lisaks oli kasulike nÀpunÀidete teemal juba suurepÀrane artikkel:

ĐĄĐŸĐČДты

Tahan jagada oma nĂ”uandeid ja kommentaare, mis on sĂŒndinud lĂ€bi rĂ€ndeprobleemide lahendamise higi, vere ja valu.

1. Enne alustamist lugege lÀbi parimate tavade jaotis veebisait Liquibase

ĐąĐ°ĐŒ kirjeldatakse lihtsaid, kuid vĂ€ga olulisi asju, ilma milleta vĂ”ib raamatukogu kasutamine teie elu keerulisemaks muuta. NĂ€iteks mittestrukturaalne lĂ€henemine muudatuste haldamisele toob varem vĂ”i hiljem kaasa segaduse ja katkised migratsioonid. Kui te ei juuruta samal ajal vastastikku sĂ”ltuvaid muudatusi andmebaasi struktuuris ja teenuste loogikas, siis on suur tĂ”enĂ€osus, et see toob kaasa punased testid vĂ”i katkise keskkonna. Lisaks sisaldavad ametlikul veebisaidil Liquibase'i kasutamise soovitused lĂ”iku tagasipööramisskriptide arendamise ja kontrollimise kohta koos peamiste migratsiooniskriptidega. Noh, artiklis https://habr.com/ru/post/178665/ seal on nĂ€iteid migratsiooni ja tagasipööramise mehhanismiga seotud koodidest.

2. Kui alustasite migratsioonitööriistade kasutamist, Àrge lubage andmebaasi struktuuris kÀsitsi parandusi

Nagu öeldakse: "Kord Persil, alati Persil." Kui teie rakenduse baasi on hakatud haldama Liquibase'i tööriistad, pÔhjustavad kÔik kÀsitsi tehtud muudatused koheselt ebajÀrjekindla oleku ja muudatuste kogumite usalduse tase muutub nulliks. VÔimalikud riskid - andmebaasi taastamisele kulunud mitu tundi, halvimal juhul - surnud server. Kui teie meeskonnal on "vana kooli" DBA arhitekt, selgitage talle kannatlikult ja lÀbimÔeldult, kui halvasti lÀheb, kui ta lihtsalt muudab andmebaasi tingimusliku SQL-arendaja abil omal moel.

3. Kui muudatuste komplekt on juba hoidlasse lĂŒkatud, vĂ€ltige redigeerimist

Kui mĂ”ni teine ​​arendaja tĂ”mbas ja rakendas muudatuste komplekti, mida hiljem redigeeritakse, mĂ€letab ta teid kindlasti hea sĂ”naga, kui saab rakenduse kĂ€ivitumisel veateate. Kui muudatuste komplekti redigeerimine lekib kuidagi arendusse, peate minema kĂ€igultparanduste libedale teele. Probleemi olemus seisneb muudatuste valideerimisel rĂ€sisumma jĂ€rgi - Liquibase'i peamise mehhanismi jĂ€rgi. Muudatuste komplekti koodi redigeerimisel muutub rĂ€sisumma. Muudatuste komplektide redigeerimine on vĂ”imalik ainult siis, kui on vĂ”imalik kogu andmebaasi nullist juurutada ilma andmeid kaotamata. Sel juhul vĂ”ib SQL- vĂ”i XML-koodi ĂŒmbertegemine, vastupidi, elu lihtsamaks muuta, migratsioonid loetavamaks muuta. NĂ€iteks vĂ”ib tuua olukorra, kus rakenduse kĂ€ivitamisel koordineeriti lĂ€hteandmebaasi skeemi meeskonnas.

4. VÔimalusel tehke andmebaasi kontrollitud varukoopiaid

Siin on minu arvates kÔik selge. Kui rÀnne ootamatult ebaÔnnestus, saab kÔik tagasi saata. Liquibase'il on tagasipööramise tööriist, kuid tagasipööramisskriptid kirjutab ka arendaja ise ja nendega vÔib tekkida probleeme sama suure tÔenÀosusega kui pÔhimuutuste komplekti skriptides. See tÀhendab, et varukoopiatega ohutu mÀngimine on igal juhul kasulik.

5. VÔimalusel kasutage arenduses kontrollitud andmebaasi varukoopiaid

Kui see lepingute ja privaatsusega vastuollu ei lĂ€he, pole andmebaasis isikuandmeid ja need ei kaalu nagu kaks pĂ€ikest – enne selle reaalajas migratsiooniserverites rakendamist saab kontrollida, kuidas see arendaja masinas töötab ja vĂ€lja arvutada peaaegu 100% migratsiooni kĂ€igus tekkivad vĂ”imalikud probleemid.

6. Vestelge teiste meeskonna arendajatega

HĂ€sti organiseeritud arendusprotsessis teavad kĂ”ik meeskonnaliikmed, kes mida teeb. Tegelikkuses see sageli nii ei ole, seega kui valmistate oma ĂŒlesande raames ette muudatusi andmebaasi struktuuris, on soovitatav sellest kogu meeskonda tĂ€iendavalt teavitada. Kui keegi teeb paralleelselt muudatusi, peaksite hoolikalt korraldama. Kolleegidega tasub suhelda ka töö lĂ”pus, mitte ainult alguses. Paljusid vĂ”imalikke muudatuskomplektidega seotud probleeme saab lahendada koodi ĂŒlevaatuse etapis.

7. MÔtle, mida teed!

PealtnĂ€ha iseenesestmĂ”istetavad nĂ”uanded, mis kehtivad igas olukorras. Paljusid probleeme oleks saanud aga vĂ€ltida, kui arendaja oleks veel kord analĂŒĂŒsinud, mida ta teeb ja mida see mĂ”jutada vĂ”ib. Migratsioonidega töötamine nĂ”uab alati erilist tĂ€helepanu ja tĂ€psust.

LÔksud

Vaatame nĂŒĂŒd tĂŒĂŒpilisi lĂ”kse, millesse vĂ”ite langeda, kui te ĂŒlaltoodud nĂ”uandeid ei jĂ€rgi, ja mida tuleks tegelikult teha?

Olukord 1. Kaks arendajat ĂŒritavad korraga lisada uusi muudatuste komplekte

Kuidas Liquibase'i abil endale jalga mitte tulistada
Vasya ja Petya soovivad luua versiooni 4 muudatuste komplekti ĂŒksteisest teadmata. Nad tegid andmebaasi struktuuris muudatusi ja kĂ€ivitasid tĂ”mbamispĂ€ringu koos erinevate muudatuste komplekti failidega. Allpool pakutakse vĂ€lja jĂ€rgmine mehhanism:

Kuidas lahendada

  1. Kuidagi peavad kolleegid kokku leppima, millises jÀrjekorras nende muudatused peaksid minema, oletame, et kÔigepealt tuleks rakendada Petin.
  2. Üks inimene peaks valama teise sisse ja mĂ€rkima Vasya muudatuste komplekti versiooniga 5. Seda saab teha Cherry Picki vĂ”i korraliku liitmise kaudu.
  3. PĂ€rast muudatusi kontrollige kindlasti tehtud toimingute kehtivust.
    Tegelikult vÔimaldavad Liquibase'i mehhanismid hoida hoidlas kaks versiooni 4 muudatuste komplekti, nii et saate jÀtta kÔik nii, nagu see on. See tÀhendab, et teil on lihtsalt kaks versiooni 4 erineva nimega versiooni. Sellise lÀhenemise korral muutub andmebaasi versioonides hiljem navigeerimine vÀga keeruliseks.

Lisaks hoiab Liquibase nagu hobitite kodudki palju saladusi. Üks neist on validCheckSum vĂ”ti, mis on ilmunud alates versioonist 1.7 ja vĂ”imaldab mÀÀrata konkreetse muudatuste komplekti kehtiva rĂ€sivÀÀrtuse, olenemata sellest, mis andmebaasis on salvestatud. Dokumentatsioon https://www.liquibase.org/documentation/changeset.html ĂŒtleb jĂ€rgmist:

Lisage kontrollsumma, mida peetakse selle muudatuste komplekti jaoks kehtivaks, olenemata sellest, mis andmebaasis on salvestatud. Kasutatakse peamiselt siis, kui peate muutma ChangeSet'i ja ei soovi, et andmebaasides, kus see on juba kÀivitatud, tekiks vigu (ei ole soovitatav protseduur)

Jah, see pole soovitatav. Kuid mÔnikord valdab tugev valgusvÔlur ka tumedaid tehnikaid.

Juhtum 2: andmepÔhine migratsioon

Kuidas Liquibase'i abil endale jalga mitte tulistada

Oletame, et te ei saa kasutada reaalajas serveritest andmebaasi varukoopiaid. Petya lÔi muudatuste komplekti, testis seda kohapeal ja tÀielikus veendumuses, et tal on Ôigus, esitas arendajale tÔmbetaotluse. Igaks juhuks selgitas projektijuht, kas Petya kontrollis, ja valas siis sisse. Kuid arendusserveri juurutamine on langenud.

Tegelikult on see vĂ”imalik ja keegi pole selle eest kaitstud. See juhtub siis, kui tabelistruktuuri muudatused on kuidagi seotud andmebaasi konkreetsete andmetega. Ilmselgelt, kui Petya andmebaas on tĂ€idetud ainult testandmetega, ei pruugi see hĂ”lmata kĂ”iki probleemseid juhtumeid. NĂ€iteks tabeli kustutamisel selgub, et teistes tabelites on vĂ€lisvĂ”tme jĂ€rgi kirjeid, mis on seotud kustutatava kirjetega. VĂ”i veerutĂŒĂŒpi muutes selgub, et 100% andmetest ei saa uude tĂŒĂŒpi teisendada.

Kuidas lahendada

  • Kirjutage spetsiaalsed skriptid, mida rakendatakse ĂŒks kord koos migreerimisega, ja viige andmed Ă”igesse vormi. See on ĂŒldine viis andmete uutesse struktuuridesse ĂŒlekandmise probleemi lahendamiseks pĂ€rast migratsiooni rakendamist, kuid midagi sarnast saab erijuhtudel rakendada ka varem. See tee pole muidugi alati saadaval, sest andmete redigeerimine reaalajas serverites vĂ”ib olla ohtlik ja isegi surmav.
  • Teine keeruline viis on redigeerida olemasolevat muudatuste komplekti. Raskus seisneb selles, et kĂ”ik andmebaasid, kus seda olemasoleval kujul on juba rakendatud, tuleb taastada. On tĂ€iesti vĂ”imalik, et kogu taustaprogrammi meeskond on sunnitud andmebaasi kohapeal nullist ĂŒles kerima.
  • Ja kĂ”ige universaalsem viis on andmeprobleemi ĂŒlekandmine arendaja keskkonda, sama olukorra uuesti loomine ja uue, katkise muudatuste komplekti lisamine, mis probleemist mööda lĂ€heb.
    Kuidas Liquibase'i abil endale jalga mitte tulistada

Üldiselt, mida rohkem on andmebaas oma koostiselt tootmisserveri andmebaasiga sarnane, seda vĂ€iksem on tĂ”enĂ€osus, et migratsiooniprobleemid jĂ”uavad kaugele. Ja muidugi tuleks enne muudatuste hoidlasse saatmist mitu korda mĂ”elda, kas see midagi rikub.

Olukord 3. Liquibase'i hakatakse kasutama pÀrast selle tootmist

Oletame, et meeskonna juht palus Petyal Liquibase'i projekti kaasata, kuid projekt on juba tootmises ja andmebaasis on juba olemasolev struktuur.

Sellest tulenevalt on probleem selles, et uutes serverites vĂ”i arendajamasinates tuleb tabeliandmed nullist uuesti luua ja juba olemasolev keskkond peab jÀÀma ĂŒhtsesse olekusse, olles valmis vastu vĂ”tma uusi muudatusi.

Kuidas lahendada

Samuti on mitu vÔimalust:

  • Esimene ja kĂ”ige ilmsem on eraldi skripti olemasolu, mida tuleb uue keskkonna lĂ€htestamisel kĂ€sitsi rakendada.
  • Teine, vĂ€hem ilmne, on Liquibase'i migreerimine, mis on teises Liquibase'i kontekstis, ja selle rakendamine. Liquibase Contexti kohta saate rohkem lugeda siit: https://www.liquibase.org/documentation/contexts.html. Üldiselt on see huvitav mehhanism, mida saab edukalt rakendada nĂ€iteks testimiseks.
  • Kolmas tee koosneb mitmest etapist. Esiteks tuleb olemasolevate tabelite jaoks luua migratsioon. SeejĂ€rel tuleb see mĂ”nele keskkonnale rakendada ja nii saadakse selle rĂ€sisumma. JĂ€rgmise sammuna initsialiseerime tĂŒhjad Liquibase'i tabelid meie mittetĂŒhjas serveris ja saate kĂ€sitsi sisestada "nagu rakendatud" muudatuste komplekti kirje koos juba andmebaasis olevate muudatustega tabelisse muudatuste rakendamise ajalooga. Seega algab ajalugu juba olemasolevas serveris versioonist 2 ja kĂ”ik uued keskkonnad kĂ€ituvad identselt.
    Kuidas Liquibase'i abil endale jalga mitte tulistada

4. stsenaarium: migratsioonid muutuvad tohutuks ja ei suuda sammu pidada

Teenuse arendamise alguses kasutatakse reeglina vÀlise sÔltuvusena Liquibase'i ning rakenduse kÀivitumisel töödeldakse kÔiki migratsioone. Kuid aja jooksul vÔite komistada jÀrgmistel juhtudel:

  • RĂ€nded muutuvad tohutuks ja nende lĂ”puleviimine vĂ”tab kaua aega.
  • Hajutatud keskkondades on vaja migreerida, nĂ€iteks mitmel andmebaasiserveri eksemplaril korraga.
    Sel juhul pĂ”hjustab migratsioonide liiga pikaajaline rakendamine rakenduse kĂ€ivitumisel ajalĂ”pu. Samuti vĂ”ib migratsiooni rakendamine rakenduse eksemplaripĂ”hiselt pĂ”hjustada erinevate serverite sĂŒnkroonist vĂ€ljasoleku.

Kuidas lahendada

Sellistel juhtudel on teie projekt juba suur, vÔib-olla isegi tÀiskasvanu, ja Liquibase hakkab toimima eraldi vÀlise tööriistana. Fakt on see, et Liquibase kui teek on kokku pandud jar-failiks ja see vÔib töötada nii projektisisese sÔltuvusena kui ka eraldiseisvana.

VĂ”rguĂŒhenduseta saate jĂ€tta migratsioonirakenduse oma CI/CD keskkonnale vĂ”i oma sĂŒsteemiadministraatorite/juurutajate tugevatele Ă”lgadele. Selleks vajate Liquibase'i kĂ€surida https://www.liquibase.org/documentation/command_line.html. Selles reĆŸiimis on vĂ”imalik rakendus kĂ€ivitada pĂ€rast seda, kui kĂ”ik vajalikud migratsioonid on lĂ”pule viidud.

VĂ€ljund

Tegelikult on andmebaaside migreerimisega töötamisel palju rohkem lĂ”kse ja paljud neist nĂ”uavad loomingulist lĂ€henemist. Oluline on mĂ”ista, et kui kasutate tööriista Ă”igesti, saab enamikku neist pĂŒĂŒnistest vĂ€ltida. TĂ€psemalt pidin seisma silmitsi kĂ”igi eri vormides loetletud probleemidega ja mĂ”ned neist olid minu jambide tagajĂ€rg. PĂ”himĂ”tteliselt juhtub see muidugi tĂ€helepanematuse tĂ”ttu, kuid mĂ”nikord - tööriista kasutamise kuritegeliku suutmatuse tĂ”ttu.

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster