{"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\/cs\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle","title":{"rendered":"Cassandra. Jak nezem\u0159\u00edt, pokud zn\u00e1te jen Oracle","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj, Habr.<\/p>\n<p>Jmenuji se Misha Butrimov a cht\u011bl bych v\u00e1m \u0159\u00edct n\u011bco o Cassand\u0159e. M\u016fj p\u0159\u00edb\u011bh bude u\u017eite\u010dn\u00fd pro ty, kte\u0159\u00ed se nikdy nesetkali s NoSQL datab\u00e1zemi - m\u00e1 spoustu specifik a skryt\u00fdch probl\u00e9m\u016f, o kter\u00fdch je pot\u0159eba v\u011bd\u011bt. A pokud jste nic nevid\u011bli krom\u011b Oracle nebo jin\u00fdch rela\u010dn\u00edch datab\u00e1z\u00ed, tyto v\u011bci v\u00e1m zachr\u00e1n\u00ed \u017eivot.<\/p>\n<p>Co je na Cassand\u0159e dobr\u00e9? Je to NoSQL datab\u00e1ze navr\u017een\u00e1 bez jedin\u00e9 vhodn\u00e9ho bodu selh\u00e1n\u00ed, kter\u00e1 se dob\u0159e \u0161k\u00e1luje. Pokud pot\u0159ebujete p\u0159idat p\u00e1r terabajt\u016f k n\u011bjak\u00e9 datab\u00e1zi, jednodu\u0161e p\u0159id\u00e1te uzly do kruhu. Roz\u0161\u00ed\u0159it ji do dal\u0161\u00edho datov\u00e9ho centra? P\u0159id\u00e1te uzly do clusteru. Zv\u011bt\u0161it zpracov\u00e1van\u00fd RPS? P\u0159id\u00e1te uzly do clusteru. A naopak tak\u00e9 to funguje. <\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/qiwi\/blog\/486800\/\"><img decoding=\"async\" alt=\"Cassandra. Jak nezem\u0159\u00edt, pokud zn\u00e1te jen Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/a7d31475acbcf70581c296c712280c3d.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>V \u010dem je je\u0161t\u011b dobr\u00e1? V tom, \u017ee dok\u00e1\u017ee zpracov\u00e1vat velk\u00e9 mno\u017estv\u00ed dotaz\u016f. Ale co to znamen\u00e1 hodn\u011b? 10, 20, 30, 40 tis\u00edc dotaz\u016f za sekundu \u2013 to je m\u00e1lo. 100 tis\u00edc dotaz\u016f za sekundu na z\u00e1pis \u2013 tak\u00e9 m\u00e1lo. Existuj\u00ed spole\u010dnosti, kter\u00e9 tvrd\u00ed, \u017ee zvl\u00e1daj\u00ed 2 miliony dotaz\u016f za sekundu. Tak t\u011bm asi bude muset v\u011b\u0159it. <\/p>\n<p>A v z\u00e1sad\u011b m\u00e1 Cassandra jedno velk\u00e9 odli\u0161en\u00ed od rela\u010dn\u00edch dat \u2013 v\u016fbec na n\u011b nep\u0159ipom\u00edn\u00e1. A na to je velmi d\u016fle\u017eit\u00e9 nezapom\u00ednat.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Nen\u00ed v\u0161echno, co vypad\u00e1 stejn\u011b, to sam\u00e9.<\/h2>\n<p>\nJednou ke mn\u011b p\u0159i\u0161el kolega a zeptal se: \u201eTady je SQuL Cassandra query language, m\u00e1 select statement, m\u00e1 where, m\u00e1 and. P\u00ed\u0161u p\u00edsmena, a nefunguje to. Pro\u010d?\u201c. Pokud se k Cassand\u0159e p\u0159istupuje jako k rela\u010dn\u00ed datab\u00e1zi, je to ide\u00e1ln\u00ed zp\u016fsob, jak skon\u010dit s krut\u00fdm sebevra\u017edou. A j\u00e1 to nepropaguji, to je v Rusku zak\u00e1z\u00e1no. Jen prost\u011b navrhnete n\u011bco \u0161patn\u011b.<\/p>\n<p>Nap\u0159\u00edklad k n\u00e1m p\u0159ijde z\u00e1kazn\u00edk a \u0159\u00edk\u00e1: \u201ePoj\u010fme postavit datab\u00e1zi pro seri\u00e1ly, nebo datab\u00e1zi pro recepty. Budeme m\u00edt j\u00eddla s ingrediencemi nebo seznam seri\u00e1l\u016f a herc\u016f v nich.\u201c Radostn\u011b \u0159\u00edk\u00e1me: \u201ePoj\u010fme na to!\u201c. To jsou dva bajty poslat, p\u00e1r tabulek a je to hotov\u00e9, v\u0161e bude fungovat velmi rychle a spolehliv\u011b. A v\u0161echno je skv\u011bl\u00e9, dokud z\u00e1kazn\u00edci nep\u0159ijdou a ne\u0159eknou, \u017ee hospody\u0148ky cht\u011bj\u00ed \u0159e\u0161it i opa\u010dn\u00fd probl\u00e9m: maj\u00ed seznam ingredienc\u00ed a cht\u011bj\u00ed zjistit, kter\u00fd pokrm cht\u011bj\u00ed p\u0159ipravit. Jste mrtv\u00ed.<\/p>\n<p>V\u0161echno to proto, \u017ee Cassandra je hybridn\u00ed datab\u00e1ze: je to jak key-value, tak ukl\u00e1d\u00e1 data ve velk\u00fdch sloupc\u00edch. Pokud bychom mluvili jazykem Java nebo Kotlin, dalo by se to popsat takto:<\/p>\n<p><code>Map&lt;RowKey, SortedMap&gt;<\/code><\/p>\n<p>To znamen\u00e1 mapa, uvnit\u0159 kter\u00e9 je dal\u0161\u00ed se\u0159azen\u00e1 mapa. Prvn\u00edm kl\u00ed\u010dem k t\u00e9to map\u011b je Row key nebo Partition key \u2014 kl\u00ed\u010d pro partioning. Druh\u00fd kl\u00ed\u010d, kter\u00fd je kl\u00ed\u010dem k ji\u017e se\u0159azen\u00e9 map\u011b, je Clustering key.<\/p>\n<p>Abychom ilustrovali rozlo\u017een\u00ed datab\u00e1ze, nakresl\u00edme t\u0159i uzly. Nyn\u00ed je pot\u0159eba pochopit, jak rozlo\u017eit data na uzly. Proto\u017ee pokud v\u0161echno naskl\u00e1d\u00e1me do jednoho (m\u016f\u017ee jich b\u00fdt tis\u00edc, dv\u011b tis\u00edce, p\u011bt \u2014 kolik chcete), nen\u00ed to p\u0159\u00edli\u0161 o rozlo\u017een\u00ed. Proto pot\u0159ebujeme matematickou funkci, kter\u00e1 vr\u00e1t\u00ed \u010d\u00edslo. Prost\u011b \u010d\u00edslo, dlouh\u00fd int, kter\u00fd spad\u00e1 do n\u011bjak\u00e9ho rozsahu. A jeden uzel bude odpov\u00eddat za jeden rozsah, druh\u00fd za druh\u00fd, a n-t\u00fd za n-t\u00fd. <\/p>\n<p><img decoding=\"async\" alt=\"Cassandra. Jak nezem\u0159\u00edt, pokud zn\u00e1te jen Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/aab4d3cf1f7a552fb3c4c1eb528508c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nToto \u010d\u00edslo se vezme pomoc\u00ed hashovac\u00ed funkce, kter\u00e1 se aplikuje pr\u00e1v\u011b na to, co naz\u00fdv\u00e1me Partition key. To je ten sloupec, kter\u00fd se uv\u00e1d\u00ed v direktiv\u011b Primary key, a to je ten sloupec, kter\u00fd bude prvn\u00edm a nejz\u00e1kladn\u011bj\u0161\u00edm kl\u00ed\u010dem mapy. Ur\u010duje, na kter\u00fd uzel jak\u00e1 data spadnou. Tabulka se v Cassand\u0159e vytv\u00e1\u0159\u00ed t\u00e9m\u011b\u0159 se stejnou syntax\u00ed jako v 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 v tomto p\u0159\u00edpad\u011b se skl\u00e1d\u00e1 z jednoho sloupce, kter\u00fd je z\u00e1rove\u0148 kl\u00ed\u010dem pro partitioning.<\/p>\n<p>Jak se n\u00e1m u\u017eivatel\u00e9 rozd\u011bl\u00ed? \u010c\u00e1st spadne na jeden uzel, \u010d\u00e1st na druh\u00fd a \u010d\u00e1st na t\u0159et\u00ed. Vznik\u00e1 klasick\u00e1 hash tabulka, tak\u00e9 mapa, tak\u00e9 ve Pythonu \u2014 slovn\u00edk, a tak\u00e9 \u2014 jednoduch\u00e1 struktura Key value, ze kter\u00e9 m\u016f\u017eeme \u010d\u00edst v\u0161echny hodnoty, \u010d\u00edst a ps\u00e1t podle kl\u00ed\u010de.<\/p>\n<p><img decoding=\"async\" alt=\"Cassandra. Jak nezem\u0159\u00edt, pokud zn\u00e1te jen Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/61f365562dd5a39358a1ffcb7ff537eb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Select: kdy\u017e allow filtering se m\u011bn\u00ed na full scan, nebo jak to d\u011blat \u0161patn\u011b<\/h2>\n<p>\nPoj\u010fme napsat n\u011bjak\u00fd select statement: <code>select * from users where userid = <\/code>Je to podobn\u00e9 jako v Oracle: nap\u00ed\u0161eme select, vymez\u00edme podm\u00ednky a v\u0161echno funguje, u\u017eivatel\u00e9 se vyt\u00e1hnou. Ale pokud vybereme nap\u0159\u00edklad u\u017eivatele s ur\u010dit\u00fdm rokem narozen\u00ed, Cassandra se ozve, \u017ee nem\u016f\u017ee prov\u00e9st dotaz. Proto\u017ee v\u016fbec nic nev\u00ed o tom, jak m\u00e1me rozlo\u017een\u00e1 data o roce narozen\u00ed \u2014 kl\u00ed\u010d m\u00e1 definov\u00e1n pouze v jedn\u00e9 kolon\u011b. V tom okam\u017eiku \u0159\u00edk\u00e1: \u201eDob\u0159e, mohu tento dotaz st\u00e1le prov\u00e9st. P\u0159idejte allow filtering.\u201c P\u0159id\u00e1me direktivu, v\u0161echno funguje. A v tomto okam\u017eiku se stane n\u011bco hrozn\u00e9ho. <\/p>\n<p>Kdy\u017e zpracov\u00e1v\u00e1me testovac\u00ed data, v\u0161e je skv\u011bl\u00e9. Ale kdy\u017e provedete dotaz v produkci, kde m\u00e1me nap\u0159\u00edklad 4 miliony z\u00e1znam\u016f, nen\u00ed to v\u016fbec dobr\u00e9. Proto\u017ee allow filtering je direktiva, kter\u00e1 umo\u017e\u0148uje Cassand\u0159e shrom\u00e1\u017edit v\u0161echna data z t\u00e9to tabulky ze v\u0161ech uzl\u016f, v\u0161ech <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/cs\/kompaniya\/data-centers\/\"   title=\"datov\u00e1 centra\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4645\">datov\u00e1 centra<\/a> (pokud jich je v tomto klastru hodn\u011b), a a\u017e pot\u00e9 je filtrovat. To je ekvivalent Full Scan a t\u011b\u017eko by n\u011bkdo byl z n\u011bj nad\u0161en\u00fd. <\/p>\n<p>Kdybychom pot\u0159ebovali u\u017eivatele pouze podle identifik\u00e1tor\u016f, to by n\u00e1m vyhovovalo. Ale n\u011bkdy mus\u00edme ps\u00e1t jin\u00e9 dotazy a uplatnit dal\u0161\u00ed omezen\u00ed na v\u00fdb\u011br. Tak si vzpomeneme: to v\u0161echno je mapa, kter\u00e1 m\u00e1 kl\u00ed\u010d partition, ale uvnit\u0159 je to se\u0159azen\u00e1 mapa. <\/p>\n<p>A ta m\u00e1 tak\u00e9 kl\u00ed\u010d, kter\u00e9mu \u0159\u00edk\u00e1me Clustering Key. Tento kl\u00ed\u010d se skl\u00e1d\u00e1 z sloupc\u016f, kter\u00e9 vybereme, a na z\u00e1klad\u011b kter\u00fdch Cassandra ch\u00e1pe, jak budou data fyzicky se\u0159azena a ulo\u017eena na ka\u017ed\u00e9m uzlu. Tedy, pro n\u011bjak\u00fd Partition key Clustering key \u0159\u00edk\u00e1, jak p\u0159esn\u011b vlo\u017eit data do tohoto stromu, jak\u00e9 m\u00edsto tam zaberou.<\/p>\n<p>To je skute\u010dn\u00fd strom, kde se pouze vyvol\u00e1v\u00e1 kompar\u00e1tor, do kter\u00e9ho p\u0159ed\u00e1me sadu sloupc\u016f ve form\u011b objektu, a tak\u00e9 se specifikuje jako v\u00fd\u010det sloupc\u016f. <\/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>V\u0161imn\u011bte si direktivy Primary key, jej\u00ed\u017e prvn\u00ed argument (v na\u0161em p\u0159\u00edpad\u011b rok) v\u017edy p\u0159edstavuje Partition key. M\u016f\u017ee se skl\u00e1dat z jedn\u00e9 nebo v\u00edce sloupc\u016f, na tom nez\u00e1le\u017e\u00ed. Pokud je sloupc\u016f v\u00edce, je t\u0159eba je je\u0161t\u011b jednou um\u00edstit do z\u00e1vorek, aby preprocesor jazyka pochopil, \u017ee se jedn\u00e1 o Primary key, a za n\u00edm n\u00e1sleduj\u00ed v\u0161echny ostatn\u00ed sloupce \u2014 Clustering key. P\u0159itom budou v komparatoru p\u0159ed\u00e1v\u00e1ny v tom po\u0159ad\u00ed, v jak\u00e9m jdou. To znamen\u00e1, \u017ee prvn\u00ed sloupec je v\u00fdznamn\u011bj\u0161\u00ed, druh\u00fd \u2014 m\u00e9n\u011b v\u00fdznamn\u00fd a tak d\u00e1le. Jak nap\u0159\u00edklad p\u00ed\u0161eme pro datov\u00e9 t\u0159\u00eddy pole equals: uv\u00e1d\u00edme pole a pro n\u011b ur\u010dujeme, kter\u00e1 jsou v\u00edce a kter\u00e1 m\u00e9n\u011b. V Cassand\u0159e jsou to, tak \u0159\u00edkaj\u00edc, pole datov\u00e9 t\u0159\u00eddy, na kterou se aplikuje napsan\u00e9 equals.<\/p>\n<h2>Nastavujeme t\u0159\u00edd\u011bn\u00ed, p\u0159ikl\u00e1d\u00e1me omezen\u00ed<\/h2>\n<p>\nJe t\u0159eba m\u00edt na pam\u011bti, \u017ee po\u0159ad\u00ed t\u0159\u00edd\u011bn\u00ed (sestupn\u00e9, vzestupn\u00e9, nez\u00e1le\u017e\u00ed) se nastavuje ve stejnou chv\u00edli, kdy je vytvo\u0159en kl\u00ed\u010d, a pozd\u011bji jej nebude mo\u017en\u00e9 zm\u011bnit. Fyzicky ur\u010duje, jak budou data se\u0159azena a jak budou ulo\u017eena. Pokud bude pot\u0159eba zm\u011bnit Clustering key nebo po\u0159ad\u00ed t\u0159\u00edd\u011bn\u00ed, bude nutn\u00e9 vytvo\u0159it novou tabulku a p\u0159et\u00e1hnout do n\u00ed data. S ji\u017e existuj\u00edc\u00ed to nebude mo\u017en\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"Cassandra. Jak nezem\u0159\u00edt, pokud zn\u00e1te jen Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/25fc1ef7abb35c728fdc7381a201b79c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNaplnili jsme na\u0161i tabulku u\u017eivateli a vid\u011bli jsme, \u017ee se se\u0159adili nejprve podle roku narozen\u00ed a potom uvnit\u0159 na ka\u017ed\u00e9m uzlu podle platu a podle user ID. Nyn\u00ed m\u016f\u017eeme vyb\u00edrat s p\u0159ilo\u017een\u00fdmi omezen\u00edmi. <\/p>\n<p>Znovu se objevuje n\u00e1\u0161 funguj\u00edc\u00ed <code>where, and<\/code>, a u\u017eivatel\u00e9 se k n\u00e1m dost\u00e1vaj\u00ed, v\u0161echno je op\u011bt v po\u0159\u00e1dku. Ale pokud se pokus\u00edme pou\u017e\u00edt pouze \u010d\u00e1st Clustering key, a to tu m\u00e9n\u011b v\u00fdznamnou, Cassandra okam\u017eit\u011b upozorn\u00ed, \u017ee nem\u016f\u017ee ve na\u0161\u00ed map\u011b naj\u00edt m\u00edsto, kde tento objekt, jeho\u017e tato pole pro komparator jsou null, a ten, kter\u00fd jsme pr\u00e1v\u011b nastavili, \u2014 kde se nach\u00e1z\u00ed. Budu muset znovu st\u00e1hnout v\u0161echna data z tohoto uzlu a filtrovat je. A to je analogie Full Scan v r\u00e1mci uzlu, co\u017e je \u0161patn\u011b.<\/p>\n<h2>V jak\u00e9koli nejasn\u00e9 situaci vytv\u00e1\u0159ej novou tabulku<\/h2>\n<p>\nPokud chceme m\u00edt mo\u017enost vyb\u00edrat u\u017eivatele podle ID, v\u011bku nebo platu, co d\u011blat? Nic. Sta\u010d\u00ed pou\u017e\u00edt dv\u011b tabulky. Pokud budeme pot\u0159ebovat vyb\u00edrat u\u017eivatele t\u0159emi r\u016fzn\u00fdmi zp\u016fsoby \u2014 tabulek bude t\u0159i. Ty \u010dasy, kdy jsme \u0161et\u0159ili m\u00edsto na disku, u\u017e d\u00e1vno pominuly. To je nejlevn\u011bj\u0161\u00ed zdroj. Je mnohem levn\u011bj\u0161\u00ed ne\u017e doba odezvy, kter\u00e1 m\u016f\u017ee b\u00fdt pro u\u017eivatele zni\u010duj\u00edc\u00ed. U\u017eivatel bude mnohem spokojen\u011bj\u0161\u00ed, kdy\u017e n\u011bco dostane za sekundu ne\u017e za 10 minut.<\/p>\n<p>Vym\u011b\u0148ujeme nadbyte\u010dn\u011b zabran\u00e9 m\u00edsto, denormalizovan\u00e1 data za mo\u017enost dob\u0159e \u0161k\u00e1lovat a spolehliv\u011b fungovat. Klaster, kter\u00fd se skl\u00e1d\u00e1 ze t\u0159\u00ed datov\u00fdch center, p\u0159i\u010dem\u017e ka\u017ed\u00e9 m\u00e1 p\u011bt uzl\u016f, p\u0159i p\u0159ijateln\u00e9m \u00farovni uchov\u00e1v\u00e1n\u00ed dat (kdy se ur\u010dit\u011b nic neztrat\u00ed), dok\u00e1\u017ee p\u0159ekonat z\u00e1nik jednoho datov\u00e9ho centra \u00fapln\u011b. A je\u0161t\u011b po dva uzly v ka\u017ed\u00e9m z t\u011bch dvou zb\u00fdvaj\u00edc\u00edch. A a\u017e po tom za\u010dnou probl\u00e9my. To je docela dobr\u00e9 z\u00e1lohov\u00e1n\u00ed, to stoj\u00ed p\u00e1r-t\u0159i nav\u00edc SSD disk\u016f a procesor\u016f. Proto, abychom mohli pou\u017e\u00edt Cassandra, kter\u00e1 nen\u00ed SQL, nem\u00e1 vztahy, ciz\u00ed kl\u00ed\u010de, je pot\u0159eba zn\u00e1t jednoduch\u00e1 pravidla.<\/p>\n<p>Navrhujeme v\u0161e od dotazu. Hlavn\u00edmi nejsou data, ale jak s nimi bude aplikace pracovat. Pokud pot\u0159ebuje z\u00edsk\u00e1vat r\u016fzn\u00e1 data r\u016fzn\u00fdmi zp\u016fsoby, nebo stejn\u00e1 data r\u016fzn\u00fdmi zp\u016fsoby, mus\u00edme je ulo\u017eit tak, jak bude aplikaci pohodln\u00e9. Jinak se dostaneme do Full Scan a \u017e\u00e1dn\u00e9 v\u00fdhody Cassandra n\u00e1m nep\u0159inese.<\/p>\n<p>Denormalizovat data je norm\u00e1ln\u00ed. Zapom\u00edn\u00e1me na norm\u00e1ln\u00ed formy, u\u017e nem\u00e1me rela\u010dn\u00ed datab\u00e1ze. Ulo\u017e\u00edme n\u011bco 100kr\u00e1t, bude le\u017eet 100kr\u00e1t. Je to st\u00e1le levn\u011bj\u0161\u00ed, ne\u017e zpomalit. <\/p>\n<p>Vyb\u00edr\u00e1me kl\u00ed\u010de pro partitioning tak, aby se norm\u00e1ln\u011b rozd\u011blovaly. Nepot\u0159ebujeme, aby hash na\u0161ich kl\u00ed\u010d\u016f spadl do \u00fazk\u00e9ho rozsahu. To znamen\u00e1, \u017ee rok narozen\u00ed v p\u0159edchoz\u00edm p\u0159\u00edkladu \u2014 je \u0161patn\u00fd p\u0159\u00edklad. No, je dobr\u00fd, pokud m\u00e1me u\u017eivatele podle roku narozen\u00ed spr\u00e1vn\u011b rozlo\u017eeny, a \u0161patn\u00fd, pokud se jedn\u00e1 o \u017e\u00e1ky 5. t\u0159\u00eddy \u2014 tam to nebude dob\u0159e partitionovat. <\/p>\n<p>Se\u0159azen\u00ed se vyb\u00edr\u00e1 pouze jednou p\u0159i vytv\u00e1\u0159en\u00ed Clustering Key. Pokud je t\u0159eba jej zm\u011bnit, bude nutn\u00e9 p\u0159et\u00e1hnout na\u0161i tabulku s jin\u00fdm kl\u00ed\u010dem.<\/p>\n<p>A to nejd\u016fle\u017eit\u011bj\u0161\u00ed: pokud pot\u0159ebujeme 100 r\u016fzn\u00fdmi zp\u016fsoby z\u00edskat stejn\u00e1 data, budeme m\u00edt 100 r\u016fzn\u00fdch tabulek.<br \/>\n<br \/>Zdroj: <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.3 - 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\/cs\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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. Jak nezem\u0159\u00edt, kdy\u017e zn\u00e1te pouze Oracle | ProHoster","description":"Ahoj, Habr. Jmenuji se Mi\u0161a Butrimov a cht\u011bl bych v\u00e1m \u0159\u00edct n\u011bco o Cassand\u0159e.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/41081","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=41081"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/41081\/revisions"}],"predecessor-version":[{"id":164523,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/41081\/revisions\/164523"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/41082"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=41081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=41081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=41081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}