Kuni pole kunagi olnud, ja nĂŒĂŒd on see jĂ€lle kohal!
Ăhes meie projektis otsustasime alustada Liquibase'i kasutamist, et vĂ€ltida tuleviku probleeme. Selgus, et mitte kĂ”ik noored meeskonnaliikmed ei oska seda Ă”igesti kasutada. Korraldasin sise-workshop'i, mille otsustasin hiljem artikliks muuta.
Artikkel sisaldab kasulikke nÀpunÀiteid ja kirjeldust kolmest selgest lÔksust, millesse vÔib sattuda, töötades rikka andmebaasi migratsiooni tööriistadega, eeskÀtt Liquibase'iga. Suunatud Java arendajatele, kes on tasemel Junior ja Middle; kogenumate arendajate jaoks vÔib see olla huvitav struktuuri ja korduse jaoks, mida nad tÔenÀoliselt juba tunnevad.

Liquibase ja Flyway on peamised konkurentsitehnoloogiad rikka struktuuri versioonihalduse probleemide lahendamiseks Java maailmas. Esimene on tÀielikult tasuta ja seda valitakse praktikas sagedamini, seetÔttu on Liquibase valitud selle vÀljaande kangelaseks. Siiski vÔivad mÔned kirjeldatud praktikad olla universaalsed, sÔltuvalt teie rakenduse arhitektuurist.
Rikka struktuuri migratsioonid on sunnitud meetod, mis aitab vĂ”idelda rikka andmehoidjate madala paindlikkuse vastu. OOP stiilis eeldas, et me kirjeldame skeemi ĂŒhe korra ja ei puutu sellesse enam. Kuid reaalsus on alati selline, et kĂ”ik muutub ja lauatabelite struktuuri muutmise vajadus tekib piisavalt sageli. Loomulikult vĂ”ib see protsess olla valus ja ebameeldiv.
Ma ei hakka tehnoloogiat sĂŒvitsi lahkama ega selgitama, kuidas oma projektis raamatukogusid lisada; selle kohta on kirjutatud piisavalt artikleid:
Lisaks on juba olnud suurepÀrane artikkel kasulike nÀpunÀidete teemal:
NÔuanded
Soovin jagada oma nĂ”uandeid ja kommentaare, mis on sĂŒndinud vaeva, vere ja valude kaudu migratsiooniprobleemide lahendamisel.
1. Enne töö alustamist tuleb tutvuda parimate praktika jaotisega Liquibase
Kirjeldatakse lihtsaid, kuid vÀga olulisi asju, ilma milleta vÔib raamatukogu kasutamine muuta teie elu keeruliseks. NÀiteks struktuuri muutuste haldamise struktureerimata lÀhenemine toob varem vÔi hiljem kaasa segaduse ja katkenud migratsioonid. Kui andmebaasi struktuuri ja teenuste loogika omavahel sÔltuvad muudatused ei toimu samal ajal, siis on suur tÔenÀosus, et see toob kaasa punased testid vÔi katkenud keskkonna. Lisaks sisaldavad Liquibase'i ametliku saidi soovitused punkti rollback skriptide arendamise ja testimise kohta koos peamiste migratsiooniskeemidega. Ja artiklis on koodinÀiteid, mis kÀsitlevad migratsioone ja rollback mehhanismi.
2. Kui olete alustanud migratsioonivahendite kasutamist â Ă€rge lubage kĂ€sitsi muudatusi andmebaasi struktuuris.
Nagu öeldakse: "Ăks kord Persil â alati Persil". Kui teie rakenduse andmebaasi hakkab haldama Liquibase, siis toovad kĂ”ik kĂ€sitsi tehtud muudatused kiiresti kaasa mittejĂ€rjepideva seisundi ja muudatusseente usaldusvÀÀrsus langeb nulli. Potentsiaalsed riskid â mitu tundi andmebaasi taastamise peale, halvemal juhul â purustatud server. Kui teie meeskonnas on "vanakooli" DBA arhitekt, siis selgitage talle kannatlikult ja hoolikalt, kui halb kĂ”ik muutub, kui ta lihtsalt muudab andmebaasi oma arusaamise jĂ€rgi nĂ€iteks SQL Developeris.
3. Kui muudatusseen on juba repole edastatud, vÀltige redigeerimist.
Kui teine arendaja tegi pulli ja rakendas muudatusseente, mida hiljem muudetakse, siis ĂŒtleb ta teile kindlasti hĂ€id sĂ”nu, kui saab veateate rakenduse kĂ€ivitamisel. Kui muudatusseene redigeerimine kuidagi lekib arendusse, tuleb minna libedal teel hotfixide suunas. Probleemi sisu pĂ”hineb muudatuste valideerimisel hash-summa jĂ€rgi â Liquibase'i pĂ”himehhanism. Muudatusseene koodi redigeerimisel muutub hash-summa. Muudatusseene redigeerimine on vĂ”imalik ainult siis, kui on vĂ”imalik andmebaasi anda nullist ilma andmeid kaotamata. Sellisel juhul vĂ”ib SQL vĂ”i XML koodi refaktoorimine vastupidi elu lihtsamaks teha ja muudatused arusaadavamaks muuta. NĂ€iteks vĂ”ib olukord olla selline, et rakenduse kĂ€ivitamisel oli algse andmebaasi skeem meeskonnas kooskĂ”lastatud.
4. Omada kontrollitud andmebaasi varukoopiad, kui see on vÔimalik
Siin on kÔik arusaadav. Kui migratsioon peaks mingil pÔhjusel ebaÔnnestuma, saab kÔik tagasi tuua. Liquibase'is on muudatuste tagasivÔtmise tööriist, kuid tagasivÔtmise skripte kirjutab samuti arendaja, ja nendes vÔivad olla samasugused probleemid nagu pÔhichangeseti skriptides. See tÀhendab, et varukoopiaid tehes on alati kasulik ettevaatus.
5. Kasuta kontrollitud andmebaasi varukoopiaid arenduses, kui see on vÔimalik
Kui see ei ole vastuolus lepingute ja privaatsusega, andmebaasis ei ole isikuandmeid ja see ei kaalugi kaks korda rohkem kui kaks pĂ€ikest â enne, kui migratsioonid elusserverites rakendatakse, saab kontrollida, kuidas see töötaks arendaja masinal, ja tuvastada peaaegu 100% potentsiaalsest migratsiooniprobleemide hulgast.
6. Suhtle teiste arendajatega meeskonnas
Korrektselt korraldatud arendusprotsessis teavad kĂ”ik meeskonna liikmed, kellel on millised ĂŒlesanded. TĂ”eliselt ei ole sageli nii, seega kui valmistate oma ĂŒlesande raames andmebaasi struktuuris muudatusi, on soovitatav teavitada sellest kogu meeskonda. Kui keegi teeb muudatusi paralleelselt â peaksite ettevaatlikult organiseerima. Koostöölistega on oluline suhelda ka pĂ€rast töö lĂ”petamist, mitte ainult alguses. Paljusid potentsiaalseid probleeme chensetitega saab lahendada koodide ĂŒlevaatamise etapis.
7. MÔtle, mida teed!
Tundub, et see on ilmne nĂ”uanne, mis kehtib igas olukorras. Siiski oleks paljusid probleeme saanud vĂ€ltida, kui arendaja oleks veel kord analĂŒsinud, mida ta teeb ja mis sellele vĂ”ib mĂ”ju avaldada. Töö migratsioonidega nĂ”uab alati suuremat tĂ€helepanu ja hoolikust.
LÔksud
KĂ€esolevaga uurime tĂŒĂŒpilisi lĂ”kse, millesse vĂ”ib sattuda, kui ei jĂ€rgita ĂŒlaltoodud nĂ”uandeid, ja mis siis tĂ”eliselt teha.
Situatsioon 1. Kaks arendajat ĂŒritavad samaaegselt lisada uusi changesete

