{"id":41081,"date":"2020-02-05T21:30:11","date_gmt":"2020-02-05T18:30:11","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle"},"modified":"2020-02-05T21:30:11","modified_gmt":"2020-02-05T18:30:11","slug":"cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle","title":{"rendered":"Cassandra. Si t\u00eb mos vdes\u00ebsh n\u00ebse e di vet\u00ebm Oracle","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>P\u00ebrsh\u00ebndetje, Habr.<\/p>\n<p>M\u00eb quajn\u00eb Misha Butrimov, dhe do t\u00eb doja t\u00eb flisja pak rreth Cassandra-s. Tregimi im do t\u00eb jet\u00eb i dobish\u00ebm p\u00ebr ata q\u00eb nuk kan\u00eb pasur asnj\u00ebher\u00eb p\u00ebrvoj\u00eb me bazat e t\u00eb dh\u00ebnave NoSQL, pasi ka shum\u00eb ve\u00e7ori dhe pengesa t\u00eb fshehura q\u00eb duhet t\u00eb njihni. Dhe n\u00ebse keni par\u00eb vet\u00ebm Oracle ose ndonj\u00eb baz\u00eb tjet\u00ebr relacional, k\u00ebto gj\u00ebra do t'ju shp\u00ebtojn\u00eb jet\u00ebn.<\/p>\n<p>\u00c7far\u00eb e b\u00ebn Cassandra kaq t\u00eb mir\u00eb? Ajo \u00ebsht\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash NoSQL, e projektuar pa asnj\u00eb pik\u00eb t\u00eb d\u00ebshtimit, q\u00eb shkall\u00ebzohet mir\u00eb. N\u00ebse keni nevoj\u00eb t\u00eb shtoni disa terabajt p\u00ebr ndonj\u00eb baz\u00eb, thjesht shtoni node n\u00eb rreth. D\u00ebshironi ta zgjeroni at\u00eb n\u00eb nj\u00eb qend\u00ebr t\u00eb dh\u00ebnash tjet\u00ebr? Shtoni node n\u00eb klaster. D\u00ebshironi t\u00eb rrisni RPS-n\u00eb tuaj? Shtoni node n\u00eb klaster. Punon gjithashtu n\u00eb t\u00eb kund\u00ebrt\u00ebn. <\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/qiwi\/blog\/486800\/\"><img decoding=\"async\" alt=\"Cassandra. Si t\u00eb mos vdes\u00ebsh n\u00ebse e di vet\u00ebm Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/a7d31475acbcf70581c296c712280c3d.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>\u00c7far\u00eb ka tjet\u00ebr ajo? Ajo \u00ebsht\u00eb e shk\u00eblqyer p\u00ebr t\u00eb procesuar shum\u00eb k\u00ebrkesa. Por shum\u00eb \u00ebsht\u00eb sa? 10, 20, 30, 40 mij\u00eb k\u00ebrkesa n\u00eb sekond\u00eb \u2014 kjo \u00ebsht\u00eb pak. 100 mij\u00eb k\u00ebrkesa n\u00eb sekond\u00eb p\u00ebr shkrim \u2014 gjithashtu. Ka kompani q\u00eb kan\u00eb th\u00ebn\u00eb se mbajn\u00eb deri n\u00eb 2 milion k\u00ebrkesa n\u00eb sekond\u00eb. K\u00ebtyre, ndoshta, duhet t'u besojm\u00eb. <\/p>\n<p>Dhe n\u00eb principe, Cassandra ka nj\u00eb dallim t\u00eb madh nga t\u00eb dh\u00ebnat relacional \u2014 ajo nuk i ngjan aspak atyre. Dhe kjo \u00ebsht\u00eb shum\u00eb e r\u00ebnd\u00ebsishme p\u00ebr t'u mbajtur mend.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Jo gjith\u00e7ka q\u00eb duket e nj\u00ebjt\u00eb, funksionon nj\u00ebsoj.<\/h2>\n<p>\nNj\u00ebher\u00eb erdhi nj\u00eb koleg dhe m\u00eb pyeti: \u00abK\u00ebtu \u00ebsht\u00eb gjuha e pyetjeve Cassandra (CQL), dhe ka nj\u00eb komand\u00eb select, ka nj\u00eb where, ka nj\u00eb and. Un\u00eb shkruaj shkronjat, dhe nuk punon. Pse?\u00bb. N\u00ebse e merrni Cassandra si nj\u00eb baz\u00eb t\u00eb dh\u00ebnash relacional, kjo \u00ebsht\u00eb nj\u00eb m\u00ebnyr\u00eb ideale p\u00ebr t\u00eb p\u00ebrfunduar jet\u00ebn tuaj n\u00eb nj\u00eb vet\u00ebvrasje t\u00eb dhunshme. Dhe nuk e propagandoj, \u00ebsht\u00eb e ndaluar n\u00eb Rusi. Thjesht do t\u00eb projektosh di\u00e7ka gabim.<\/p>\n<p>P\u00ebr shembull, nj\u00eb klient vjen dhe thot\u00eb: \u00abLe t\u00eb nd\u00ebrtojm\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash p\u00ebr serialet, ose nj\u00eb baz\u00eb t\u00eb dh\u00ebnash p\u00ebr nj\u00eb udh\u00ebzues receptesh. Do t\u00eb kemi atje pjata me produkte ose nj\u00eb list\u00eb serialesh dhe aktor\u00ebsh brenda\u00bb. Ne themi me g\u00ebzim: \u00abLe t\u00eb b\u00ebjm\u00eb!\u00bb Kjo \u00ebsht\u00eb dy byte p\u00ebr t\u00eb d\u00ebrguar, disa tabela dhe gjith\u00e7ka \u00ebsht\u00eb gati, do t\u00eb funksionoj\u00eb shum\u00eb shpejt, me besueshm\u00ebri. Dhe gjith\u00e7ka \u00ebsht\u00eb n\u00eb rregull derisa klient\u00ebt t\u00eb vin\u00eb dhe t\u00eb thon\u00eb se plakat e sht\u00ebpis\u00eb duan t\u00eb zgjidhin gjithashtu problemin e kund\u00ebrt: kan\u00eb nj\u00eb list\u00eb produktesh, dhe duan t\u00eb din\u00eb se cila pjat\u00eb duan t\u00eb gatuan. Ju jeni t\u00eb vdekur.<\/p>\n<p>E gjith\u00eb kjo sepse Cassandra \u00ebsht\u00eb nj\u00eb databaz\u00eb hibride: ajo \u00ebsht\u00eb nj\u00ebkoh\u00ebsisht si key-value dhe ruan t\u00eb dh\u00ebnat n\u00eb kolona t\u00eb gjera. N\u00ebse flasim n\u00eb gjuh\u00ebn Java ose Kotlin, mund ta p\u00ebrshkruajm\u00eb k\u00ebshtu:<\/p>\n<p><code>Map&lt;RowKey, SortedMap&gt;<\/code><\/p>\n<p>K\u00ebshtu q\u00eb kemi nj\u00eb map\u00eb, brenda s\u00eb cil\u00ebs ndodhet nj\u00eb map\u00eb tjet\u00ebr e renditur. \u00c7el\u00ebsi i par\u00eb i k\u00ebsaj mape \u00ebsht\u00eb Row key ose Partition key \u2014 \u00e7el\u00ebsi i partitimit. \u00c7el\u00ebsi i dyt\u00eb, i cili \u00ebsht\u00eb \u00e7el\u00ebsi p\u00ebr map\u00ebn e renditur, \u00ebsht\u00eb Clustering key.<\/p>\n<p>P\u00ebr t\u00eb ilustruar shp\u00ebrndarjen e databaz\u00ebs, le t\u00eb vizatojm\u00eb tre nod. Tani duhet t\u00eb kuptojm\u00eb se si t\u00eb shp\u00ebrndajm\u00eb t\u00eb dh\u00ebnat n\u00eb nod. Sepse n\u00ebse do t\u00eb fusnim gjith\u00e7ka n\u00eb nj\u00eb (ato mund t\u00eb jen\u00eb nj\u00eb mij\u00eb, dy mij\u00eb, pes\u00eb \u2014 sa t\u00eb doj\u00eb), kjo nuk \u00ebsht\u00eb shum\u00eb lidhur me shp\u00ebrndarjen. Prandaj, na nevojitet nj\u00eb funksion matematikor q\u00eb do t\u00eb kthente nj\u00eb num\u00ebr. Thjesht nj\u00eb num\u00ebr, nj\u00eb int t\u00eb gjat\u00eb, q\u00eb do t\u00eb bie n\u00eb ndonj\u00eb gam\u00eb. Dhe nj\u00eb nod do t\u00eb p\u00ebrgjigjet p\u00ebr nj\u00eb gam\u00eb, tjetra \u2014 p\u00ebr t\u00eb dyt\u00ebn, n-ta \u2014 p\u00ebr n-\u00eb. <\/p>\n<p><img decoding=\"async\" alt=\"Cassandra. Si t\u00eb mos vdes\u00ebsh n\u00ebse e di vet\u00ebm Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/aab4d3cf1f7a552fb3c4c1eb528508c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKy num\u00ebr merret n\u00ebp\u00ebrmjet nj\u00eb funksioni hash, i cili aplikohet pik\u00ebrisht n\u00eb at\u00eb q\u00eb quajm\u00eb Partition key. Ky \u00ebsht\u00eb ai kolona q\u00eb tregohet n\u00eb direktiv\u00ebn Primary key, dhe ky \u00ebsht\u00eb ai kolona q\u00eb do t\u00eb jet\u00eb \u00e7el\u00ebsi i par\u00eb dhe m\u00eb themelor i mape. Ai p\u00ebrcakton se cilat t\u00eb dh\u00ebna do t\u00eb shkojn\u00eb n\u00eb cil\u00ebn nod. Tabela krijohet n\u00eb Cassandra pothuajse me t\u00eb nj\u00ebjtin sintaks\u00eb si n\u00eb SQL: <\/p>\n<pre><code class=\"sql\">CREATE TABLE users (\n\tuser_id uuid,\n\tname text,\n\tyear int,\n\tsalary float,\n\tPRIMARY KEY(user_id)\n\n)\n<\/code><\/pre>\n<p>Primary key n\u00eb k\u00ebt\u00eb rast p\u00ebrb\u00ebhet nga nj\u00eb kolon\u00eb, dhe ajo \u00ebsht\u00eb gjithashtu \u00e7el\u00ebsi i partitimit.<\/p>\n<p>Si do t\u00eb shp\u00ebrndahen p\u00ebrdoruesit? Nj\u00eb pjes\u00eb do t\u00eb p\u00ebrfundoj\u00eb n\u00eb nj\u00eb nod, nj\u00eb pjes\u00eb n\u00eb tjetr\u00ebn, dhe nj\u00eb pjes\u00eb n\u00eb tret\u00ebn. Ajo q\u00eb rezulton \u00ebsht\u00eb nj\u00eb tabel\u00eb e zakonshme hash, e cila \u00ebsht\u00eb nj\u00eb map\u00eb, e cila n\u00eb Python \u00ebsht\u00eb nj\u00eb fjalor, po ashtu \u00ebsht\u00eb nj\u00eb struktur\u00eb e thjesht\u00eb Key-value, nga e cila mund t\u00eb lexojm\u00eb t\u00eb gjitha vlerat, t\u00eb lexojm\u00eb dhe t\u00eb shkruajm\u00eb sipas \u00e7el\u00ebsit.<\/p>\n<p><img decoding=\"async\" alt=\"Cassandra. Si t\u00eb mos vdes\u00ebsh n\u00ebse e di vet\u00ebm Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/61f365562dd5a39358a1ffcb7ff537eb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Select: kur allow filtering shnd\u00ebrrohet n\u00eb skanimin e plot\u00eb, ose si nuk duhet ta b\u00ebni<\/h2>\n<p>\nLe t\u00eb shkruajm\u00eb ndonj\u00eb deklarat\u00eb select: <code>select * from users where userid = <\/code>Duket se \u00ebsht\u00eb pik\u00ebrisht si n\u00eb Oracle: shkruajm\u00eb nj\u00eb select, caktojm\u00eb kushtet dhe gjith\u00e7ka funksionon, p\u00ebrdoruesit nxirren. Por n\u00ebse zgjedhim, p\u00ebr shembull, nj\u00eb p\u00ebrdorues me nj\u00eb vit t\u00eb caktuar lindjeje, Cassandra ankohet q\u00eb nuk mund ta ekzekutoj\u00eb k\u00ebrkes\u00ebn. Sepse ajo nuk di asgj\u00eb rreth ndarjes s\u00eb t\u00eb dh\u00ebnave p\u00ebr vitin e lindjes \u2014 si\u00e7 tregon, si \u00e7el\u00ebs ka vet\u00ebm nj\u00eb kolon\u00eb. At\u00ebher\u00eb ajo thot\u00eb: \"Mir\u00eb, mund t\u00eb vazhdoj t\u00eb ekzekutoj k\u00ebt\u00eb k\u00ebrkes\u00eb. Shtoni allow filtering\". Ne e shtojm\u00eb drejktiv\u00ebn, gjith\u00e7ka funksionon. Dhe n\u00eb at\u00eb moment ndodh nj\u00eb e keqe. <\/p>\n<p>Kur e testojm\u00eb me t\u00eb dh\u00ebna testuese, gjith\u00e7ka \u00ebsht\u00eb n\u00eb rregull. Por kur ekzekutoni nj\u00eb k\u00ebrkes\u00eb n\u00eb prodhim, ku kemi, p\u00ebr shembull, 4 milion regjistra, at\u00ebher\u00eb gjith\u00e7ka nuk shkon shum\u00eb mir\u00eb. Sepse allow filtering \u2014 \u00ebsht\u00eb nj\u00eb drejktiv\u00eb q\u00eb i lejon Cassandra t\u00eb mbledh\u00eb t\u00eb gjitha t\u00eb dh\u00ebnat nga kjo tabel\u00eb nga t\u00eb gjitha nodet, t\u00eb gjitha <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sq\/kompaniya\/data-centers\/\"   title=\"qendrat e t\u00eb dh\u00ebnave\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4645\">qendrat e t\u00eb dh\u00ebnave<\/a> (n\u00ebse ka shum\u00eb n\u00eb k\u00ebt\u00eb grup), dhe pastaj filtron. Kjo \u00ebsht\u00eb si nj\u00eb Full Scan, dhe me siguri askush nuk \u00ebsht\u00eb i k\u00ebnaqur me t\u00eb. <\/p>\n<p>N\u00ebse do na duheshin p\u00ebrdoruesit vet\u00ebm sipas identifikator\u00ebve, do na p\u00ebrshtatej. Por ndonj\u00ebher\u00eb na nevojitet t\u00eb shkruajm\u00eb k\u00ebrkesa t\u00eb tjera dhe t\u00eb vendosim kufizime t\u00eb tjera n\u00eb ndarje. Prandaj, p\u00ebrkujtojm\u00eb: kjo \u00ebsht\u00eb nj\u00eb map\u00eb, e cila ka nj\u00eb \u00e7el\u00ebs ndar\u00ebs, por brenda saj \u2014 \u00ebsht\u00eb nj\u00eb map\u00eb e renditur. <\/p>\n<p>Dhe ajo gjithashtu ka nj\u00eb \u00e7el\u00ebs, t\u00eb cilin e quajm\u00eb Clustering Key. Ky \u00e7el\u00ebs, i cili, nga ana tjet\u00ebr, p\u00ebrb\u00ebhet nga kolonat q\u00eb ne do t\u00eb zgjedhim, me t\u00eb cilin Cassandra kupton se si t\u00eb dh\u00ebnat e saj do t\u00eb renditen fizikisht dhe do t\u00eb vendosen n\u00eb \u00e7do nod\u00eb. Pra, p\u00ebr nj\u00eb \u00e7el\u00ebs ndar\u00ebs, Clustering Key do t\u00eb tregoj\u00eb se si sakt\u00ebsisht t\u00eb dh\u00ebnat t\u00eb futen n\u00eb k\u00ebt\u00eb pem\u00eb, \u00e7far\u00eb vendi do t\u00eb z\u00ebn\u00eb aty.<\/p>\n<p>\u00cbsht\u00eb v\u00ebrtet nj\u00eb pem\u00eb, aty thjesht thirret nj\u00eb komparator, n\u00eb t\u00eb cilin ne kalojm\u00eb nj\u00eb set t\u00eb caktuar kolonash si objekt, dhe ai gjithashtu caktuar n\u00eb form\u00ebn e enumerimit t\u00eb kolonave. <\/p>\n<pre><code class=\"sql\">CREATE TABLE users_by_year_salary_id (\n\tuser_id uuid,\n\tname text,\n\tyear int,\n\tsalary float,\n\tPRIMARY KEY((year), salary, user_id)\n<\/code><\/pre>\n<p>Kujdesi n\u00eb lidhje me direktiv\u00ebn Primary key, argumenti i saj i par\u00eb (n\u00eb rastin ton\u00eb viti) gjithmon\u00eb shkon si Partition key. Ai mund t\u00eb p\u00ebrb\u00ebhet nga nj\u00eb ose m\u00eb shum\u00eb kolona, kjo nuk ka r\u00ebnd\u00ebsi. N\u00ebse ka disa kolona, duhet ta vendosim p\u00ebrs\u00ebri n\u00eb kllapa, n\u00eb m\u00ebnyr\u00eb q\u00eb preprocessori i gjuh\u00ebs t\u00eb kuptoj\u00eb se kjo \u00ebsht\u00eb pik\u00ebrisht Primary key, nd\u00ebrsa pas saj jan\u00eb t\u00eb gjitha kolonat e tjera \u2014 Clustering key. N\u00eb k\u00ebt\u00eb rast, ato do t\u00eb kalohen n\u00eb komparator n\u00eb rendin n\u00eb t\u00eb cilin jan\u00eb. K\u00ebshtu, kolona e par\u00eb \u00ebsht\u00eb m\u00eb e r\u00ebnd\u00ebsishme, e dyta \u2014 m\u00eb pak e r\u00ebnd\u00ebsishme dhe k\u00ebshtu me radh\u00eb. Ashtu si\u00e7 shkruajm\u00eb p\u00ebr data classes, p\u00ebr shembull, fushat equals: rendisim fushat, dhe p\u00ebr to shkruajm\u00eb se cilat jan\u00eb m\u00eb t\u00eb m\u00ebdha dhe cilat m\u00eb t\u00eb vogla. N\u00eb Cassandra, k\u00ebto jan\u00eb, n\u00eb m\u00ebnyr\u00eb t\u00eb kushtezuar, fushat e data class, p\u00ebr t\u00eb cilin do t\u00eb aplikohet equals-i i shkruar p\u00ebr t\u00eb.<\/p>\n<h2>Vendosim renditjen, vendosim kufizimet<\/h2>\n<p>\nDuhet t\u00eb mbani mend se rendi i renditjes (N decreasing, N increasing, nuk ka r\u00ebnd\u00ebsi) p\u00ebrcaktohet n\u00eb momentin kur krijohet \u00e7el\u00ebsi, dhe nuk do t\u00eb jet\u00eb e mundur ta ndryshoni at\u00eb m\u00eb von\u00eb. Ai fizikisht p\u00ebrcakton se si do t\u00eb klasifikohen t\u00eb dh\u00ebnat dhe se si do t\u00eb jen\u00eb t\u00eb vendosura. N\u00ebse do t\u00eb duhet t\u00eb ndryshoni Clustering key ose rendin e renditjes, do t\u00eb duhet t\u00eb krijoni nj\u00eb tabel\u00eb t\u00eb re dhe t\u00eb derdhni t\u00eb dh\u00ebnat n\u00eb t\u00eb. Nuk do t\u00eb mundesh k\u00ebshtu me tabel\u00ebn ekzistuese.<\/p>\n<p><img decoding=\"async\" alt=\"Cassandra. Si t\u00eb mos vdes\u00ebsh n\u00ebse e di vet\u00ebm Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/25fc1ef7abb35c728fdc7381a201b79c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNe e mbush\u00ebm tabel\u00ebn ton\u00eb me p\u00ebrdorues dhe p\u00ebrcaktuam se ata jan\u00eb organizuar n\u00eb nj\u00eb rreth fillimisht sipas vitit t\u00eb lindjes, dhe m\u00eb pas brenda \u00e7do node sipas pag\u00ebs dhe ID-s\u00eb s\u00eb p\u00ebrdoruesit. Tani mund t\u00eb selektojm\u00eb, duke vendosur kufizime. <\/p>\n<p>Rivjen prap\u00eb funksionimi yn\u00eb <code>ku, dhe<\/code>, dhe p\u00ebrdoruesit na del, dhe gjith\u00e7ka \u00ebsht\u00eb mir\u00eb p\u00ebrs\u00ebri. Por n\u00ebse p\u00ebrpiqemi t\u00eb p\u00ebrdorim vet\u00ebm nj\u00eb pjes\u00eb t\u00eb Clustering key, dhe ajo \u00ebsht\u00eb m\u00eb pak e r\u00ebnd\u00ebsishme, Cassandra do t\u00eb protestoj\u00eb menj\u00ebher\u00eb se nuk mund t\u00eb gjej\u00eb n\u00eb hart\u00ebn ton\u00eb vendin ku ndodhet ky objekt, i cili ka k\u00ebto fusha p\u00ebr komparimin null, dhe ky, q\u00eb sapo e p\u00ebrcaktuam, \u2014 ku ndodhet. M\u00eb duhet t\u00eb ngre p\u00ebrs\u00ebri t\u00eb gjitha t\u00eb dh\u00ebnat nga kjo nod\u00eb dhe t'i filtroj ato. Dhe kjo \u00ebsht\u00eb analoge me Full Scan brenda nod\u00ebs, \u00ebsht\u00eb e keqe.<\/p>\n<h2>N\u00eb \u00e7do situat\u00eb t\u00eb paqart\u00eb krijoni nj\u00eb tabel\u00eb t\u00eb re<\/h2>\n<p>\nN\u00ebse duam t\u00eb jemi n\u00eb gjendje t\u00eb nxjerrim p\u00ebrdoruesit sipas ID-s\u00eb, mosh\u00ebs, ose pag\u00ebs, \u00e7far\u00eb t\u00eb b\u00ebjm\u00eb? Asgj\u00eb. Thjesht p\u00ebrdorim dy tabela. N\u00ebse do t\u00eb duhet t\u00eb nxjerrim p\u00ebrdoruesit n\u00eb tri m\u00ebnyra t\u00eb ndryshme \u2014 do t\u00eb kemi tre tabela. Koh\u00ebt kur kursonim hap\u00ebsir\u00ebn n\u00eb disqet kan\u00eb kaluar. Ky \u00ebsht\u00eb burimi m\u00eb i lir\u00eb. Ai kushton shum\u00eb m\u00eb pak se koha e p\u00ebrgjigjes, e cila mund t\u00eb jet\u00eb fatale p\u00ebr p\u00ebrdoruesin. P\u00ebrdoruesit ndihen m\u00eb mir\u00eb t\u00eb marrin di\u00e7ka brenda nj\u00eb sekonde sesa brenda 10 minutash.<\/p>\n<p>Ne shk\u00ebmbejm\u00eb hap\u00ebsir\u00ebn e tep\u00ebrt q\u00eb z\u00ebn\u00eb t\u00eb dh\u00ebnat denormalizuara p\u00ebr mund\u00ebsin\u00eb e nj\u00eb shkall\u00ebzimi t\u00eb mir\u00eb dhe funksionimi t\u00eb sigurt. S\u00eb v\u00ebrtet\u00eb, nj\u00eb kluster q\u00eb p\u00ebrb\u00ebhet nga tre qendra t\u00eb dh\u00ebnash, secila me pes\u00eb nod\u00eb, me nj\u00eb nivel t\u00eb pranuesh\u00ebm t\u00eb ruajtjes s\u00eb t\u00eb dh\u00ebnave (kur nuk humbet asgj\u00eb), \u00ebsht\u00eb n\u00eb gjendje t\u00eb mbijetoj\u00eb shkat\u00ebrrimin e nj\u00eb qendre t\u00eb dh\u00ebnash t\u00ebr\u00ebsisht. Dhe akoma dy nod\u00eb n\u00eb secil\u00ebn nga dy qendrat e tjera. Dhe vet\u00ebm pas k\u00ebsaj do t\u00eb fillojn\u00eb problemet. Kjo \u00ebsht\u00eb nj\u00eb rezervim mjaft i mir\u00eb, i cili kushton disa SSD t\u00eb tep\u00ebrta dhe procese. Prandaj, p\u00ebr t\u00eb p\u00ebrdorur Cassandra, e cila nuk \u00ebsht\u00eb SQL asnj\u00ebher\u00eb, n\u00eb t\u00eb cil\u00ebn nuk ka marr\u00ebdh\u00ebnie, \u00e7el\u00ebsa t\u00eb jasht\u00ebm, duhet t\u00eb dihet rregullat e thjeshta.<\/p>\n<p>Ne e projektojm\u00eb gjith\u00e7ka nga k\u00ebrkesa. Ajo q\u00eb \u00ebsht\u00eb e r\u00ebnd\u00ebsishme nuk jan\u00eb t\u00eb dh\u00ebnat, por si aplikacioni do t\u00eb punoj\u00eb me to. N\u00ebse ai duhet t\u00eb marr\u00eb t\u00eb dh\u00ebna t\u00eb ndryshme n\u00eb m\u00ebnyra t\u00eb ndryshme apo t\u00eb nj\u00ebjtat t\u00eb dh\u00ebna n\u00eb m\u00ebnyra t\u00eb ndryshme, ne duhet t'i vendosim ato n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb jet\u00eb e qart\u00eb p\u00ebr aplikacionin. N\u00eb t\u00eb kund\u00ebrt, do t\u00eb bie n\u00eb Full Scan dhe asnj\u00eb avantazh nga Cassandra nuk do t\u00eb na ndihmoj\u00eb.<\/p>\n<p>Denormalizimi i t\u00eb dh\u00ebnave \u00ebsht\u00eb norma. Harrojm\u00eb p\u00ebr format normale, tani nuk kemi m\u00eb baza rrelacionale. N\u00ebse vendosim di\u00e7ka 100 her\u00eb, ajo do t\u00eb jet\u00eb aty 100 her\u00eb. Kjo \u00ebsht\u00eb gjithsesi m\u00eb e lir\u00eb sesa t\u00eb ngadal\u00ebsohemi. <\/p>\n<p>Zgjidhim \u00e7el\u00ebsat p\u00ebr partitimin n\u00eb m\u00ebnyr\u00eb q\u00eb ato t\u00eb shp\u00ebrndahen normalisht. Nuk na nevojitet q\u00eb hash i \u00e7el\u00ebsave tan\u00eb t\u00eb bjer\u00eb n\u00eb nj\u00eb interval t\u00eb ngusht\u00eb. Pra, viti i lindjes n\u00eb shembullin e m\u00ebsip\u00ebrm \u2014 \u00ebsht\u00eb nj\u00eb shembull jo i mir\u00eb. N\u00eb t\u00eb v\u00ebrtet\u00eb, ai \u00ebsht\u00eb i mir\u00eb, n\u00ebse p\u00ebrdoruesit jan\u00eb t\u00eb shp\u00ebrndar\u00eb normalisht sipas vitit t\u00eb lindjes, dhe i keq, n\u00ebse flasim p\u00ebr nx\u00ebn\u00ebsit e klas\u00ebs s\u00eb pest\u00eb \u2014 atje nuk do t\u00eb jet\u00eb aq mir\u00eb p\u00ebr partitimin. <\/p>\n<p>Sortezimi zgjidhet nj\u00eb her\u00eb n\u00eb faz\u00ebn e krijimit t\u00eb Clustering Key. N\u00ebse nevojitet ta ndryshojm\u00eb at\u00eb, do t\u00eb duhet t\u00eb derdhim tabel\u00ebn ton\u00eb me nj\u00eb \u00e7el\u00ebs tjet\u00ebr.<\/p>\n<p>Dhe m\u00eb e r\u00ebnd\u00ebsishmja: n\u00ebse na nevojiten 100 m\u00ebnyra t\u00eb ndryshme p\u00ebr t\u00eb marr\u00eb t\u00eb nj\u00ebjtat t\u00eb dh\u00ebna, do t\u00eb kemi 100 tabela t\u00eb ndryshme.<br \/>\n<br \/>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/qiwi\/blog\/486800\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0438\u0448\u0430 \u0411\u0443\u0442\u0440\u0438\u043c\u043e\u0432, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e Cassandra. \u041c\u043e\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0442\u0435\u043c, \u043a\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 NoSQL-\u0431\u0430\u0437\u0430\u043c\u0438, \u2014 \u0443 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u0435\u0439, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c. \u0418 \u0435\u0441\u043b\u0438 \u043a\u0440\u043e\u043c\u0435 Oracle \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0432\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u0438\u0434\u0435\u043b\u0438, \u044d\u0442\u0438 \u0432\u0435\u0449\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":41082,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-41081","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0438\u0448\u0430 \u0411\u0443\u0442\u0440\u0438\u043c\u043e\u0432, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e Cassandra.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Cassandra. \u041a\u0430\u043a \u043d\u0435 \u0443\u043c\u0435\u0440\u0435\u0442\u044c, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u0448\u044c \u0442\u043e\u043b\u044c\u043a\u043e Oracle | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0438\u0448\u0430 \u0411\u0443\u0442\u0440\u0438\u043c\u043e\u0432, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e Cassandra.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-05T18:30:11+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-05T18:30:11+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Cassandra. Si t\u00eb mos vdes\u00ebsh n\u00ebse di vet\u00ebm p\u00ebr Oracle | ProHoster","description":"P\u00ebrsh\u00ebndetje, Habr. Un\u00eb quhem Misha Butrimov, doja t\u00eb flisja pak p\u00ebr Cassandra.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Cassandra. \u041a\u0430\u043a \u043d\u0435 \u0443\u043c\u0435\u0440\u0435\u0442\u044c, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u0448\u044c \u0442\u043e\u043b\u044c\u043a\u043e Oracle | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0438\u0448\u0430 \u0411\u0443\u0442\u0440\u0438\u043c\u043e\u0432, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e Cassandra.","og:url":"https:\/\/prohoster.info\/sq\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-05T18:30:11+00:00","article:modified_time":"2020-02-05T18:30:11+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"41081","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 00:24:40","updated":"2022-09-30 11:42:25","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/41081","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=41081"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/41081\/revisions"}],"predecessor-version":[{"id":164523,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/41081\/revisions\/164523"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/41082"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=41081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=41081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=41081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}