Si nuk të lëndosh veten, duke përdorur Liquibase

Kurrë nuk ka qenë, dhe ja përsëri!

Në një projekt të ri, vendosëm të përdorim Liquibase nga fillimi, për të shmangur probleme të ardhshme. Siç u duk, jo të gjithë anëtarët e rinj të ekipit dinë ta përdorin atë siç duhet. Unë mbajta një punëtori të brendshme, të cilën më pas vendosa ta shndërroj në një artikull.

Artikulli pĂ«rfshin kĂ«shilla tĂ« dobishme dhe pĂ«rshkrimin e tre kurthĂ«ve mĂ« tĂ« dukshme nĂ« tĂ« cilat mund tĂ« bjerĂ« punĂ«s duke punuar me mjetet e migrimit tĂ« strukturave tĂ« bazave tĂ« tĂ« dhĂ«nave relacional, nĂ« veçanti Liquibase. ËshtĂ« e destinuar pĂ«r zhvillues Java tĂ« nivelit Junior dhe Middle, pĂ«r zhvilluesit mĂ« tĂ« pĂ«rvojshĂ«m mund tĂ« jetĂ« interesante pĂ«r strukturoimin dhe pĂ«rkujtimin e asaj qĂ«, shumĂ« tĂ« ngjarĂ«, tashmĂ« Ă«shtĂ« e njohur.

Si nuk të lëndosh veten, duke përdorur Liquibase

Liquibase dhe Flyway janë teknologjitë kryesore konkuruese për zgjidhjen e detyrave të kontrollit të versioneve të strukturave relacionale në botën Java. E para është krejtësisht falas dhe në praktikë shpesh zgjidhet më shumë për t'u përdorur, prandaj Liquibase është zgjedhur si hero i publikimit. Megjithatë, disa nga praktikat e përshkruara mund të jenë universale, në varësi të arkitekturës së aplikacionit tuaj.

Migrimet e strukturave relacionale janë një mënyrë e domosdoshme për të luftuar fleksibilitetin e dobët të depozitave të dhënash relacional. Në epokën e modës për OOP, stili i punës me DB nënkuptonte që ne do ta përshkruanim schemën një herë dhe nuk do ta preknim më. Por realiteti gjithmonë është se gjithçka ndryshon, dhe ndryshimet në strukturën e tabelave kërkohen mjaft shpesh. Natyrisht, procesi vetë mund të jetë i dhimbshëm dhe i pakëndshëm.

Nuk do të thellohem në përshkrimin e teknologjisë dhe udhëzimeve për shtimin e bibliotekës në projektin tuaj, për këtë temë janë shkruar mjaft artikuj:

Për më tepër, tashmë ka pasur një artikull të shkëlqyer mbi këshillat e dobishme:

Këshillat

Dua të ndaj këshillat dhe komentet e mia, të cilat lindi përmes djersës, gjakut dhe dhimbjes së zgjidhjes së problemeve me migrimin.

1. Para punës duhet të njohim seksionin e praktikave më të mira website Liquibase

Aty përshkruhen gjëra të thjeshta, por shumë të rëndësishme, pa të cilat përdorimi i bibliotekës mund t'ju komplikohet jeta. Për shembull, një qasje e pa-strukturuar ndaj menaxhimit të çensiseteve do të sjellë në një moment konfuzion dhe migrime të prishura. Nëse miratoni ndryshime të ndërlidhura në strukturën e DB dhe logjikën e shërbimeve nuk njëkohësisht, ka një probabilitet të madh që kjo të çojë në teste të kuqe ose një ambient të prishur. Për më tepër, rekomandimet për përdorimin e Liquibase në faqen zyrtare përmbajnë një pikë në lidhje me zhvillimin dhe verifikimin e skripteve të rihapjes së bashkë me skriptet kryesore të migrimit. Për më tepër, në artikull https://habr.com/ru/post/178665/ janë shembuj kodi që i referohen migrimeve dhe mekanizmit të rihapjes.

2. Nëse keni filluar të përdorni mjetet e migrimit - mos lejoni korrigjime manuale në strukturën e bazës

