Õhuke Linuxi failisĂŒsteemide varundamine. Kuidas luua kolme terabaidi suuruste MySQL andmebaaside töökoopiaid 20 sekundi jooksul

Õhuke Linuxi failisĂŒsteemide varundamine. Kuidas luua kolme terabaidi suuruste MySQL andmebaaside töökoopiaid 20 sekundi jooksul

Minu nimi on Yuriy, ma olen sĂŒsteemiadministratsiooni meeskonna juht ettevĂ”ttes Sitimobil. TĂ€na jagan oma kogemusi Linuxi failisĂŒsteemide Ă”hukese varundamise (thin provisioning) tehnoloogia kasutamisest ning rÀÀgin, kuidas seda saab rakendada ettevĂ”tte CI/CD-protsessides. Vaatleme olukorda, kus meil on vaja koodide automaatseks testimiseks, kui sisu jĂ”uab tootmisse, vĂ”imalikult kiiresti MySQL andmebaasi koopiaid, mis oleksid vĂ”imalikult lĂ€hedased „tootmisversioonile”, saadaval lugemiseks ja kirjutamiseks.

Sissejuhatus: miks anda vale nÔu?

Loogiline kĂŒsimus, kuna olemas on tĂ”estatud andmebaasi skeemide migratsioonimehhanismid testkeskkondadesse. Miks viia peamine mitte-sharditud andmebaas selliste mahudeni? Ja testimiseks ei ole kĂ”ik andmed vajalikud. PĂŒĂŒan seletada.

Umbes aasta tagasi, meie taksikogujaga (2018. aastal kasvasime lÔpetatud sÔitude osas umbes 15 korda) aktiivse kasvu taustal, kasvasid andmemahud, serverite koormus ja vÀljalaskete sagedus. Me jÀime jÀrgmisesse olukorda:

  • Peamine MySQL andmebaas suurenes umbes 1000 tabelini, mille kogumaht oli 2,5 TB, ja jĂ€tkas kasvu.
  • Ei olnud vĂ”imalik kiiresti shardida ja andmebaasi laiali viia. Vanade lĂ€henemiste korral „kirjutan andmebaasi, mida tahan ja kuidas tahan”, hulk JOIN-e ja sisemisi tabelite sĂ”ltuvusi, ei vĂ”imaldanud seda.
  • Ei olnud mehhanismi andmebaasi skeemi migratsioonideks testkeskkondadesse.
  • Ei olnud automaatset koodi testimist tootmisse laskmisel.

Viimast probleemi sooviti lahendada vÔimalikult kiiresti. Postmani jaoks oli juba kirjutatud testid pÔhifilosoofia monoliidi kontrollimiseks, kuid puudus ajakohane andmebaas. Samuti ei saanud me öösel replikat luua, teha sellest meistriks ja anda seda pÀeva jooksul hÀvitamiseks: vÀga suur hulk vÀljalaskmisi ja muudatusi, sealhulgas andmetes ja andmebaasi skeemis, oleks teinud stendi juba pÀeva keskpaigaks mittetöötavaks. Ja vÀljalaskmiste piiramisega ainult tööpÀevadel ei oleks olnud efektiivne.

Sellegipoolest ĂŒlesanne tĂ€ideti: esimene töötav stend saadi juba kahe nĂ€dala jooksul. Selle möödunud aasta jooksul on see lĂ€binud palju muudatusi ja jĂ€tkab kasutamist.

Edasi kirjeldan ma pÔhjalikult kÔik etapid ja sammud meie lahenduse arengus. Te veendute, et see meetod vÀÀrib eksisteerimist.

Mis on „Ôhuke reserveerimine“?
See on riist- vĂ”i tarkvaratehnoloogia (tuntud ka kui sparse volumes), mis vĂ”imaldab eraldada rohkem vajalikke ressursse, kui tegelikult on saadaval. Eraldatav maht peab siiski vastama just-enough (nii palju kui vajalik) ja just-in-time (vajaliku ajaga) kriteeriumidele. Peamiselt rakendatakse Ă”hket reserveerimist erinevates andmesalvestussĂŒsteemides, et pakkuda ketaspinda vajalikus mahus, mis ĂŒletab tegelikult kĂ€ttesaadavad. Tehnoloogiat toetavad erinevad failisĂŒsteemid, nagu LVM2, ZFS, BTRFS. Seda kasutatakse laialdaselt virtualiseerimise hĂŒperviisorites. Õhuke reserveerimine vĂ”imaldas meil kiiresti luua pĂ”hikettast andmete lĂ”ikes nii palju koopiaid, kui meil oli vaja (MySQL andmebaasi data-kaust).

Esimene stand, Ôhukese LVM tehnoloogia

Seda peatĂŒkki vĂ”ib nimetada ka „Kuidas teha vĂ”imalikult kiireid snapshots suurtest andmemahtudest kasutades Ă”hukest LVM, vĂ€hendades failisĂŒsteemi ja MySQL andmebaasi stabiilsust lubamatule tasemele.“

Kuna olime juba kasutanud LVM-i operatsioonisĂŒsteemi pĂ”hiosade ehitamiseks, otsustasime alustada just sellest. Esiteks vajasime eraldi fĂŒĂŒsilist masinat – meie MySQL pĂ”hialuse koopiat, millel saaksime nĂ”udmisel luua koopiana snapshots ja tĂ”sta see ĂŒles eraldi MySQL eksemplariga. Testimise ajaks lubasime sellel eksemplaril kasutada muudetavaid operatsioone ja testide lĂ”ppedes kustutasime 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-kontrolleris Adaptec RAID-10

RAID-kontrolleri ja tarkvara RAID MD valimise teemal vĂ”iks kirjutada eraldi artikli. Ütlen vaid, et meie valikusse mĂ”jutasid kaks tegurit:

  • Kuna ĂŒlesande seadmisel installisime kĂ”ik andmebaasid RAID-kontrolleritele, vĂ”ib öelda, et see kujunes ajalooliselt nii.
  • Erinevus jĂ”udluses failisĂŒsteemi sĂŒnteetilistes testides ja erinevates MySQL operatsioonide testides oli minimaalne.

Me jagasime saadud RAID-10: tegime ĂŒhe Volume Group (VG) kogu ruumi peale (ligikaudu 6,7 GB ĂŒlekande kuludega) ja lĂ”ime loogilise partitsiooni (Logical Volume, LV) sĂŒsteemi jaoks 50 GB. Tavalistes oludes mÀÀraksime kogu ĂŒlejÀÀnud ruumi MySQL partitsiooniks. Kuid meil oli vaja peenvaru, seega lĂ”ime esmalt nn pooli, mille sees lĂ”ime partitsiooni /var/lib/mysql jaoks 3,5 TB (baseerudes prognoositavatel andmebaasi mahtudel):

lvcreate -l 100%FREE -T vga/thin
lvcreate -V 3.5T -T vga/thin -n mysql

Formateerisime partitsiooni ext4-formaadis, mountisime selle, kirjutasime koopia ja saime algse seista. Siis tegime API, mis peaks looma snapshots, tĂ”stma MySQL andmebaasi koopia mÀÀratud pordil ja kustutama loodud koopia. Kuna kasutatakse ainult sĂŒsteemi kutseid, valisime skriptide kirjutamise keeleks tavalise bash'i ja API sidumiseks HTTP → bash rakendasime open source lahenduse. goexpose, kirjutatud Go-s.

Kord me avaldame meie bash-skriptid open source'ina, kuid praegu kirjeldan lihtsalt pÔhilist algoritmi:

PÔhi snapshot'i loomine snapmain:

  1. Peamine koopia peatatakse.
  2. Seame lukustuse snapshot'i snapmain operatsioonide jaoks.
  3. Loome uue snapshot'i snapmain.
  4. KĂ€ivitame MySQL ja eemaldame lukustuse.

Andmebaasi loomine suvalisel pordil snapmain'ist:

  1. Seame lukustuse konkreetsele andmebaasi koopia (port).
  2. Kontrollime, kas pÔhikoopia snapshot'i loomisel on lukustus. Kui see on olemas, ootame ja kontrollime iga 5 sekundi jÀrel.
  3. Kontrollime, kas on olemas vana LV-partitsioon koopia.
    3.1 Kui see on olemas, peatame MySQL koopia kill -9 abil ja kustutame LV-partitsiooni.
  4. Loome snapmain'ist uue koopia.
  5. Valmistame ja mountime direktorid selle koopia jaoks.
  6. Eemaldame slave'i tunnused (failid) ja kÀivitame MySQL koopia.
  7. Teeme sellest meistri.
  8. Eemaldame lukustuse.

Andmebaasi kustutamine suvalisel pordil:

  1. Seame lukustuse konkreetsele andmebaasi koopia (port).
  2. Tapan MySQL koopia kill -9 abil.
  3. Unmountime direktorid.
  4. Kustutame LV-partitsiooni ja eemaldame lukustuse.

NÀited uue andmebaasi koopia partitsioonide kloonimise kÀskudest:

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_3307

NĂŒĂŒd rÀÀgime pĂ”hiprobleemist, millega me kokku puutusime Ă”hukese varundamise kasutamisel. Me pidime silmitsi seisma SSD-kettaste tulemuslikkusega. See juhtus Thin LVM eripĂ€rade tĂ”ttu: see töötab pĂ”himĂ”tteliselt madala taseme seadme plokkidega, mille vaikimisi suurus on 4 MB. Kuidas see vĂ€lja nĂ€gi:

  1. Loome snapshots pÔhiosast /var/lib/mysql.
  2. KÀivitame replikatsiooni, et jÔuda meistriga samasse punktisse.
  3. Igasugune muudatus replikatsiooni tabelites sunnib salvestama vanad, muutmata andmeplokid snapshot'i osas.
  4. Igasugune muudatus ĂŒles tĂ”stetud testieksemplaris sunnib salvestama vanad, muutmata andmeplokid selle eksemplari kloonitud snapshot'i osas.
  5. Saame 100% sisend-vÀljund operatsioonide koormuse seadmel, aeglustades igasuguseid toiminguid ja viies replikatsiooni jÀrk-jÀrgult tagasi.
  6. TööpÀeva lÔpuks saame mitme tunni vÔrra maha jÀÀnud keskkonna.

Kuidas me sellega vÔitlesime, et saada mÔistlikum tulemus (peamised punktid):

RAID-kontroller:

  • LĂŒlitasime vĂ€lja kĂ”ik vahemĂ€lu tĂŒĂŒbid vaikimisi.
  • Seadsime writeback (andmete jĂ”udmine vahemĂ€llu lĂ”petab kirjutamise enne, kui tegelik salvestamine kettale toimub).

FailisĂŒsteem:

  • Mountimispunktis /var/lib/mysql mÀÀrasime noatime,nodiratime,data=writeback
  • LĂŒlitasime vĂ€lja ext4 logimise tune2fs'i abil.

MySQL:

  • MÀÀrasime innodb_flush_method = O_DSYNC (suurendasime kirjutamiskiirust, vĂ€hendades seelĂ€bi usaldusvÀÀrsust).
  • LĂŒlitasime vĂ€lja logimise, logid pole meile vajalikud.
  • MÀÀrasime innodb_buffer_pool_size = 4G (mida vĂ€iksem on InnoDB puu suurus, seda kiiremini MySQL peatub, ja seda kiiremini saame snapshot'i luua).

See ei ole kaugeltki tĂ€ielik nimekiri, eriti MySQL-i osas. Kuid ĂŒlejÀÀnud muutused on vĂ€hem tĂ€htsad ja sageli ei ole need alati ja tĂ€pselt rakendatavad. NĂ€iteks, et kettaid koormust vĂ€hendada, viisime isegi innodb_parallel_doublewrite_path kausta /dev/shm, mis sÀÀstis mĂ”nes olukorras kuni 5 sekundit vale lĂ”petamise jĂ€rgselt.

Miks me peatame MySQL enne snapshot'i loomist? Me vÔime selle teha töötava replikatsiooni pealt. Jah, see on Ôige, kuid uus andmebaasi eksemplar selle snapshot'i pealt loetakse vaikimisi rikutuks ja vajab kÀivitamisel tÀielikku skaneerimist. Replikatsiooni peatamine on kindlasti kiirem, ehkki see osutub kogu protsessi jooksul kÔige kestvAMAKS toiminguks.

Tulemuseks saime sobivamad ajad ja töökorras oleva kÔrvuti. Kuigi nagu nÀhtub peamisest replikatsioonist rÀÀkivast kÔige veenvamast graafikust, on olukord ikka veel kaugel ideaalist:
Õhuke Linuxi failisĂŒsteemide varundamine. Kuidas luua kolme terabaidi suuruste MySQL andmebaaside töökoopiaid 20 sekundi jooksul

Teistest puudustest tasub mĂ€rkida peaaegu vĂ”imatut Thin LVM-i aluse jĂ€lgimist: peale sĂŒsteemi standardsete iostat funktsioonide pole vĂ”imalik mÀÀrata, nĂ€iteks, milline aluse element hetkel esitab suurimat koormust failisĂŒsteemile.

Eraldi tasub mĂ€rkida ĂŒhte suurt puudust, mis on seotud eespool kirja pandud optimeerimisega: saime YOLO-keskkonna. Umbes kord kuus vĂ”i kahe kuu jooksul ext4 ei pidanud selliseid ĂŒlekohut taluma ja purunes pöördumatult, nĂ”udes ĂŒmberformaatimist ja replikatsiooni uuesti. Kiirusest vĂ”itnud, hĂ€vitasime lootusetult stabiilsuse.

Milliste mÔÔdikute jÀrgi jÀlgida Thin LVM-i kasutamise ajal:

  • Thin pool andmete %
  • Thin pool metaandmete %

Kui meie keskkond suudab andmete lÔppemise över elada (piisab ketaste puhastamisest), siis metaandmete lÔppemine toob kaasa kogu aluse kokkuvarisemise ja vajaduse see nullist uuesti luua.

FailisĂŒsteem all pool aja jooksul vĂ€ga palju fragmenteerub. Soovitame igal pĂ€eval kĂ€ivitada krooniga kĂ€su fstrim -v /var/lib/mysql.

VahekokkuvÔtted:

  • Tehnoloogia rakendamine on lihtne, nagu ka LVM ise, ning ei nĂ”ua insenerilt erilisi oskusi.
  • See sobib hĂ€sti vĂ€ikeste andmebaaside ja mitte liiga koormatud sĂŒsteemide jaoks. Mida vĂ€iksem on andmebaas, seda vĂ€hem tĂŒkke liigub failisĂŒsteemis all pool ja seda madalam on koormus ketastele.
  • Meie ĂŒlesande jaoks hakkasime otsima teisi lahendusi, millest juttu tuleb jĂ€rgmises jaotises.

Teine keskkond, tehnoloogia ZFS

Kaua aega tagasi olin ma kokku puutunud ZFS-failisĂŒsteemiga, kuid siis töötas ZFS oma koduoperatsioonisĂŒsteemis Solaris tĂ”eliselt hĂ€sti. Eksisteeris FreeBSD-le portitud versioon, millel oli piisavalt hea rakendamine. Samuti oli olemas poolik port Linuxile, mida vĂ€hesed kasutasid. Andmete salvestamise struktuuri tĂ”ttu B-tree (tĂ”si, sama salvestamisstruktuur on ka InnoDB MySQL-is) ei nĂ€idanud ZFS end vĂ€ga hĂ€sti installatsioonides, kus oli tohutult faile. KĂ”ik see koos vajadusega enne kasutamist materjal tundma Ă”ppida oli pĂ”hjus, miks see failisĂŒsteem pikka aega minu praktikas kĂ”rvale jĂ€i. Ilmnesid ext4 ja xfs, mis muutusid standardiks. Kuid arvestades, et ZFS sobib meie ĂŒlesande jaoks rohkem kui hĂ€sti ja Linuxi versioon, nagu tagasisidet arvestades, on muutunud tĂ€iesti korralikuks tooteks (kuigi mitte tĂ€is toetusega, mistĂ”ttu ZFS-ile sĂŒsteemi paigaldamine algusest peale on vĂ”imalik vaid erinevate trikkide abil), otsustasime seda proovida.

MĂ”istetavatel pĂ”hjustel valisime sarnase konfiguratsiooni (vĂ€lja arvatud RAID-kontroller). Paigaldasime kaheksa 1920 GB SSD-d. Ei olnud soovi kirjutada oma vĂ”rgu pilti, et installida server tĂŒhjale ZFS-ile, seetĂ”ttu vĂ”tsime igast kettast 50 GB ja tegime nendele MD RAID-10 sĂŒsteemi jaoks. ÜlejÀÀnud 1950 GB igal kettal ĂŒhendasime ZFS analoog RAID-10-ga:

zpool create zpool mirror /dev/sda2 /dev/sdb2 mirror /dev/sdc2 /dev/sdd2 mirror /dev/sde2 /dev/sdf2 mirror /dev/sdg2 /dev/sdh2

Loomise jaoks lÔime osad MySQL-i 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/data

Pange tĂ€hele, et oleme lĂŒlitanud sisse vaikimisi gzip-andmete kokkusurumise. Meil on serveris palju protsessorivĂ”imsust ja see ei ole tĂ€ielikult kasutusel. Tulemuseks on see, et 3 TB meie andmebaasist muutus 1,6 TB-ks ja kuna nĂ”rk lĂŒli, nagu eelmisel korral, on maksimaalne ketta tootlikkus, siis mida vĂ€hem andmeid, seda parem. Saame alguses ZFS-ilt suurepĂ€rase boonuse! Tipptunnil full-loadi ajal kulub gzip’i töötluseks kuni 4 tuuma, kuid meil ei ole seda kahju.

Edasi liikudes lĂ€ks rakendamine kiiremini. Kopeerisime LVM-seisundist MySQL repliiki seaded. Pidi kulutama aega skriptide ĂŒmberkirjutamiseks ZFS-i kĂ€skudeks, kuid ĂŒldiselt jĂ€id algoritmid endiseks. NĂ€ide jÀÀdvustamise loomisest:

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/data

Lisaks tĂ€iendavalt hÀÀlestamisest: tĂ”stsime mĂ€llu ZFS-i jaotised, kus on metaandmed ja logid l2arc ja zil. Meie ĂŒlesande jaoks osutus see hiljem liigseks, kuid seni oleme selle optimeeringu sĂ€ilitanud, seda on lihtne hiljem muuta. Negatiivsete mĂ”jude seas on see, et pĂ€rast serveri taaskĂ€ivitamist tuleb vastavad mĂ€lu piirkonnad uuesti luua. Andmeid seejuures ei kaotata. VĂ€ljavĂ”te zpool status:

logs
      /dev/shm/zil_slog.img  ONLINE       0     0     0
cache
      /dev/shm/l2arc.img     ONLINE       0     0     0

Sellises konfiguratsioonis hakkasime testima seadet ja saime suurepÀraseid tulemusi: kahe samal ajal töötava andmebaasi eksemplari (ja aktiivse peamise replikaga) snÀpƥottide peal saavutasime diskide koormuse 50-60%.

Oleme vabanenud oma peamisest probleemist, mida on nÀha replikatsiooni viivituse graafikult (vÔrrelge eelmise graafikuga jaotises Thin LVM):
Õhuke Linuxi failisĂŒsteemide varundamine. Kuidas luua kolme terabaidi suuruste MySQL andmebaaside töökoopiaid 20 sekundi jooksul

Lisaks ja tÀnu sellele kiirenesime kÔigis operatsioonides: tÀielik snÀpƥoti loomine replika peatamise ja kÀivitamisega kestab kuni 40 sekundit, snÀpƥotist uue MySQL eksemplari kÀivitamine kestab kuni 20 sekundit. See rahuldab rohkem kui meid ning meie tarkvarakoodi testid.

VahekokkuvÔtted:

  • Tulemused rahuldasid tĂ€ielikult meie vajadust saada koopia tootmisandmebaasist koodi testimiseks.
  • Tehnoloogia nĂ”uab sissejuhatust: tuleb mĂ”ista, mis on ZFS ja kuidas sellega töötada.
  • Me ei ole kontrollinud ZFS-i praegust tööolekut suure arvu (ĂŒle 1 miljoni) vĂ€ikese faili korral. Kuid eeldame, et probleem pĂŒsib, seega ei soovitaks ma seda failisĂŒsteemi mingiks failide hoidmiseks.

Mis edasi?

Standi raames ei teinud me rohkem midagi, tulemus meid rahuldab. Tulevikus vĂ”ime lisada replikatsiooni seadmestikku tabelite erandeid, mis ei ole testimiseks vajalikud, see vĂ€hendaks veelgi andmebaasi mahtu. Me ei ole testinud BTRFS sĂŒsteemi ja selle rakendust Ă”hukeste varundamisvĂ”tete tehnoloogiale. Kuid sellist eesmĂ€rki ei ole enam, kuna pĂ”hieesmĂ€rk on saavutatud. Üldiselt tahaksime loomulikult sellel eelnevalt kirjeldatud lĂ€henemisviisilt loobuda — teostada tööalised andmebaasi migratsioonid testkeskkonda, luua eraldi testkontuur andmebaasile, tegeleda peamise andmebaasi shardimisega. Paljusid neist me juba ellu viime, millest kindlasti rÀÀgime tulevastes artiklites.

Summary

Algne ĂŒlesanne oli lahendatud, kuigi ebatavalisel viisil. VaheanalĂŒĂŒsides on kirjeldatud iga rakendatud tehnoloogia plusse ja miinuseid, seega otsustame, millist tehnoloogiat ja millal kasutada:

  • Thin LVM — vĂ€ikeste andmebaaside puhul ja kui ei soovi vĂ”i ei ole aega ZFS-i uurimiseks.
  • ZFS — kui on kogemusi selle kasutamisel vĂ”i vĂ”imalust kulutada aega uurimisele igas olukorras.

Kohandatud tasemel on see artikkel — mitte lihtsalt kahe failisĂŒsteemi tehnoloogia vĂ”rdlemine. Peamine idee, mida soovin edastada ja kinnitada, on see, et ei tohiks karta mĂ”elda ebatraditsiooniliselt olukordades, mis on kriitilised Ă€ri jaoks, ja vĂ”tta ainult valmis retsepte. Kunagi vĂ”isime kogu tehnilise osakonnaga pead raputada ja öelda, et kolm terabaiti andmebaasi koopia loomine vĂ€hem kui minutiga on teostamatu ning me ei vaja riskantseid tehnoloogiaid, teeme, nagu peab. See oleks olnud vĂ”imalik, kuid oleksime kaotanud umbes kuus kuud- aasta ja palju kliendireise (reisid on meie peamine Ă€ritulemus) ilma testideta ja rakendamise ajal. Ebatraditsiooniliselt tegutsedes kaotasime rakendamisele mitte nii palju aega, saime kogemusi uute ja unustatud vanade tehnoloogiate kohta ning pakkusime testimise just siis, kui me seda vĂ€ga vajasime. Ilmselgelt avaldas see positiivset mĂ”ju kĂ”ikidele meie nĂ€itajatele. Valik on alati teie, ja meie jĂ€tkame oma blogis huvitavate praeguste ja tulevaste saavutuste jagamist.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster