Andmemudeli disaini omadused NoSQL jaoks

Sissejuhatus

Andmemudeli disaini omadused NoSQL jaoks „Peab olema kĂ”ikide jĂ”ududega jooksma, et lihtsalt kohapeal pĂŒsida,
ja et kuhugi jĂ”uda, tuleb joosta vĂ€hemalt kahekordselt kiiremini!“
(c) Alice Imedemaal

MĂ”ni aeg tagasi paluti mul pidada loeng meie ettevĂ”tte analĂŒĂŒtikutele teemal andmemudelite projekteerimine, sest pikaajaliste projektide (mĂ”nikord mitu aastat) jooksul unustame, mis IT-tehnoloogiate maailmas toimub. Meie ettevĂ”ttes (nĂŒĂŒd nii juhtunud) ei kasutata paljudes projektides NoSQL andmebaase (vĂ€hemalt seni), seega pidasin oma loengus pĂ”hitĂ€helepanu sellele, kasutades HBase'i nĂ€idet, ja pĂŒĂŒdsin suunata materjali esitust neile, kes pole nendega kunagi töötanud. Eriliselt tĂ”in vĂ€lja andmemudeli projekteerimise mĂ”ned eripĂ€rad nĂ€ite pĂ”hjal, mille lugesin paar aastat tagasi artiklist „Introduction to HBase Schema Design“ autoriks Amandeep Khurana. AnalĂŒĂŒsides nĂ€iteid, vĂ”rdsustasin omavahel mitmeid lahenduste variante sama probleemi kĂ€sitlemiseks, et paremini edastada kuulajatele pĂ”hiteemasid.Hiljuti, „igavusest“, kĂŒsisin endalt, kuivĂ”rd teoreetilised jĂ€reldused vastavad praktikale? Tegelikult sĂŒndiski selle artikli idee. Arendaja, kes on juba pikka aega töötanud NoSQL-iga, ei pruugi siit midagi uut leida (ja seetĂ”ttu vĂ”ib kohe artikli keskelt edasi kerida). Aga

analĂŒĂŒtikutele, kes pole veel NoSQL-iga tihedalt töötanud, arvan, et see artikkel annab kasulikke baasteadmisi HBase'i andmemudelite projekteerimise eripĂ€radest.NĂ€ite analĂŒĂŒs

NĂ€ide analĂŒĂŒs

Minu arvates tuleks enne NoSQL andmebaaside kasutamise alustamist hoolikalt mĂ”elda ja kaaluda "pooli" ja "vastu". Sageli saab ĂŒlesande lahendada ka traditsiooniliste relationaalsete andmebaasidega. Seega on parem vĂ€ltida NoSQL-i kasutamist ilma oluliste pĂ”hjusteta. Kui otsus kasutada siiski NoSQL andmebaasi on tehtud, tuleb arvestada, et projekteerimispĂ”himĂ”tted on siin veidi erinevad. Eriti vĂ”ivad mĂ”ned neist olla harjumatud neile, kes on varem töötanud ainult relationaalsete andmebaasidega (minu vaatluste kohaselt). Nii et "relationaalses" maailmas lĂ€htume tavaliselt aineala mudeldamisest, ja alles siis, vajadusel, teeme mudeli denormaliseerimise. NoSQL-i puhul peame jĂ€rele mĂ”tlema eeldatavad stsenaariumid andmete töötlemiseks ja algselt andmeid denormaliseerima. Lisaks on veel mitmeid teisi erinevusi, millest allpool rÀÀgitakse.

Kaalume jĂ€rgmise "sĂŒnteetilise" ĂŒlesande, millega edaspidi töötame:

On vajalik kujundada struktuur kasutajate sÔprade nimekirja salvestamiseks mingisuguses abstraktses sotsiaalses vÔrgustikus. Lihtsuse huvides eeldame, et kÔik sidemed on suunatud (nagu Instagramis, mitte LinkedInis). Struktuur peaks vÔimaldama tÔhusalt:

  • Vastata kĂŒsimusele, kas kasutaja A loeb kasutaja B postitusi (lugemise mall)
  • Lubada lisada/rahuldada sidemed juhul, kui kasutaja A jĂ€lgib/kui kasutaja A loobub kasutaja B jĂ€lgimisest (andmete muutmise mall)

Muidugi on ĂŒlesande lahendamiseks palju vĂ”imalusi. Tavalises relationaalses andmebaasis teeksime tĂ”enĂ€oliselt lihtsalt sidemete tabeli (vĂ”imalik, et tĂŒpiseeritud, kui nĂ€iteks on vaja salvestada kasutajarĂŒhm: pere, töö jne, kuhu kuulub see "sĂ”ber"), ning juurdepÀÀsu kiirusel optimeerimiseks lisaksime indeksid/partitsioneerimise. TĂ”enĂ€oliselt nĂ€eks lĂ”pptabel vĂ€lja umbes selline:

user_id
friend_id

Vasya
Petja

Vasya
Olya

siin ja edaspidi kasutan selguse ja parema arusaamise nimel ID-de asemel nimed

HBase-i puhul teame, et:

  • efektiivne otsing, mis ei vii full table scan'ini, on vĂ”imalik ainult vĂ”tme jĂ€rgi
    • Just for this reason, writing familiar SQL queries for such databases is a bad idea; technically, of course, you can send an SQL query with Joins and other logic from Impala to HBase, but how effective it would be...

Therefore, we are forced to use the user ID as a key. The first thought on where and how to store friend IDs may be the idea of storing them in columns. This most obvious and 'naive' option would look something like this (let's call it Option 1 (default), so we can refer to it later):

RowKey
Columns

Vasya
1: Petya
2: Olya
3: Dasha

Petja
1: Masha
2: Vasya

Here, each row corresponds to one user of the network. The columns are named: 1, 2, 
 — according to the number of friends, and the friend IDs are stored in the columns. It is important to note that each row will have a different number of columns. In the example above, one row has three columns (1, 2, and 3), while the second one has only two (1 and 2) — here we utilized two properties of HBase that relational databases do not have:

  • the ability to dynamically change the composition of columns (add a friend -> add a column, remove a friend -> remove a column)
  • different rows can have a different composition of columns

Let's check our structure against the task requirements:

  • Andmete lugemine: in order to understand whether Vasya is subscribed to Olya, we need to read the entire row by the RowKey = 'Vasya' and iterate through the column values until we 'meet' Olya in them. Or iterate through the values of all columns, not 'meeting' Olya and return False;
  • Data modification: adding a friend: for such a task, we will also need to read the entire row by RowKey = 'Vasya' to count the total number of his friends. This total number of friends is necessary for us to determine the column number where we need to record the ID of the new friend.
  • Data modification: deleting a friend:
    • It is necessary to read the entire row by RowKey = 'Vasya' and iterate through the columns to find the one where the friend to be deleted is recorded;
    • Then, after deleting the friend, we need to 'shift' all the data in one column to avoid 'gaps' in their numbering.

Now let’s evaluate how efficient the algorithms we need to implement on the side of the 'conditional application' will be, using O-symbol. MĂ€rgime meie hĂŒpoteetilise sotsiaalvĂ”rgu suuruseks n. Siis vĂ”ib ĂŒhe kasutaja maksimaalne sĂ”prade arv olla (n-1). Selle (-1) vĂ”ime meie eesmĂ€rkide jaoks edaspidi eirata, kuna O-sĂŒmboolika kontekstis ei oma see tĂ€htsust.

  • Andmete lugemine: on vajalik lugeda vĂ€lja kogu rida ja uurida piiril kĂ”iki selle veerge. Seega on ligikaudne kulude ĂŒlemine hind umbes O(n)
  • Data modification: adding a friend: sĂ”prade arvu mÀÀramiseks on vajalik uurida kĂ”iki rea veerge, pĂ€rast mida tuleb lisada uus veerg => O(n)
  • Data modification: deleting a friend:
    • Sarnaselt lisamisega - on vajalik piiril uurida kĂ”iki veerge => O(n)
    • PĂ€rast veergude eemaldamist peame need "liigutama". Kui teostame seda "otseselt", siis on lĂ”ppkokkuvĂ”ttes vaja veel kuni (n-1) toimingut. Kuid me rakendame siin ja edaspidi praktikas teistsugust lĂ€henemist, mis teostab "pseudo-liikumise" fikseeritud hulk operatsioone – st selle jaoks kulutatakse konstantne aeg olenemata n-st. Selle konstantse aja (kui olla tĂ€pne, siis O(2)) vĂ”ib vĂ”rreldes O(n) ignoreerida. LĂ€henemist illustreeritakse alloleval joonisel: kopeerime lihtsalt andmed "viimase" veeru seest sinna, millest tuleb andmed kustutada, pĂ€rast mida eemaldame viimase veeru:
      Andmemudeli disaini omadused NoSQL jaoks

KokkuvĂ”ttes, kĂ”ikides stsenaariumides saavutame asĂŒmptootilise arvutuskompleksuse O(n).
TĂ”enĂ€oliselt olete juba mĂ€rganud, et peame peaaegu alati vĂ€lja lugema kogu rea tervikuna, kusjuures kahes kolmandikus juhtudest ainult selleks, et uurida kĂ”iki veerge ja arvutada sĂ”prade koguarv. SeetĂ”ttu optimeerimise katse raames saame lisada veeru "count", kus salvestada iga sotsiaalvĂ”rgu kasutaja ĂŒldine sĂ”prade arv. Sel juhul ei pea me kogu rida tervikuna sĂ”prade koguarvu arvutamiseks vĂ€lja lugema, vaid saame lugeda ainult veeru "count". Peamine on mitte unustada uuendada "count" andmete manipuleerimisel. Seega saame paremuse. Variant 2 (count):

RowKey
Columns

Vasya
1: Petya
2: Olya
3: Dasha
count: 3

Petja
1: Masha
2: Vasya

count: 2

Esimese variandi vÔrdluses:

  • Andmete lugemine: kĂŒsimusele "Kas Vasja loeb Oljat?" pole midagi muutunud => O(n)
  • Data modification: adding a friend: Oleme lihtsustanud uue sĂ”bra lisamist, sest nĂŒĂŒd ei pea me kogu rida lĂ€bi vaatama ja selle veerge jĂ€rjestama, vaid saame lihtsalt kĂ€tte veeru „count“ vÀÀrtuse ja seega mÀÀrata uue sĂ”bra lisamise veeru numbri. See vĂ€hendab arvutuskohustuse keerukust O(1)-ni.
  • Data modification: deleting a friend: SĂ”bra kustutamisel saame samuti kasutada seda veergu, et vĂ€hendada sisse- ja vĂ€ljundoperatsioonide arvu, kui „nihutame“ andmeid ĂŒhe lahtri vĂ”rra vasakule. Kuid veergude lĂ€bivaatamise vajadus kustutatava leidmiseks jÀÀb alles, seega => O(n)
  • Teisest kĂŒljest, nĂŒĂŒd peame andmete vĂ€rskendamisel iga kord ka veeru „count“ uuendama, kuid sellele kulub konstantne aeg, mida O-keerukuse kontekstis saab tĂ€helepanuta jĂ€tta.

KokkuvĂ”ttes tundub variant 2 natuke optimaalsem, kuid see on pigem „evolutsioon, mitte revolutsioon“. „Revolutsiooni“ elluviimiseks vajame... Variant 3 (col).
KĂ€ime kĂ”ik „peapeale“: mÀÀrame veergu kasutaja identifikaatorina! Mida sellele veerule salvestatakse, ei ole meie jaoks enam oluline, olgu seal number 1 (ĂŒldiselt vĂ”ib seal hoida nĂ€iteks grupi „pere/sĂ”brad/jne.“). See lĂ€henemine vĂ”ib ĂŒllatada ettevalmistamata „tavalist“ inimest, kes pole varem NoSQL-andmebaasidega töötanud, kuid just see vĂ”imaldab HBase potentsiaali selles ĂŒlesandes palju tĂ”husamalt kasutada:

RowKey
Columns

Vasya
Petja: 1
Olia: 1
Dasha: 1

Petja
Masha: 1
Vasia: 1

Siin saame kohe mitu eelist. Et neid mĂ”ista, analĂŒĂŒsime uut struktuuri ja hindame arvutuskohustuse keerukust:

  • Andmete lugemine: selleks, et vastata kĂŒsimusele, kas Vasia on Olias, piisab, kui lugeda veergu „Olia“: kui see on olemas, siis vastus True, kui ei, siis False => O(1)
  • Data modification: adding a friend: SĂ”bra lisamiseks: piisab lihtsalt uue veeru „SĂ”bra ID“ lisamisest => O(1)
  • Data modification: deleting a friend: piisab lihtsalt veeru „SĂ”bra ID“ eemaldamisest => O(1)

Nagu nĂ€eme, on sellise sĂ€ilitamise mudeli oluliseks eeliseks see, et kĂ”igis vajalikes stsenaariumides opereerime ainult ĂŒhe veeruga, vĂ€ltides kogu rea lugemist andmebaasist ja veelgi enam, selle rea kĂ”igi veergude lĂ€bivaatamist. Sellega vĂ”iks lĂ”petada, kuid


Saame uurida ja minna veel veidi kaugemale jÔudluse optimeerimise ja andmebaasi sisendi-vÀljundi operatsioonide vÀhendamise teel. Mida kui hoida kogu teave seose kohta otse faili rea vÔtmises? St. teha vÔtmega koostisosast, nÀiteks userID.friendID? Sellisel juhul ei pea me mingil juhul isegi ridade veerge lugema.Variant 4 (rida)):