Siç thonĂ«: «NjĂ« herĂ« Persil - gjithmonĂ« Persil». NĂ«se baza e aplikacionit tuaj ka filluar tĂ« menaxhohet nga mjetet Liquibase - çdo ndryshim manual çon menjĂ«herĂ« nĂ« njĂ« gjendje tĂ« pa konsoliduar dhe niveli i besimit nĂ« çensiset bĂ«het zero. Rreziqet potenciale - disa orĂ« tĂ« humbura pĂ«r tĂ« rikuperuar bazĂ«n, nĂ« mĂ«nyrĂ«n mĂ« tĂ« keqe - njĂ« server i shkatĂ«rruar. NĂ«se ekipi juaj ka njĂ« DBA Arkitekt “tĂ« vjetĂ«r”, shpjegojini me durim dhe me mendje se si gjithçka do tĂ« shkojĂ« keq, nĂ«se ai thjesht editojĂ« bazĂ«n sipas dĂ«shirĂ«s sĂ« tij nga njĂ« SQL Developer tĂ« supozuar.

3. Nëse çenseti tashmë është dërguar në depot, shmangni editimin

Nëse një zhvillues tjetër ka bërë pull dhe ka aplikuar çensetin, i cili më vonë do të redaktohet, - ai sigurisht do t'ju kujtojë me fjalë të mira, kur të marrë një gabim gjatë fillimit të aplikacionit. Nëse editimi i çensetit ndonjëherë kalon në këndin e zhvillimit - do të duhet të ecni një rrugë të rrezikshme të hotfixeve. Natyra e problemit ndikon në validimin e ndryshimeve sipas vlerës së hash-it - mekanizmi kryesor i Liquibase. Me editimin e kodit të çensetit, vlera e hash-it ndryshon. Editimi i çenseteve është i mundur vetëm kur ka mundësi të ktheni të gjithë bazën nga e para pa humbje të të dhënave. Në këtë rast, ristrukturimi i kodit SQL ose XML mund, përkundrazi, t'i lehtësojë jetën, duke e bërë migrimin më të lexueshëm. Një shembull mund të jetë situata kur në fillim të aplikacionit skema fillestare e DB u miratua brenda ekipit.

4. Keni kopje të verifikuara të bazave të të dhënave, nëse është e mundur

Këtu, mendoj, është e qartë. Në rast se migrimi nuk sukcesion, gjithçka mund të rikthehet. Në Liquibase ka një mjet për të rikthyer ndryshimet, por skriptet për rikthimin i shkruan gjithashtu zhvilluesi dhe ato mund të kenë probleme me të njëjtën probabilitet si skriptet e sets çështjes kryesore. Kjo do të thotë se është e dobishme të kesh kopje rezervë në çdo rast.

5. Përdorni kopje të verifikuara të bazave të të dhënave në zhvillim, nëse është e mundur

Nëse nuk është në kundërshtim me kontratat dhe privatësinë, nëse baza nuk ka të dhëna personale, dhe ajo nuk peshon si dy diell - para aplikimit në serverët e gjallë të migrimit mund të kontrollosh se si do të funksionojë në makinën e zhvilluesit dhe të llogaritësh pothuajse 100% problemet potenciale gjatë migrimit.

6. Komunikoni me zhvilluesit e tjerë në ekip

NĂ« njĂ« proces tĂ« organizuar mirĂ« tĂ« zhvillimit, tĂ« gjithĂ« nĂ« ekip e dinĂ« se kush Ă«shtĂ« i angazhuar me çfarĂ«. NĂ« realitet, shpesh nuk Ă«shtĂ« kĂ«shtu, kĂ«shtu qĂ«, nĂ«se nĂ« kuadĂ«r tĂ« detyrĂ«s tuaj po pĂ«rgatisni ndryshime nĂ« strukturĂ«n e bazĂ«s sĂ« tĂ« dhĂ«nave, Ă«shtĂ« e dĂ«shirueshme tĂ« njoftoni pĂ«r kĂ«tĂ« tĂ« gjithĂ« ekipin. NĂ«se dikush bĂ«n ndryshime paralelisht - duhet tĂ« organizoheni me kujdes. ËshtĂ« mirĂ« tĂ« komunikoni me kolegĂ«t dhe pas pĂ«rfundimit tĂ« punĂ«s, jo vetĂ«m nĂ« fillim. ShumĂ« probleme potenciale me sets çështjesh mund tĂ« zgjidhen nĂ« fazĂ«n e shqyrtimit tĂ« kodit.

7. Mendoni për atë që po bëni!