Vasya ja Petya soovivad luua changest versiooni 4, teadmata ĂŒksteisest. Nad tegid muudatusi andmebaasi struktuuris ja esitasid pull requesti, erinevate chengeseti failidega. Edasi pakutakse jĂ€rgmisi meetmeid:
Kuidas lahendada
- Kolleegid peavad kuidagi kokku leppima, millises jÀrjekorras nende chengesetid peaksid minema, oletame, et Petja oma peaks olema esimesena.
- Keegi peab teise koodiga liitma ja mÀrkima Vaasi muudatuse versiooni 5. Selle saab teha lÀbi Cherry Pick vÔi hoolika merge'i.
- PĂ€rast muudatusi tuleb kindlasti kontrollida tegemiste kehtivust.
Tegelikult lubavad Liquibase'i mehhanismid, et hoidlas oleks kaks muudatusetappi versiooniga 4, seega vÔib kÔik jÀtta nagu on. See tÀhendab, et teil on lihtsalt kaks muudatust versiooniga 4 erinevate nimedega. Sellise lÀhenemisega muutub hiljem andmebaasi versioonide jÀlgimine vÀga keeruliseks.
Lisaks, Liquibase, nagu hobitite kodu, hoiab endas palju saladusi. Ăks neist on validCheckSum vĂ”ti, mis ilmus versiooniga 1.7 ja vĂ”imaldab mÀÀrata kehtiva rĂ€sisumma vÀÀrtuse teatud muudatusetappi, sĂ”ltumata sellest, mis andmebaasis on. Dokumentatsioon ĂŒtleb jĂ€rgmist:
Lisa rÀsisumma, mida peetakse selle muudatusetapi jaoks kehtivaks, olenemata sellest, mis andmebaasis on. Kasutatakse peamiselt siis, kui peate muudatusetappi muutma ja ei soovi vigu tekitada andmebaasides, kus see on juba kÀivitunud (mitte soovitatav protseduur)
Jah, see protseduur ei ole soovitatav. Kuid mÔnikord valdab tugev hele mustkunstnik ka tumedaid tehnikaid
Situatsioon 2. Migratsioon, mis sÔltub andmetest