RowKey
Columns

Vassja.Petja
Petja: 1

Vassja.Olja
Olia: 1

Vassja.Dasha
Dasha: 1

Petja.Masha
Masha: 1

Petja.Vassja
Vasia: 1

Kliir, et sellise struktuuri andmetega kÔigi manipuleerimise stsenaariumide hindamine on samuti O(1), nagu eelmine variant. Erinevus kolmandast variandist on ainult sisendi-vÀljundi operatsioonide efektiivsuses andmebaasis.

Ja viimane "sildike". Kergesti vĂ”ib mĂ€rgata, et variandi 4 korral on meie ridade vĂ”tmel muutuv pikkus, mis vĂ”ib tĂ”enĂ€oliselt mĂ”jutada jĂ”udlust (siin tasub meeles pidada, et HBase salvestab andmeid baitide kogumina ja read tabelites on vĂ”tme jĂ€rgi sorteeritud). Samuti on meil eraldaja, mida mĂ”nedes stsenaariumides tuleb töödelda. Selle mĂ”ju kĂ”rvaldamiseks on vĂ”imalik kasutada userID ja friendID rĂ€simĂ€rke, ja kuna mĂ”lemal rĂ€sil on stabiilne pikkus, saab neid lihtsalt ĂŒhendada ilma eraldajata. Siis nĂ€eb andmestik tabelis vĂ€lja selline.Variant 5 (rĂ€simĂ€rk)):