Duket si një këshillë e vetëkuptueshme, e aplikueshme në çdo situatë. Megjithatë, shumë probleme do të kishin shpëtuar nëse zhvilluesi do të kishte analizuar përsëri atë që po bën dhe se çfarë mund të ndikojë. Puna me migrimet gjithmonë kërkon vëmendje dhe kujdes shtesë.

Rafting

Le të shqyrtojmë tani kurthe tipike, në të cilat mund të bini nëse nuk ndiqni këshillat e mësipërme, dhe çfarë duhet të bëni?

Situata 1. Dy zhvillues po përpiqen të shtojnë sets çështjesh të reja njëkohësisht

Si nuk të lëndosh veten, duke përdorur Liquibase
Vasja dhe Petja duan të krijojnë setin çështjesh të versionit 4, pa e ditur njëri-tjetrin. Ata kanë bërë ndryshime në strukturën e bazës së të dhënave dhe kanë paraqitur një kërkesë për tërheqje, me skedarë të ndryshëm të sets çështjesh. Më pas propozohet mekanizmi i mëposhtëm për veprim:

Si të zgjidhni

  1. Dhe në njëfarë mënyre, kolegët duhet të bien dakord se në cilin rend duhet të shkojnë sets çështjesh të tyre, për shembull, ai i Petës duhet të aplikohet i pari.
  2. Një person duhet të shtihet për të derdhur të dytin te vetja dhe të shënojë changset-in e Vasis me versionin 5. Kjo mund të bëhet përmes Cherry Pick ose një merge të përshtatshëm.
  3. Pas ndryshimeve, është thelbësore të kontrolloni vlefshmërinë e veprimeve të kryera.
    Në të vërtetë, mekanizmat e Liquibase do t'ju lejojnë të keni në repository dy changset-e të versionit 4, kështu që mund ta lini gjithçka siç është. Kështu që ju do të keni dy ndryshime të versionit 4 me emra të ndryshëm. Me këtë qasje, bëhet shumë e vështirë të orientoheni në versionet e databazës në të ardhmen.

Për më tepër, Liquibase, si shtëpia e hobitëve, ruan shumë sekrete. Një prej tyre është çelësi validCheckSum, i cili u shfaq me versionin 1.7 dhe lejon të tregoni një vlerë të vlefshme hash për një changset të caktuar, pavarësisht nga ajo që ruhet në databazë. Dokumentacioni https://www.liquibase.org/documentation/changeset.html thotë të mëposhtme:

Shto një checksum që konsiderohet i vlefshëm për këtë changeSet, pavarësisht se çfarë ruhet në databazë. Përdoret kryesisht kur duhet të ndryshoni një changeSet dhe nuk dëshironi që të hidhen gabime në databaza mbi të cilat ka funksionuar tashmë (nuk është një procedurë e rekomanduar)

Po, një procedurë e tillë nuk rekomandohet. Por ndonjëherë një magjistar i ndritur zotëron edhe teknikat e errëta.

Situata 2. Migrimi që varet nga të dhënat

Si nuk të lëndosh veten, duke përdorur Liquibase

Supozoni se nuk keni mundësi të përdorni kopje rezervë të bazave nga serverët aktivë. Petja krijoi changset-in, e kontrolloi lokalish dhe me një besim të plotë në të drejtën e tij bëri pull request në zhvillim. Lideri i projektit për çdo rast e sqaroi, kontrolloi nëse Petja e kishte verifikuar, dhe më pas e derdhi. Por shpërndarja në serverin e zhvillimit u ndal.

NĂ« fakt, kjo Ă«shtĂ« e mundur, dhe askush nuk Ă«shtĂ« i sigurt nga kjo. Kjo ndodh nĂ« rastin kur modifikimet e strukturĂ«s sĂ« tabelave janĂ« ndonjĂ«herĂ« tĂ« lidhura me tĂ« dhĂ«na tĂ« caktuara nga DB-ja. ËshtĂ« e qartĂ« se, nĂ«se databaza e PetĂ«s Ă«shtĂ« mbushur vetĂ«m me tĂ« dhĂ«na testuese, atĂ«herĂ« ajo nuk mund tĂ« mbulojĂ« tĂ« gjitha rastet problematike. PĂ«r shembull, kur fshihet njĂ« tabelĂ«, del se ka regjistrime nĂ« tabela tĂ« tjera pĂ«rmes Foreign Key, tĂ« lidhura me regjistrimet nĂ« tabelĂ«n e fshirĂ«. Ose, kur ndodhet ndryshimi i tipit tĂ« kolonĂ«s, zbulohet se jo 100% e tĂ« dhĂ«nave mund tĂ« konvertohen nĂ« tipin e ri.