Oletame, et teil pole vÔimalik kasutada elavate serverite varukoopiaid. Petja lÔi muudatusetapi, kontrollis seda kohalikult ja tegi tÀie kindlusega oma Ôiguses pull request'i arendusserverisse. Projekti juht selgitas igaks juhuks, kas Petja on seda kontrollinud, ja seejÀrel ta sulandas. Kuid arendamine arendusserveris kukkus kokku.
Tegelikult on see vĂ”imalik ja keegi ei ole sellest kaitstud. See juhtub juhul, kui tabeli struktuuri muudatused on mingil moel seotud konkreetsete andmetega andmebaasist. On ilmne, et kui Petja andmebaas on tĂ€idetud ainult testandmetega, siis ei pruugi see katta kĂ”iki probleemseid olukordi. NĂ€iteks tabeli kustutamisel selgub, et muudes tabelites on andmeid, mis on seotud kustutatavate andmetega Foreign Key kaudu. VĂ”i kui veeru tĂŒĂŒp muutub, selgub, et mitte 100% andmetest ei saa uuele tĂŒĂŒbile ĂŒmber muuta.
Kuidas lahendada
- Kirjutage spetsiaalsed skriptid, mis rakendatakse korra koos migreerimisega ja viivad andmed nĂ”utud vormi. See on ĂŒldine lahendus andmete ĂŒleviimise probleemile uutesse struktuuridesse pĂ€rast migratsioonide rakendamist, kuid midagi sarnast vĂ”ib rakendada ka enne, erijuhtudel. Selline tee ei ole siiski alati kergesti kĂ€ttesaadav, kuna andmete redigeerimine reaalajas serverites vĂ”ib olla ohtlik ja isegi hukatuslik.
- Teine keeruline tee on olemasoleva muudatuskomplekti redigeerimine. Probleem seisneb selles, et kÔik andmebaasid, kuhu see praegusel kujul juba rakendati, tuleb taastada. On tÀiesti vÔimalik, et kogu tagasiside meeskond peab kohapeal andmebaasi nullist uuesti rakendama.
- Ja kĂ”ige universaalsem tee on andmeprobleemi ĂŒleviimine arendaja keskkonda, samas luues sama olukorra ja lisades uue muudatuskomplekti, milles on probleem lahendatud.