RowKey
Columns

dc084ef00e94aef49be885f9b01f51c01918fa783851db0dc1f72f83d33a5994
Petja: 1

dc084ef00e94aef49be885f9b01f51c0f06b7714b5ba522c3cf51328b66fe28a
Olia: 1

dc084ef00e94aef49be885f9b01f51c00d2c2e5d69df6b238754f650d56c896a
Dasha: 1

1918fa783851db0dc1f72f83d33a59949ee3309645bd2c0775899fca14f311e1
Masha: 1

1918fa783851db0dc1f72f83d33a5994dc084ef00e94aef49be885f9b01f51c0
Vasia: 1

Ilmselt on algoritmilise keerukuse töö selle struktuuriga arvestatavate stsenaariumide puhul sama, mis variandi 4 puhul – st O(1).
KokkuvÔtteks, koondame kÔik meie arvutusi tabelisse:

SÔbra lisamine
SÔbra kontrollimine
SÔbra kustutamine

Option 1 (default)
O(n)
O(n)
O(n)

Variant 2 (loendus)
O(1)
O(n)
O(n)

Variant 3 (veerg)
O(1)
O(1)
O(1)

Variant 4 (rida)
O(1)
O(1)
O(1)

Variant 5 (rÀsimÀrk)
O(1)
O(1)
O(1)