Si të zgjidhni

  • TĂ« shkruani skripte speciale qĂ« do tĂ« aplikohen njĂ« herĂ« sĂ« bashku me migrimin dhe do tĂ« sjellin tĂ« dhĂ«nat nĂ« formĂ«n e duhur. Ky Ă«shtĂ« njĂ« mĂ«nyrĂ« e pĂ«rgjithshme pĂ«r tĂ« zgjidhur problemin e transferimit tĂ« tĂ« dhĂ«nave nĂ« struktura tĂ« reja pas aplikimit tĂ« migrimeve, por diçka e ngjashme mund tĂ« aplikohet edhe pĂ«rpara, nĂ« raste tĂ« veçanta. Kjo mĂ«nyrĂ«, sigurisht, nuk Ă«shtĂ« gjithmonĂ« nĂ« dispozicion, pasi redaktimi i tĂ« dhĂ«nave nĂ« serverĂ«t aktiv mund tĂ« jetĂ« i rrezikshĂ«m dhe madje shkatĂ«rrues.
  • NjĂ« tjetĂ«r mĂ«nyrĂ« e komplikuar Ă«shtĂ« tĂ« redaktoni changset ekzistuese. Kompleksiteti qĂ«ndron nĂ« faktin se tĂ« gjitha DB-tĂ«, ku ai Ă«shtĂ« aplikuar nĂ« formĂ«n e tij ekzistuese, do tĂ« duhet tĂ« rikthehen. Mund tĂ« ndodhĂ« qĂ« e gjithĂ« ekipi i backend-it tĂ« jetĂ« i detyruar tĂ« nisĂ« lokalisht DB-nĂ« nga zero.
  • Dhe rruga mĂ« universale Ă«shtĂ« tĂ« transferoni problemin me tĂ« dhĂ«nat nĂ« ambientin e zhvilluesit duke rigjeneruar tĂ« njĂ«jtĂ«n situatĂ« dhe duke shtuar njĂ« changset tĂ« ri, pĂ«rpara atij tĂ« prishur, i cili do tĂ« lejojĂ« tĂ« anashtrohet problemi.
    Si nuk të lëndosh veten, duke përdorur Liquibase

Në përgjithësi, sa më shumë që baza e të dhënave të ngjajë me bazën e serverit në prodhim, aq më pak shanse ka që problemet me migrimet të ndodhin në thellësi. Dhe, sigurisht, para se të dërgoni changset në repositor, duhet të mendoni disa herë nëse ai do të thyejë diçka.

Situata 3. Liquibase fillon të aplikohet vetëm pas daljes në prodhim.

Supozoni se lideri i ekipit iu kërkoi Petrit të lidhte Liquibase në projekt, megjithatë projekti është tashmë në prodhim dhe ekziston një strukturë e bazës së dhënave që është krijuar më parë.

Për pasojë, problemi konsiston në faktin se në çdo server të ri ose makinat e zhvilluesve, të dhënat e këtyre tabelave duhet të rigjenerohen nga zero, dhe mjedisi ekzistues duhet të mbetet në një gjendje konsistente, duke qenë i gatshëm të pranojë changset e reja.

Si të zgjidhni