Ăldiselt, mida rohkem andmebaasi sisu sarnaneb tootmisserveri andmebaasiga, seda vĂ€iksem on tĂ”enĂ€osus, et migratsioonide probleemid probleemid kaugele levivad. Ja loomulikult, enne muudatuskomplekti saatmist hoidlasse tasub mitu korda mĂ”elda, kas see ei rikuta midagi.
Situatsioon 3. Liquibase hakkab rakenduma juba pÀrast tootmisse minekut.
Oletame, et meeskonna juht palus Petjal liita projekti Liquibase, kuid projekt on juba tootmises ja olemas on juba moodustatud andmebaasi struktuur.
Sellegipoolest seisneb probleem selles, et kÔigil uutel serveritel vÔi arendajate arvutitel peavad andme tabelid olema loodud nullist ning juba olemasolev keskkond peab jÀÀma jÀrjepidevaks, olles valmis vastu vÔtma uusi muudatuskomplekte.
Kuidas lahendada
Siin on samuti mitu teed:
- Esimene ja kÔige ilmsem on kasutada eraldi skripti, mis peab olema kÀsitsi rakendatud uue keskkonna algatamisel.
- Teine â vĂ€hem ilmne, on omada Liquibase migratsiooni, mis asub teises Liquibase kontekstis ja seda rakendada. TĂ€iendavat teavet Liquibase konteksti kohta leiate siit: . Ăldiselt on see huvitav mehhanism, mida saab edukalt kasutada nĂ€iteks testimiseks.
- Kolmas tee koosneb mitmest sammust. Esiteks tuleb luua migratsioon juba olemasolevate tabelite jaoks. SeejĂ€rel peab see olema rakendatud mingis keskkonnas ja nii saadakse selle hash-summa. JĂ€rgmiseks sammuks on meie mitte tĂŒhi server, kus algatada tĂŒhjad Liquibase tabelid ning ajaloo tabelisse rakendatud muudatuste kohta saab kĂ€sitsi lisada kirje 'nagu oleks rakendatud' muudatuse kohta juba olemasolevates andmebaasi muudatustes. Nii hakkab ajalugu eksisteerivas serveris versioonist 2 ning kĂ”ik uued keskkonnad kĂ€ituvad identiteetselt.

Senaarium 4. Migratsioonid muutuvad tohututeks ja ei jÔua lÔpetada.
Teenuse arendamise alguses kasutatakse reeglina Liquibase't vÀlist sÔltuvusena ning kÔik migratsioonid töödeldakse rakenduse kÀivitamisel. Kuid aja jooksul vÔite kokku puutuda jÀrgmiste juhtumitega:
- Migratsioonid muutuvad tohutuks ja vÔtavad kaua aega.
- Tekib vajadus migratsioonide jÀrele jaotatud keskkondades, nÀiteks mitmes andmebaasi serveri instantsis samaaegselt.
Sellisel juhul liiga pika migratsiooni rakendamine toob kaasa rakenduse kĂ€ivitamisel aegumise. Lisaks vĂ”ivad migratsioonide rakendamine iga rakenduse instantsi jaoks eraldi viia olukorrani, kus erinevad serverid on sĂŒnkroonitud olekusse.
Kuidas lahendada
Sellistes juhtumites on teie projekt juba suur, vÔib-olla lausa tÀiskasvanud, ja Liquibase hakkab toimima kui eraldi vÀline tööriist. Asi on selles, et Liquibase kogutakse jar-failiks ja see vÔib töötada kas sÔltuvusena projektis vÔi iseseisvalt.
Iseseisvas reĆŸiimis on vĂ”imalik migratsioonide rakendamine jĂ€tta teie CI/CD keskkonna vĂ”i tugevate sĂŒsteemihaldurite Ă”lgadele. Selleks on vajalik Liquibase kĂ€surea tööriist. . Sellises reĆŸiimis on vĂ”imalik rakendust kĂ€ivitada alles pĂ€rast seda, kui kĂ”ik vajalikud migratsioonid on lĂ€bi viidud.
KokkuvÔte
Tegelikult vĂ”ib andmebaasi migratsioonide kĂ€igus olla palju rohkem lĂ”kse, millest paljusid tuleb lĂ€heneda loominguliselt. On oluline mĂ”ista, et kui tööriista Ă”igesti kasutada, siis saab enamik neist lĂ”ksudest vĂ€ltida. Isiklikult olen ma erinevates vormides kokku puutunud kĂ”igi nimetatud probleemidega, ja mĂ”ned nendest tulid minu enda vigadest. Peamiselt juhtub see tĂ€helepanematuse tĂ”ttu, kuid mĂ”nikord â kuritegeliku oskamise tĂ”ttu tööriista kasutamisel.
Allikas: habr.com