Nagu nĂ€ha, on variandid 3-5 kĂ”ige eelistatumad ja teoreetiliselt tagavad kĂ”ik vajalikud andmete manipuleerimise stsenaariumid konstantse ajaga. Meie ĂŒlesande tingimustes ei ole otsest nĂ”uet, et saada kasutaja kĂ”igi sĂ”prade nimekirja, kuid reaalses projektitöös oleks meil kui headel analĂŒĂŒtikutel hea "ette nĂ€ha", et selline ĂŒlesanne vĂ”ib tekkida ja "alauku panna". SeetĂ”ttu on minu toetused variandi 3 poole. Kuid on tĂ€iesti vĂ”imalik, et reaalses projektis on see pĂ€ring juba lahendatud muude vahenditega, seega ilma ĂŒldise visioonita kogu ĂŒlesandest pole parem teha lĂ”plikke jĂ€reldusi.

Katseseadmete ettevalmistamine

Ülaltoodud teoreetilisi mĂ”tisklusi tahaksin praktikas kontrollida – see oli ka pika nĂ€dalavahetuse mĂ”tte eesmĂ€rk. Selleks on vajalik hinnata meie "teoreetilise rakenduse" töö kiirus kĂ”igis kirjeldatud andmebaasi kasutamise stsenaariumites, samuti selle aja kasvu koos sotsiaalvĂ”rgustiku (n) suuruse kasvuga. SihtnĂ€itaja, mis meid huvitab ja mida me eksperimendi kĂ€igus mÔÔdame, on aeg, mille "teoreetiline rakendus" kulutab ĂŒhe "Ă€ritegevuse" tĂ€itmiseks. "Äritegevusena" mĂ”istame me ĂŒhte jĂ€rgmistest:

  • Uue sĂ”bra lisamine
  • Kontrollimine, kas kasutaja A on kasutaja B sĂ”ber
  • Ühe sĂ”bra eemaldamine

Seega, arvestades algsetes tingimustes mÀrgitud nÔudeid, kujuneb kontrollimise stsenaarium jÀrgmiseks:

  • Andmete salvestamine. Juhuslikult genereerida algne vĂ”rk suurusega n. Suuremaks lĂ€henemiseks "reaalsele maailmale" on iga kasutaja sĂ”prade arv samuti juhuslik suurus. MÔÔta aeg, mille jooksul meie "teoreetiline rakendus" salvestab HBase kĂ”ik genereeritud andmed. SeejĂ€rel jagame saadud aja kĂ”igi lisatud sĂ”prade koguarvuga – nii saame keskmise aja ĂŒhe "Ă€ritegevuse" kohta.
  • Andmete lugemine. Iga kasutaja jaoks koostada nimekiri „isikutest”, kelle kohta tuleb kontrollida, kas kasutaja on neile tellinud vĂ”i mitte. Nimekirja pikkus = umbes kasutaja sĂ”prade arv, kusjuures pooltel kontrollitavatest sĂ”pradest peab vastus olema „Jah”, ja teisel poolel – „Ei”. Kontrollimine toimub sellises jĂ€rjekorras, et „Jah” ja „Ei” vahelduvad (st igal teisel juhul peame kĂ”iki veerge rida 1 ja 2 kontrollima). Üldine kontrollimise aeg jagada seejĂ€rel kontrollitavate sĂ”prade arvuga, et saada keskmine aeg ĂŒhe subjekti kontrollimiseks.
  • Andmete eemaldamine. Eemaldada kasutajalt kĂ”ik sĂ”brad. Eemaldamise jĂ€rjekord peab olema juhuslik (st „segame” algse nimekirja, mida andmete salvestamiseks kasutati). Üldine kontrollimise aeg jagada seejĂ€rel eemaldatavate sĂ”prade arvuga, et saada keskmine aeg ĂŒhe kontrolli jaoks.

Skeeme tuleb jooksutada iga 5 andmemudeli variandi ja erineva sotsiaalvĂ”rgu suuruse jaoks, et nĂ€ha, kuidas aeg muutub selle kasvades. Ühe n sideme raames peavad vĂ”rgu ja kontrollitavate kasutajate nimekirjad olema loomulikult kĂ”ikide 5 variandi jaoks samad.
Selle paremiseks mĂ”istmiseks toon allpool nĂ€ite genereeritud andmetest n= 5. Kirjutatud „generaator” annab vĂ€ljundina kolm ID-sĂ”nastikku:

  • esimene – sisestamiseks
  • teine – kontrollimiseks
  • kolmas – eemaldamiseks

{0: [1], 1: [4, 5, 3, 2, 1], 2: [1, 2], 3: [2, 4, 1, 5, 3], 4: [2, 1]} # kokku 15 sÔpra

{0: [1, 10800], 1: [5, 10800, 2, 10801, 4, 10802], 2: [1, 10800], 3: [3, 10800, 1, 10801, 5, 10802], 4: [2, 10800]} # kokku 18 kontrollitavat subjekt

{0: [1], 1: [1, 3, 2, 5, 4], 2: [1, 2], 3: [4, 1, 2, 3, 5], 4: [1, 2]} # kokku 15 sÔpra

Kuidas vĂ”ib mĂ€rgata, et kĂ”ik ID-d, mis ĂŒletavad 10 000 kontrollimise sĂ”nastikus – need on just need, mis kindlasti annavad vastuse False. SĂ”prade sisestamine, kontrollimine ja eemaldamine toimuvad tĂ€pselt sĂ”nastikus nĂ€idatud jĂ€rjekorras.

Eksperiment viidi lĂ€bi sĂŒlearvutis, mis töötas Windows 10 all, kus ĂŒhes Docker konteineris töötas HBase andmebaas ja teises – Python Jupyter Notebookiga. Dockerile eraldati 2 CPU tuuma ja 2 GB RAM-i. Kogu loogika, nii „tinglikku rakendust” simuleerimine kui ka testandmete genereerimise ja aja mÔÔtmise â€žĂŒmberringi” kirjutati Pythonis. HBase’i töötlemiseks kasutati teeki happybase, et hashide (MD5) arvutamiseks variandi 5 — hashlib

Arvesse vĂ”ttes konkreetse sĂŒlearvuti arvutusvĂ”imsust, valiti katse kĂ€ivitamine eksperimentaalselt n = 10, 30, 
 170 – kui kogu testimise tsĂŒkli (kĂ”ik stsenaariumid kĂ”igi variantide jaoks kĂ”ikide n-de jaoks) koguaeg oli veel enam-vĂ€hem mĂ”istlik ja mahtus ĂŒhe teejoomise ajal (keskmiselt 15 minutit).

Siin on vajalik teha mÀrkida, et selles eksperimendis hindame esmajoones mitte absoluutseid jÔudluse numbreid. Isegi kahe erineva variandi suhteline vÔrdlemine ei pruugi olla tÀiesti korrektne. Praegu huvitab meid eelkÔige aja muutumise iseloom sÔltuvalt n-st, kuna eespool nimetatud 'katse seade' konfigureerimisega on ajahinnangute saamine, mis on 'puhastatud' juhuslike ja muude tegurite mÔjust, vÀga keeruline (ja sellist eesmÀrki pole seadnud).

Eksperimenti tulemus

Esimene test – kuidas muutub aeg, mis kulub sĂ”prade nimekirja tĂ€itmiseks. Tulemus – alloleval graafikul.
Andmemudeli disaini omadused NoSQL jaoks
Variandid 3-5 nÀitavad oodatult peaaegu konstantset 'Àritegevuse' aega, mis ei sÔltu vÔrgu suuruse kasvust ega ole eristuv erinevus jÔudluses.
Variant 2 nĂ€itab samuti konstanti, kuid veidi halvemad tulemused, olles praktiliselt 2 korda madalam variantide 3-5 suhtes. See ei saa mitte rÔÔmustada, sest see vastab teooriale – selles variandis on operatsioonide arv HBase'i sisse-/vĂ€ljal 2 korda suurem. See vĂ”ib olla kaudne tĂ”end, et meie testimisseade annab pĂ”himĂ”tteliselt head tĂ€psust.
Variant 1 osutub samuti oodatult kĂ”ige aeglasemaks ja nĂ€itab vĂ”rgu suuruse osas lineaarset aja kasvu, mis kulub ĂŒhe sĂ”bra lisamiseks.
Vaatame nĂŒĂŒd teise testi tulemusi.
Andmemudeli disaini omadused NoSQL jaoks
Variandid 3-5 kĂ€ituvad taas oodatult – konstantne aeg, mis ei sĂ”ltu vĂ”rgu suurusest. Variandid 1 ja 2 nĂ€itavad lineaarset aelae tĂ”usu vĂ”rgu suuruse suurenedes ja sarnast jĂ”udlust. Lisaks on variant 2 pisut aeglasem – ilmselt seetĂ”ttu, et tuleb lugeda ja töödelda tĂ€iendavat veergu "count", mis suurenedes n muutub silmatorkavamaks. Kuid ma siiski hoidun igasugustest jĂ€reldustest, kuna selle vĂ”rgu tĂ€psus on suhteliselt madal. Lisaks muutusid need suhted (milline variant, 1 vĂ”i 2, on kiirem) kĂ€ivituse kaupa (samas sĂ€ilitades sĂ”ltuvuse iseloomu ja "minnes ninapidi koos").

