
Minu nimi on JĂŒri, olen sĂŒsteemiadministreerimise grupi juht SitiMobilis. TĂ€na jagan oma kogemusi Linuxi failisĂŒsteemide Ă”hukese varustamise (thin provisioning) tehnoloogia kasutamisest ning rÀÀgin, kuidas seda rakendada ettevĂ”tte tehnoloogilistes CI/CD-protsessides. Arutame olukorda, kus automaatse koodi testimise tarbeks vajame tootmisse toimetamisel nii kiiresti kui vĂ”imalik MySQL andmebaasi koopiaid, mis on maksimaalselt lĂ€hedased "tootmis" versioonile ja on lugemis- ja kirjutamisvĂ”imelised.
Sissejuhatus: miks anda halbu nÔuandeid?
MĂ”istlik kĂŒsimus, kuna on olemas vĂ€lja töötatud andmebaaside skeemide migreerimise mehhanismid testimiskeskkondadesse. Miks raisata keskset mitteĆĄarditud andmebaasi sellistele mahtudele? Ja testimiseks ei ole kĂ”ik andmed vajalikud. PĂŒĂŒan selgitada.
Umbes aasta tagasi, meie taksikogujate aktiivse kasvu taustal (2018. aastal kasvasime lÔpetatud sÔitude osas umbes 15 korda), suurenes andmemaht, serverite koormus ja vÀljalaske sagedus. Sattusime jÀrgmistesse olukordadesse:
- Peamine MySQL andmebaas suurenes umbes 1000 tabelini, ĂŒldmahuga 2,5 TB, ja jĂ€tkas kasvamist.
- Ei olnud vÔimalik kiiresti jaguneda ja andmebaasi laiali panna. Seda ei lubanud vana lÀhenemine "kirjutan andmebaasi, mida soovin ja kuidas soovin", hulk JOIN-e ja tabelite sise sÔltuvusi.
- Ei olnud andmebaasi skeemide migratsioonide mehhanismi testkeskkondadesse.
- Ei olnud automaatset koodi testimist, kui see oli tootmisesse vÀljatöötamisel.
Viimast probleemi soovisime lahendada vÔimalikult kiiresti. Olid juba kirjutatud Postmani testid peamise PHP-monoliidi kontrollimiseks, kuid puudus ajakohane andmebaas. Samal ajal ei saanud me öösel koopiat luua, muuta selle peamiseks ja anda öösel katse jaoks: vÀga suur vÀljutuste ja muudatuste hulk, sealhulgas andmetes ja andmebaasi skeemis, muudaks stendi juba pÀeva keskpaiku mittetoimivaks. Ja piirduda vÀljutustega ainult tööpÀeva jooksul oleks olnud ebaefektiivne.
Siiski tĂ€ideti ĂŒlesanne: esimene töökindel stend saime juba kahe nĂ€dala pĂ€rast. Möödunud aasta jooksul on see lĂ€binud palju muudatusi ja jĂ€tkab kasutamist.
Edasi kirjeldan kÔiki samme ja meie lahenduse arendamise etappe. Veendute, et see meetod vÀÀrtustab oma eksisteerimise Ôigust.
Mis on "Ôhuke varundamine"?
See on riist- vĂ”i tarkvaratehnoloogia (teine nimi â Ă”hukesed mahud), mis vĂ”imaldab eraldada rohkem vajalikke ressursse, kui need tegelikult saadaval on. Erakond peab vastama just-enough (nii palju, kui vaja) ja just-in-time (vajaliku aja jooksul) kriteeriumidele. Peamiselt kasutatakse Ă”hukest reserveerimist erinevates andmesalvestussĂŒsteemides, et pakkuda vajalikke kettaruume, mis ĂŒletavad tegelikult saadavail olevaid. Tehnoloogiat toetavad erinevad failisĂŒsteemid, nĂ€iteks LVM2, ZFS, BTRFS. Seda kasutatakse laialdaselt virtualiseerimis hĂŒperviisorites. Meie jaoks vĂ”imaldas Ă”huke reserveerimine kiiresti luua pĂ”hiosast andmetest nii palju koopiaid, kui me vajame (MySQL andmebaasi data-kataloog).
Esimene stend, tehnoloogia Thin LVM
Seda peatĂŒkki vĂ”ib nimetada ka "Kuidas teha maksimaalselt kiireid snapshots suuri andmemahtude jaoks" , vĂ€hendades failisĂŒsteemi ja MySQL andmebaasi stabiilsust vastuvĂ”etamatule tasemele."
Kuna oleme juba kasutanud LVM-i operatsioonisĂŒsteemi pĂ”hiosade loomisel, otsustasime alustada just sellest. Esmalt vajasime eraldi fĂŒĂŒsilist masinat â meie MySQL pĂ”hivara koopia, mille peal saaksime nĂ”udmise korral luua koopia sisendi ja tĂ”sta selle kĂ”rvale eraldi MySQL eksemplariks. Testimise ajaks lubasime sellel eksemplaril teha muutvaid operatsioone, ja testide lĂ”ppedes eemaldasime selle edukalt. Serveri konfiguratsioon oli jĂ€rgmine:
- 2 x Intel Silver 4114 (10Ă2,2 GHz HT)
- 8 x 32 GB DDR4
- 8 x 1920 GB Intel SSD RAID-kontroller Adapteci RAID-10 puhul
RAID-kontrolleri ja tarkvararaidi MD valimise teemal vĂ”iks kirjutada eraldi artikli. Ătlen vaid, et meie valikule mĂ”jutasid kaks tegurit:
- Probleemi pĂŒstitamise ajal paigaldasime kĂ”ik andmebaasihaldurid RAID-kontrolleritele, seega vĂ”ib öelda, et see on ajalooliselt selline olnud.
- Tootlikkuse erinevus sĂŒnteetilistes failisĂŒsteemi testides ja erinevate operatsioonidega MySQL testides oli minimaalne.
Oleme jaganud RAID-10: kokkupanekuks on loodud ĂŒks Volume Group (VG) kogu maht (ligikaudu 6,7 GB halduskuludega) ning loonud olekuosa (Logical Volume, LV) sĂŒsteemile suurusega 50 GB. Tavalistes olukordades mÀÀrame kogu ĂŒlejÀÀnud ruumi MySQL jao jaoks. Kuid meil oli vaja dĂŒnaamilist varundamist, seega loodi kĂ”igepealt nn pool, mille sees loodi jao /var/lib/mysql jaoks suurusega 3,5 TB (eeldatavate andmebaaside mahtude pĂ”hjal):
lvcreate -l 100%FREE -T vga/thin
lvcreate -V 3.5T -T vga/thin -n mysqlFormatime jao ext4 formaatides, monteerime selle, salvestame koopia ja saame algse seista. SeejĂ€rel loome API, mis peaks looma salvestused, tĂ”stma MySQL andmebaasi eksemplari mÀÀratud pordil ja kustutama loodud eksemplari. Kuna kasutatakse ainult sĂŒsteemi kutseid, valisime skriptikeeleks tavapĂ€rase bash'i ning API sidumiseks HTTP â bash kasutame avatud lĂ€htekoodiga lahendust. , kirjutatud Go keeles.
Millalgi avaldame oma bash-skripti avatud lÀhtekoodis, aga praegu kirjeldan lihtsalt pÔhialgoritmi:
PÔhjaliku salvestuse loomine snapmain:
- Peame pÔhikopia peatama.
- Seame blokeering snapshot'i snapmain'i operatsioonidele.
- Loome uue snapshot'i snapmain.
- KĂ€ivitame MySQL ja eemaldame blokeeringu.
Andmebaasi loomine suvalisel pordil snapmain'ist:
- Seame blokeeringu konkreetsele andmebaasi eksemplarile (port).
- Kontrollime, kas peamise snapshot'i loomise blokeering on olemas. Kui see on olemas, siis ootame ja kontrollime uuesti iga 5 sekundi tagant.
- Kontrollime, kas eksemplaril on vana LV-maht.
3.1 Kui on, siis peatame MySQL eksemplari kill -9 abil ja eemaldame LV-mahu. - Loome snapmain'ist uue eksemplari.
- Valmistame ja monteerime direktorid selle eksemplari jaoks.
- Eemaldame slaavi mÀrgid (failid) ja kÀivitame MySQL eksemplari.
- Teeme temast master'i.
- Eemaldame blokeeringu.
Andmebaasi eemaldamine suvalisel pordil:
- Seame blokeeringu konkreetsele andmebaasi eksemplarile (port).
- Tapame MySQL eksemplari kill -9 abil.
- Eemaldame direktorid monteeringust.
- Kustutame LV-mahu ja lÔpetame blokeeringu.
NÀidiskÀsklused uue andmebaasi eksemplari osade kloonimiseks:
lvcreate -n stage_3307 -s vga/snapmain
lvchange -ay -K vga/stage_3307
mount -o noatime,nodiratime,data=writeback /dev/mapper/vga-stage_3307 /mnt/stage_3307NĂŒĂŒd rÀÀgin peamisest probleemist, millega me kokku puutusime Ă”hukese varundamise kasutamisel. Sattusime SSD-diskide jĂ”udluse piirangutesse. See juhtus Thin LVM-i omaduste tĂ”ttu: see opereerib madalama taseme seadme tasemel, kasutades vaikimisi 4 MB suuruseid lĂ”ike. Kuidas see vĂ€lja nĂ€gi:
- Loome snapsi peamisest jaotisest /var/lib/mysql.
- KÀivitame replikatsiooni, et jÔuda meistrini.
- Iga muudatus replikatsioonis tabelites sunnib salvestama vanad, muutmata andme lÔigud snapsi jaotises.
- Iga muudatus tÔstetud testinstantsis sunnib salvestama vanad, muutmata andme lÔigud kloonitud snapsi jaotises selle instantsi jaoks.
- Saame 100% sisend-vÀljund operatsioonide koormuse seadmele, aeglustades igasuguseid toiminguid ja pÔhjustades aeglase replikatsiooni.
- TööpÀeva lÔpuks saame mitme tunni vÔrra maha jÀÀnud keskkonna.
Kuidas me sellega vÔitlesime, et saada arvestatavaid tulemusi (peamised punktid):
RAID-kontroller:
- Kuidas me kĂ”ik vaikelĂŒlituse cache'id vĂ€lja lĂŒlitasime.
- Seadsime writeback'i (kui andmed satuvad vahemÀllu, lÔpetatakse kirjutamine enne, kui tegelik salvestamine kettale toimub).
FailisĂŒsteem:
- MĂ€ntsid jaotuses /var/lib/mysql noatime,nodiratime,data=writeback
- VĂ€lja lĂŒlitatud ext4 logimine kĂ€suga tune2fs.
MySQL:
- Seadsime innodb_flush_method = O_DSYNC (suurendasime kirjutamise kiirus, vÀhendades seega usaldusvÀÀrsust).
- LĂŒlitasime logimise vĂ€lja, logid pole meile vajalikud.
- Seadsime innodb_buffer_pool_size = 4G (mida vÀiksem on InnoDB basaari suurus, seda kiiremini MySQL peatub, ja seda kiiremini saame luua snapshots'i).
See ei ole kaugel tĂ€ielik nimekiri, eriti MySQL'i osas. Siiski, ĂŒlejÀÀnud muudatused on vĂ€iksemad ja sageli mitte alati ja mitte tĂ€pselt rakendatavad. NĂ€iteks, et vĂ€hendada ketaste koormust, viisime isegi innodb_parallel_doublewrite_path /dev/shm, mis mĂ”nes olukorras, kui algatatud eksemplar ei olnud korrektselt lĂ”petatud, sÀÀstis meile kuni 5 sekundit.
Miks me peatame MySQL enne, kui teeme snapshot'i? Me vÔime selle teha töötava replikaga. See on tÔsi, kuid snapshot'i alusel loodud uue andmebaasi eksemplar loetakse vaikimisi rikutuks ja kÀivitamisel nÔuab see tÀielikku skaneerimist. Replikat peatada on kindlasti kiiremini, kuigi see on lÔpuks kogu protsessi jaoks kÔige pikem tegevus.
KokkuvÔttes saavutasime vastuvÔetavamad ajad ja töövalmis keskkonna. Kuigi nagu nÀha peamise replikatsiooni viivituse kÔige rÀÀgib graafik, on olukord veel kaugel ideaalist:

Teistest puudustest tasub mĂ€rkida, et Thin LVM basseini jĂ€lgimine on praktiliselt vĂ”imatu: sĂŒsteemi standardsete funktsioonide iostat kĂ”rval, on nĂ€iteks raske mĂ”ista, milline basseini komponent hetkel kasutab failisĂŒsteemile kĂ”ige rohkem ressursse.
Ăks suur puudus, mis on seotud eespool kirjeldatud optimeerimisega, vÀÀrib eraldi mainimist: me saime YOLO-seisundi. Umbes kord kuus vĂ”i kahe kuu jooksul ei pidanud ext4 selliseid rĂŒnnakuid vastu ja purunes pöördumatult, nĂ”udes ĂŒmbervormingut ja varukoopia taastamist. Kiirusest vĂ”itnud, hĂ€vitasime me lootusetult stabiilsuse.
Milliseid mÔÔdikuid jÀlgida Thin LVM-i kasutamisel:
- Ăhuke mahuti andmete %
- Ăhuke mahuti metaandmete %
Kui meie seisund suudab lÀbi elada andmete lÔpuni jÔudmise (piisab lihtsalt ketaste puhastamisest), siis metaandmete lÔpuni jÔudmine toob kaasa kogu mahuti kokku kukkumise ja selle nullist uuesti loomise vajaduse.
FailisĂŒsteem mahutis fragmenteerub aja jooksul vĂ€ga tugevalt. Soovitan igapĂ€evaselt kĂ€ivitada croniga kĂ€sku fstrim -v /var/lib/mysql.
VahekokkuvÔtted:
- Tehnoloogiat on lihtne rakendada, samuti ka LVM-i, ning see ei nÔua insenerilt erilisi oskusi.
- See sobib hĂ€sti vĂ€ikese ja mitte liiga koormatud andmebaasi jaoks. Mida vĂ€iksem on andmebaas, seda vĂ€hem osakesi liigub failisĂŒsteemis mahuti sees, ja seda madalam on koormus kettale.
- Meie eesmÀrgiks oli leida teisi lahendusi, millest juttu tuleb jÀrgmises jaos.
Teine keskkond, tehnoloogia ZFS
Aegade alguses olen tegelenud failisĂŒsteemiga ZFS, kuid toona toimis ZFS tĂ”eliselt hĂ€sti oma pĂ”his operatsioonisĂŒsteemidel Solaris. Postitamine FreeBSD-le oli piisavalt hea tasemega. Samuti oli olemas pooleliolev Linuxi port, mida kasutas vĂ€he inimesi. Andmestruktuuri tĂ”ttu B-tree (ĂŒhtlasi selline struktuur nagu InnoDB MySQL-l) ei nĂ€idanud ZFS vĂ€ga hĂ€id tulemusi installatsioonides, kus oli vĂ€ga suur hulk faile. KĂ”ik see koos vajadusega Ă”ppida tehnikat enne kasutamist tĂ”rjus selle failisĂŒsteemi pikaajaliselt minu praktikast vĂ€lja. Ilmusid ext4 ja xfs, mis said standardiks. Arvestades, et ZFS sobib meie ĂŒlesande jaoks enam kui hĂ€sti, ja ka Linuxi versioon, lĂ€htudes tagasisidest, on kasvanud tĂ€iesti arvestatavaks tooteks (kuigi mitte tĂ€ieliku toe all, mistĂ”ttu sĂŒsteemi tĂ€ielik paigaldamine ZFS-ile on vĂ”imalik ainult erinevate trikidega), otsustasime selle proovida.
Selge pĂ”hjusel valiti sarnase konfiguratsiooniga stend (vĂ€lja arvatud RAID-kontroller). Paigaldasime kaheksa SSD-d 1920 Gb mahuga. Ei olnud soov kirjutada oma vĂ”rgupilti serveri paigaldamiseks puhtale ZFS-ile, seega vĂ”tsime igast kettast 50 Gb ja tegime neist MD RAID-10 sĂŒsteemi jaoks. ĂlejÀÀnud 1950 Gb igas kettas liideti ZFS analooge RAID-10:
zpool create zpool mirror /dev/sda2 /dev/sdb2 mirror /dev/sdc2 /dev/sdd2 mirror /dev/sde2 /dev/sdf2 mirror /dev/sdg2 /dev/sdh2Loomisel on osad MySQL jaoks:
zfs create zpool/mysql
zfs set compression=gzip zpool/mysql
zfs set recordsize=128k zpool/mysql
zfs set atime=off zpool/mysql
zfs create zpool/mysql/data
zfs set recordsize=16k zpool/mysql/data
zfs set primarycache=metadata zpool/mysql/data
zfs set mountpoint=/var/lib/mysql zpool/mysql/dataPange tĂ€hele, et oleme sisse lĂŒlitanud tavalise gzip andmete kokkusurumise. Meie serveris on palju protsessorivĂ”imsust ja need ei ole tĂ€ielikult kasutatud. Tulemuseks on 3 Tb meie andmebaasist muutusid 1,6 Tb-ks, ja kuna nĂ”rk koht, nagu eelmisel korral, on diskide maksimaalne jĂ”udlus, siis mida vĂ€hem andmeid, seda parem â me saame ZFS-ist algusest peale suurepĂ€rase boonuse! Tipptunnil, tĂ€ielikul koormusel vĂ”ib gzip toimimine nĂ”uda kuni 4 tuuma, aga me ei kahetse.
Edasi lĂ€ks rakendamine kiiremini. MySQL replika sĂ€tete kopeerimiseks viidi need LVM-stendilt. Kulutasime veidi aega skriptide ĂŒmberkirjutamiseks ZFS kĂ€skudeks, kuid ĂŒldiselt jĂ€id algoritmid samaks. NĂ€ide snapshotâi loomise kohta:
zfs set snapdir=visible zpool/mysql/data
zfs create zpool/stage_3307
zfs clone zpool/mysql/data@snapmain zpool/stage_3307/data
zfs set mountpoint=/mnt/stage_3307 zpool/stage_3307/dataTĂ€iendavaks sÀÀtmiseks: viidi ZFS-osad koos metainformatsiooni ja logidega mĂ€llu l2arc ja zil. Meie ĂŒlesande jaoks, nagu hiljem selgus, osutus see ĂŒleliigseks, kuid oleme seni jĂ€tnud selle optimeerimise, vajadusel on lihtne muuta. Negatiivsete mĂ”jude seas â pĂ€rast serveri taaskĂ€imist tuleb vastavad mĂ€lualad uuesti luua. Andmed ei kao. Zpooli staatuse vĂ€ljavĂ”te:
logs
/dev/shm/zil_slog.img ONLINE 0 0 0
cache
/dev/shm/l2arc.img ONLINE 0 0 0Sellise konfiguratsiooniga hakkasime testima stendi ja saime suurepĂ€raseid tulemusi: kahel korraga töötaval andmebaasi eksemplaril (ja aktiivse peamise replikaga) snapshotâidel nĂ€gime ketaste koormust 50-60%.
Me oleme lahti saanud oma peamisest probleemist, mis kajastub replikatsiooni viivituse graafikus (vÔrrelge varasema graafikuga Thin LVM jaotises):

Sellest hoolimata ja tÀnu sellele oleme kÔigis tegevustes mÀrgatavalt kiiruselt paranenud: tÀielik snapshot'i loomine koos replika peatamise ja taaskÀivitamisega vÔtab kuni 40 sekundit, snapshot'ist uue MySQL instantsi juurutamine vÔtab kuni 20 sekundit. See on rohkem kui rahuldav nii meie kui ka meie tarkvaratesti jaoks.
VahekokkuvÔtted:
- Tulemused rahuldasid tÀielikult meie vajadust saada testimiskoodiks tööandmebaasi koopia.
- Tehnoloogia nÔuab sisenemist: tuleb aru saada, mis on ZFS ja kuidas sellega töötada.
- Me ei ole kontrollinud ZFS praegust olekut suurte (ĂŒle 1 miljoni) vĂ€ikese faili korral. Kuid arvame, et probleem pĂŒsib, seetĂ”ttu ei soovitaks ma seda failisĂŒsteemi mingiteks failide salvestamiseks.
Mis edasi?
Stendi kontekstis ei ole me enam midagi muutnud, tulemus on meid rahuldanud. Tulevikus vĂ”ib-olla lisame stendi replikatsiooni seadistusse tabelite erandeid, mis ei ole testimiseks vajalikud, mis veelgi vĂ€hendaks andmebaasi mahtu. Me ei ole testinud BTRFS sĂŒsteemi ning selle rakendust Ă”hukese varundamise tehnoloogias. Siiski, see ĂŒlesanne ei seisa enam, kuna peamine eesmĂ€rk on saavutatud. Ăldiselt on loomulikult soov kaugemale liikuda eelkirjeldatud lĂ€henemisest â ellu viia töötavad andmebaasi migratsioonid testkeskkonda, luua eraldi testimise andmebaasi kontuur, tegeleda pĂ”hivaba jagamisega. Paljusid neist me juba ellu viime, millest rÀÀgime kindlasti tulevastes artiklites.
KokkuvÔte
Algne ĂŒlesanne on lahendatud, kuigi ebatavalisel viisil. VahekokkuvĂ”tetes on kirjeldatud iga rakendatud tehnoloogia eeliseid ja puudusi, seega otsustame, millist tehnikat ja millal on mĂ”istlik kasutada:
- Ăhuke LVM â vĂ€ikeste andmebaaside puhul ja kui ei soovi vĂ”i ei ole aega ZFS-i uurimiseks.
- ZFS â kui on kogemus selle kasutamisest vĂ”i vĂ”imalus kulutada aega selle Ă”ppimisele igas olukorras.
KĂ”rgemal tasandil ei ole see artikkel mitte ainult kahe failisĂŒsteemi tehnoloogia vĂ”rdlus. Peamine idee, mille ma tahan edastada ja kinnistada, on see, et ei ole mĂ”tet karta ebatraditsiooniliselt mĂ”elda Ă€ri kriitilistes olukordades ja vĂ”tta kasutusele ainult valmis retseptid. Kunagi vĂ”isime kogu tehnilise osakonna jĂ”ududega pead raputada ja öelda, et kolme terabaidi andmebaasi koopia loomine vĂ€hem kui minutiga on vĂ”imatu ning me ei vaja riskantseid tehnoloogiaid, teeme nagu peab. See oli vĂ”imalik, kuid oleksime kaotanud umbes kuus kuud kuni aasta ning palju kliendireise (reisid on meie peamine Ă€ritulemus) ilma katseteta ja rakendamise ajal. Erakordset lĂ€henemist kasutades ei kulutanud me rakendamiseks nii palju aega, saime kogemusi uute ja unustatud vanade tehnoloogiate osas ning pakkusime testimist just siis, kui me seda tĂ”eliselt vajasime. Kahtlemata avaldas see meie nĂ€itajatele positiivset mĂ”ju. Valik on alati teie, ja meie jĂ€tkame oma blogis huvitavate praeguste ja tulevaste saavutuste jagamist.
Allikas: habr.com