Këtu gjithashtu ka disa rrugë:

  • E para dhe mĂ« e dukshme Ă«shtĂ« tĂ« keni njĂ« skript tĂ« veçantĂ«, i cili duhet tĂ« aplikohet manualisht gjatĂ« inicializimit tĂ« njĂ« ambienti tĂ« ri.
  • E dyta — mĂ« pak e dukshme, tĂ« keni njĂ« migrim Liquibase, i cili ndodhet nĂ« njĂ« tjetĂ«r Kontekst Liquibase, dhe ta aplikoni atĂ«. MĂ« shumĂ« rreth Kontekstit tĂ« Liquibase mund tĂ« lexoni kĂ«tu: https://www.liquibase.org/documentation/contexts.html. NĂ« pĂ«rgjithĂ«si, ky Ă«shtĂ« njĂ« mekanizĂ«m interesante, i cili mund tĂ« aplikohet me sukses, pĂ«r shembull, pĂ«r testim.
  • Rruga e tretĂ« pĂ«rbĂ«het nga disa hapa. Fillimisht, duhet tĂ« krijohet njĂ« migrim pĂ«r tabelat ekzistuese. MĂ« pas, ajo duhet tĂ« aplikohet nĂ« njĂ« ambient dhe kĂ«shtu do tĂ« merret hash-suma e saj. Hapi i ardhshĂ«m Ă«shtĂ« tĂ« inicializoni nĂ« serverin tonĂ« jo tĂ« zbrazĂ«t tabelat e zbrazĂ«ta tĂ« Liquibase, dhe nĂ« tabelĂ«n me historinĂ« e zbatimit tĂ« setĂ«ve tĂ« ndryshimeve, mund tĂ« vendosni manualisht njĂ« regjistĂ«r pĂ«r njĂ« set ndryshimesh "siç do tĂ« ishte aplikuar" me ndryshimet qĂ« tashmĂ« ekzistojnĂ« nĂ« bazĂ«. KĂ«shtu, nĂ« serverin ekzistues, historia do tĂ« fillojĂ« nga versioni 2, dhe tĂ« gjithĂ« ambientet e reja do tĂ« veprojnĂ« njĂ«soj.
    Si nuk të lëndosh veten, duke përdorur Liquibase

Situata 4. Migrimet bëhen të mëdha dhe nuk përfundojnë në kohë.

Në fillim të zhvillimit të shërbimit, zakonisht, Liquibase përdoret si një varësi ekstern, dhe të gjitha migrimet trajtohen gjatë startimit të aplikacionit. Megjithatë, me kalimin e kohës mund të përballeni me rastet e çiftëzuara:

  • Migrimet bĂ«hen tĂ« mĂ«dha dhe zgjatin pĂ«r njĂ« kohĂ« tĂ« gjatĂ«.
  • Ndjehet nevoja pĂ«r migrim nĂ« ambiente tĂ« shpĂ«rndara, le tĂ« themi, nĂ« disa instancat e serverĂ«ve tĂ« DB njĂ«kohĂ«sisht.
    Në një rast të tillë, zbatimi i gjatë i migrimeve do të çojë në skadimin e kohës gjatë startimit të aplikacionit. Për më tepër, zbatimi i migrimeve për çdo instancë të aplikacionit veçmas mund të çojë në situata ku serverët e ndryshëm janë në një gjendje jo sinkron.

Si të zgjidhni

Në raste të tilla, projekti juaj është tashmë i madh, ndoshta madje i rritur, dhe Liquibase fillon të veprojë si një mjet i veçantë dhe i jashtëm. E vërteta është se Liquibase si bibliotekë paketizohet në një skedar jar, dhe mund të funksionojë si një varësi brenda projektit, si edhe në mënyrë autonome.

Në një modalitet autonom, mund të ngarkohet zbatimi i migrimeve në ambientin tuaj CI/CD ose në supet e forta të administratorëve të sistemeve tuaj specialistë për shpërndarjen. Për këtë do të nevojitet komanda e linjës së komandave të Liquibase. https://www.liquibase.org/documentation/command_line.html. Në një modalitet të tillë, krijohet mundësia për të nisur aplikacionin vetëm pasi të jenë kryer të gjitha migrimet e nevojshme.

Përfundimi

NĂ« tĂ« vĂ«rtetĂ«, ka shumĂ« mĂ« tepĂ«r kapĂ«se kur punoni me migrrimet e DB, dhe shumĂ« prej tyre kĂ«rkojnĂ« njĂ« qasje kreative. ËshtĂ« e rĂ«ndĂ«sishme tĂ« kuptoni se nĂ«se pĂ«rdorni instrumentin siç duhet, shumica e kĂ«tyre kapĂ«seve do tĂ« mund t'i shmangni. Konkretisht, unĂ« kam hasur nĂ« tĂ« gjitha kĂ«to probleme nĂ« forma tĂ« ndryshme, dhe disa prej tyre kanĂ« qenĂ« rezultat i gabimeve tĂ« mia. Kryesisht ndodhin pĂ«r shkak tĂ« mungesĂ«s sĂ« vĂ«mendjes, por ndonjĂ«herĂ« pĂ«r shkak tĂ« paaftĂ«sisĂ« kriminale pĂ«r tĂ« pĂ«rdorur instrumentin.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster