MySQL yra plačiai naudojama atvirojo kodo reliacinių duomenų bazių valdymo sistema. Nors ši RDBVS yra plačiai naudojama, tam tikrais aspektais ji dažnai suprantama neteisingai. Vienas iš tų aspektų yra dideli duomenys – ar reikėtų naudoti didelių duomenų aplikacijas MySQL infrastruktūroje? Galbūt turėtumėte naudoti MongoDB? Gal reikėtų peržvelgti neo4j ar net AWS Redshift? Pabandysime į tai pažvelgti išsamiau.
Prieš pradėdami gilintis į MySQL ir didelius duomenis, turbūt turėtume išsiaiškinti, kas yra MySQL ir kaip tai veikia:
Kita vertus, dideli duomenys yra ganėtinai platus terminas kuris paprastai apibrėžia didelį duomenų kiekį – tokie duomenys gali būti netinkami tradiciniams duomenų saugojimo ir apdorojimo metodams taikyti.
Naudodami MySQL galite naudoti kelis saugyklų variklius:
Nors pasirinkimų yra ganėtinai daug, du dažniausiai naudojami MySQL varikliai yra InnoDB ir MyISAM. Pagrindiniai skirtumai tarp šių dviejų variklių yra:
InnoDB taip pat atitinka ACID parametrus.
Kai kalbame apie duomenų bazių sistemas, ACID yra savybių rinkinys, kuriuo siekiama užtikrinti duomenų integralumą bet kokių nesklandumų, galinčių kilti apdorojant duomenų bazių operacijas, atvejais. Duomenų bazės valdymo sistema, kuri laikosi šių principų, yra vadinama ACID atitinkančia DBVS.
ACID yra santrumpa išskaidoma taip:
Teisingas duomenų bazės variklio pasirinkimas yra labai svarbus bet kokio tipo projektui – tai ypač svarbu tiems projektams, kurie tvarko didelius duomenų kiekius, taigi, jei kalbame apie didelius duomenis MySQL infrastruktūroje, turėtume pasirinkti InnoDB.
Dabar mes žinome, kas yra DBVS, kokius duomenų bazių variklius galima pasirinkti dirbant su MySQL, kas yra ACID ir kodėl dirbdami su duomenimis turėtume pasirinkti InnoDB, tačiau mes pamatėme tik ledkalnio viršūnę – norėdami geriau suprasti kaip InnoDB veikia, privalome atidžiau pažvelgti į variklį. Štai kaip po gaubtu atrodo InnoDB:
Aukščiau pateikta schema yra vaizdinis InnoDB architektūros pavyzdys. Panagrinėkime ją išsamiau pradėdami nuo atminties:
InnoDB disko pusėje matome sistemos “tablespace” (lentelių erdvę) – ibdata1 failas yra labiausiai užimtas vailas visoje InnoDB infrastruktūroje, nes jame yra visos duomenų bazėje esančios lentelės ir indeksai. Jame yra:
Pagrindinė šio failo problema yra ta, kad jis gali tik augti – net jei ir ištrinsite lentelę susietą su InnoDB varikliu, ibdata1 failo dydis nesumažės, o jei ištrinsite ibdata1 failą, ištrinsite visus duomenis, susijusius su InnoDB lentelėmis. Tai gali tapti nepaprastai didele ir varginančia problema kai dirbama su dideliais duomenų kiekiais – jei paleisite MySQL pražiūrėję šią problemą, rizikuojate prarasti daug vietos diske veltui. Vienintelis būdas sumažinti šio failo dydį kartą ir visiems laikams ir išvalyti InnoDB infrastruktūrą yra:
innodb_file_per_table;
innodb_flush_method = O_DIRECT;
innodb_buffer_pool_size = 10G;
innodb_log_file_size = 2.5G;
Po šios operacijos paleidę MySQL pastebėsite, kad ibdata1, ib_logfile0 ir ib_logfile1 failai bus 2.5GB dydžio.
Kai tai atliksite, ibdata1 failas augs, tačiau šiame faile bus tik lentelių metaduomenys be InnoDB lentelės duomenų ir be lentelių indeksų – lentelės bus reprezentuojamos .frm ir .ibd failuose.
Kiekviename .frm faile bus saugojimo variklio antraštė, o .ibd faile bus lentelės duomenys ir indeksai. Jei norėsite pašalinti lentelę su InnoDB varikliu tiesiog ištrinsite susijusius .ibd ir .frm failus.
Tikriausiai pastebėjote, kad palietėme kelis InnoDB parametrus iki galo nepaaiškinę kas jie yra ar ką jie daro. Pagrindiniai parametrai į kuriuos turime pažvelgti yra šie:
Aukščiau pavaizduotame paveikslėlyje pavaizduoti visi pagrindiniai InnoDB parametrai:
Kai dirbame su dideliais duomenų kiekiais InnoDB infrastruktūroje, šiuos parametrus turime šiek tiek pakeisti. Akivaizdu, kad jei bet kokioje aplinkoje dirbame su itin dideliais duomenų kiekiais, mums reikia atitinkamų serverių, daug disko vietos ir ganėtinai daug RAM atminties. Taip pat turėtume pasirinkti serveryje esančią operacinę sistemą.
Pažvelgsime į serveryje su 1TB disku ir 8GB operatyviosios atminties esančią my.cnf konfigūraciją.
Kadangi šis serveris turi 8GB operatyviosios atminties, mes taip pat galėtume nustatyti innodb_buffer_pool_size į didesnę vertę – šiuo atveju šio kintamojo vertė gali būti apytiksliai nuo 6 iki 6.5GB (ne daugiau kaip apie 80% operatyviosios atminties dydžio). Turėtume atitinkamai pakoreguoti ir innodb_log dydžius.
Aukščiau pateiktame paveikslėlyje taip pat matome, kad innodb_file_per_table direktyva yra įjungta ir innodb_flush_method yra nustatytas į O_DIRECT. Ankščiau sakėme, kad O_DIRECT nėra prieinamas Windows operacinėse sistemose ir taip yra todėl, kad Windows naudoja async_unbuffered, todėl ši kintamojo reikšmė neturi jokio poveikio. Jei kalbame apie Windows, vienintelės priimtinos innodb_flush_method reikšmės yra “normal”, “unbuffered” ir “async_unbuffered”. Kita vertus, Unix operacinėse sistemose galime naudoti “fsync”, “O_DSYNC”, “littlesync”, “nosync”, “O_DIRECT”, ir “O_DIRECT_NO_FSYNC”. Štai ką daro visi flush metodo kintamieji:
fsync() sistemos funkcija yra glaudžiai susijusi su standartine sistemos funkcija Unix architektūroje – sync(). fsync() perduoda tik buferinius duomenis, susijusius su nurodytu failo deskriptoriumi (indikatoriumi, kuris naudojamas prieigai prie resursų). Kitaip tariant, ši funkcija baigsis tik po to kai duomenys ir metaduomenys bus perkelti į faktinę saugojimo vietą.
Dabar MySQL jau yra beveik pasirengusi tvarkyti didelius duomenų kiekius! Beveik – dar yra keletas dalykų, į kuriuos reiktų pažvelgti atidžiau: lentelių dizainas, didelių duomenų įterpimas į lenteles ir replikacija.
Įkelti duomenis į MySQL paprastai nėra labai didelė problema – problemos prasideda tada, kai pradedame dirbti su didesniais duomenų kiekiais – įkeliant tokius duomenis į MySQL užklausos pradeda būti labai lėtos arba nutrūksta.
Taip nutinka todėl, kad kai duomenų bazė apdoroja INSERT užklausą, ji turi apdoroti ir daug pašalinių dalykų įskaitant užrakinimą, operacijų atskyrimą, vientisumo patikrinimus, išteklių paskirstymą, taip pat I/O kiekvienai užklausai. Mes galime to išvengti naudodami masinį duomenų įkrovimą – jis gali būti šimtus kartų greitesnis nei duomenų įkrovimas į duomenų bazę naudojant INSERT užklausas, nes masinis duomenų įkrovimas (bulk loading) yra specialiai sukurtas dideliems duomenų kiekiams.
Nors “bulk loading” yra skirtas dideliems duomenų kiekiams, jei duomenys, kuriuos norite įkelti į sistemą, turi šimtus milijonų įrašų, masinis duomenų įkrovimas gali suletėti. Taip gali nutikti todėl, nes duomenų įkrovimui skirto buferio dydis gali būti per mažas – toks scenarijus yra žinomas kaip “bulk insert buffering”. Norėdami tai išspręsti padidinkite bulk_insert_buffer_size
parametro reikšmę.
Net jei visi duomenų bazės parametrai yra tinkamai optimizuoti, užklausos per didelius duomenis vis tiek gali būti lėtos. Norėdami pagerinti užklausų greitį:
ALTER TABLE
– ALTER
užklausos ant labai didelių lentelių dažnai užtrunka labai ilgą laiką, nes MySQL turi užrakinti lentelę skaitymui, sukurti laikiną lentelę su norima struktūra, nukopijuoti visas eilutes į tą laikiną lentelę, atrakinti lentelę ir ištrinti seną lentelę;Replikacija įgalina duomenų kopijavimą iš vienos MySQL duomenų bazės serverio į vieną ar daugiau duomenų bazių serverių. Pagrindinis duomenų bazės serveris yra vadinamas “pagrindiniu” (“master”), kiti – “vergais” (“slave”). Tai gali būti naudinga dirbant su bet kokiais duomenų kiekiais, ypač jei programuotojai naudoja MySQL darbui su didžiuliais duomenimis. Replikacija gali būti naudojama dėl daugelio priežaščių įskaitant našumo gerinimą paskirstant apkrovą keliems serveriams arba kuriant atsargines duomenų kopijas. Yra keli replikacijos tipai:
Kiekvienas replikacijos tipas, be abejo, turi savo privalumų ir trūkumų – tai reiškia, kad kiekvienas replikacijos tipas tinka skirtingiems naudojimo atvejams.
“Master-slave” replikacija gali būti naudinga tada, kai programuotojams reikia skaityti iš “slave” serverių nedarant įtakos “master” serveriui arba jei programuotojai nenori, kad duomenų bazių atsarginės kopijos darytų poveikį “master” serverio veikimui. “Master-slave” replikacija taip pat gali būti naudinga, jei “slave” serveriai turi būti išjungti ir susinchronizuoti su “master” serveriu be prieigos praradimo.
Pagrindinis trūkumas susijęs su “master-slave” replikacija yra tai, kad sugedus “master” duomenų bazei, “slave” serverius reikia padaryti “master” serveriais rankiniu būdu – tai reiškia, kad programuotojai rizikuoja duomenų neprieinamumu.
“Master-master” replikacija gali būti naudinga, jei programuotojams reikia, kad jų aplikacija paskirstytų apkrovą ar skaitytų iš abiejų “master” serverių. “Master-master” replikacijoje taip pat prieinamas automatinis “failover” – “slave” serverių padarymas “master” serveriais pagrindinei “master” duomenų bazei būnant nebeprieinamai.
Pagrindinis “master-master” replikacijos minusas yra tai, kad šios replikacijos rūšies konfigūracija yra sudėtingesnė nei “master-slave” replikacijos konfigūracija.
MySQL klasterio naudojimas gali būti naudingas, jei naudojamai aplikacijai reikalingas didelis prieinamumas ir pralaidumas ar paskirstytos įrašymo (“write”) operacijos, tačiau tokia architektūra turi kelis apribojimus.
Galime pastebėti, kad nelietėme vieno iš MySQL variklių – MyISAM. Mes to nepadarėme, nes jei Jūsų architektūroje bus ir InnoDB ir MyISAM varikliai, priversti abu variklius darniai dirbti bus sudėtinga – tokiu atveju reiktų apsvarstyti kiek atminties skirti kiekvienam varikliui, nes abu varikliai turi skirtingas “cache” talpyklas.
Apibendrinant galima pasakyti, kad MySQL duomenų bazių valdymo sistema tinka dirbti su dideliais duomenų kiekiais, tačiau našumas kurį gausite labai priklausys nuo to, kokius serverius naudosite, ar naudosite juos pilnu pajėgumu, ar ne (jums gali nereikti terabaitų operatyviosios atminties – galbūt pakaktų 32GB ar net 16GB?), kaip optimizuosite MySQL, kokį variklį naudosite ir nuo Jūsų MySQL duomenų bazių administravimo įgūdžių.
There have been rumors about a data breach targeting Schneider Electric. Did a data breach…
There have been rumors about the Fiskars Group – the company behind Fiskars scissors and…
Russia has fined Google more than two undecillion roubles because Google has refused to pay…
Why does RockYou 2024.txt look like a binary file when you open it up? Find…
Duolicious is a dating app that connects people who are “chronically online.” Did the Duolicious…
This blog will tell you what RockYou 2024 is, how RockYou 2024.txt came to be,…