Ja viimane diagramm – testimise tulemused kustutamise kohta.

Andmemudeli disaini omadused NoSQL jaoks

Siin pole jĂ€lle ĂŒllatusi. Variandid 3-5 teostavad kustutamise konstantse aja jooksul.
Mis on huvitav, variandid 4 ja 5, erinevalt eelmistest stsenaariumitest, nĂ€itavad veidi halvemana jĂ”udlust vĂ”rreldes variant 3-ga. Ilmselt on rea kustutamine kulukam kui veeru kustutamine, mis on ĂŒldiselt mĂ”istlik.

Variandid 1 ja 2 nĂ€itavad ootuspĂ€raselt lineaarset aja kasvu. Samuti on variant 2 pidevalt aeglasem variant 1-st – tĂ€nu tĂ€iendavale sisend-vĂ€ljund operatsioonile veeru count "hooldamiseks".

Katse ĂŒldised jĂ€reldused:

  • Variandid 3-5 nĂ€itavad suuremat efektiivsust, kuna nad kasutavad HBase eeliseid; nende jĂ”udlus erineb ĂŒksteisest konstantse arvu vĂ”rra ja ei sĂ”ltu vĂ”rgu suurusest.
  • Variantide 4 ja 5 vahel ei olnud erinevust fikseeritud. Kuid see ei tĂ€henda, et variant 5 ei ole kasutamiseks sobiv. On ĂŒsna tĂ”enĂ€oline, et katse stsenaarium koos testseina tehniliste omadustega ei vĂ”imaldanud selle tuvastamist.
  • Aja kasvamise iseloom, mis on vajalik andmete "Ă€riprotsesside" teostamiseks, kinnitas ĂŒldiselt varasemate teoreetiliste jĂ€relduste kehtivust kĂ”igi variantide puhul.

Epilog

Tehtud karmid eksperimendid ei tohiks olla absoluutse tĂ”ena. On palju tegureid, mis ei olnud arvesse vĂ”etud ning mis moonutasid tulemusi (eriti hĂ€sti on need kĂ”ikumised nĂ€htavad graafikutes vĂ€ikese vĂ”rgu suuruse puhul). NĂ€iteks thrift'i töökiirus, mida kasutab happybase, loogika maht ja rakendamise viis, mis mul oli kirjutatud Pythonis (ei julge vĂ€ita, et kood oli optimaalselt kirjutatud ja kasutas kĂ”igi komponentide vĂ”imalusi efektiivselt), vĂ”imalikud HBase'i puhverdamise eripĂ€rad, Windows 10 taustategevus minu sĂŒlearvutis jne. Üldiselt vĂ”ib öelda, et kĂ”ik teoreetilised jĂ€reldused on eksperimentaalselt oma pĂ€devust nĂ€idanud. VĂ”i vĂ€hemalt ei olnud vĂ”imalik neid sel viisil „otsesel rĂŒnnakul” ĂŒmber lĂŒkata.

KokkuvĂ”ttes — soovitused kĂ”igile, kes alles alustavad andmemudelite kavandamist HBase'is: abstraheerige end varasemast kogemusest relatsiooniliste andmebaasidega ja pidage meeles „kĂŒmmet kĂ€sku”:

  • Kavandades alustame ĂŒlesandest ja andmete manipulatsiooni mustritest, mitte ainevaldkonna mudelist.
  • TĂ”hus juurdepÀÀs (ilma tĂ€ieliku tabeli skannimiseta) – ainult vĂ”tme kaudu.
  • Denormaliseerimine.
  • Erinevad read vĂ”ivad sisaldada erinevaid veerge.
  • DĂŒnaamiline veergude koosseis.

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