{"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\/pl\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle","title":{"rendered":"Cassandra. Jak nie umrze\u0107, gdy znasz tylko Oracle","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107, Habr.<\/p>\n<p>Nazywam si\u0119 Misha Butrimov i chcia\u0142bym opowiedzie\u0107 troch\u0119 o Cassandrze. Moja opowie\u015b\u0107 b\u0119dzie przydatna dla tych, kt\u00f3rzy nigdy nie mieli do czynienia z bazami NoSQL \u2013 ma ona wiele szczeg\u00f3lnych cech i pu\u0142apek, o kt\u00f3rych warto wiedzie\u0107. A je\u015bli widzieli\u015bcie tylko Oracle lub inn\u0105 relacyjn\u0105 baz\u0119, te informacje uratuj\u0105 wam \u017cycie.<\/p>\n<p>Co jest dobre w Cassandrze? To baza danych NoSQL, zaprojektowana bez pojedynczego punktu awarii, kt\u00f3ra doskonale si\u0119 skaluje. Je\u015bli potrzebujesz doda\u0107 kilka terabajt\u00f3w dla jakiej\u015b bazy, po prostu dodajesz w\u0119z\u0142y do pier\u015bcienia. Chcesz rozszerzy\u0107 j\u0105 o kolejny centrum danych? Dodajesz w\u0119z\u0142y do klastra. Zwi\u0119kszy\u0107 przetwarzane RPS? Dodajesz w\u0119z\u0142y do klastra. W drug\u0105 stron\u0119 te\u017c dzia\u0142a. <\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/qiwi\/blog\/486800\/\"><img decoding=\"async\" alt=\"Cassandra. Jak nie umrze\u0107, gdy znasz tylko Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/a7d31475acbcf70581c296c712280c3d.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Na co jeszcze jest dobra? Na obs\u0142ug\u0119 wielu zapyta\u0144. Ale ile to du\u017co? 10, 20, 30, 40 tysi\u0119cy zapyta\u0144 na sekund\u0119 \u2013 to niewiele. 100 tysi\u0119cy zapyta\u0144 na sekund\u0119 do zapisu \u2013 te\u017c niewiele. S\u0105 firmy, kt\u00f3re m\u00f3wi\u0142y, \u017ce utrzymuj\u0105 2 mln zapyta\u0144 na sekund\u0119. Wydaje mi si\u0119, \u017ce musz\u0105 im uwierzy\u0107. <\/p>\n<p>I zasadniczo Cassandra ma jedn\u0105 du\u017c\u0105 r\u00f3\u017cnic\u0119 w por\u00f3wnaniu do danych relacyjnych \u2013 w\u0142a\u015bciwie w og\u00f3le na nie nie wygl\u0105da. I o tym warto pami\u0119ta\u0107.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Nie wszystko, co wygl\u0105da tak samo, dzia\u0142a tak samo.<\/h2>\n<p>\nKiedy\u015b przyszed\u0142 do mnie kolega i zapyta\u0142: \u201eOto SQL, j\u0119zyk zapyta\u0144 Cassandry, a w nim jest instrukcja select, jest where, jest and. Pisz\u0119 litery i nie dzia\u0142a. Dlaczego?\u201d. Je\u015bli podejdziesz do Cassandry jak do relacyjnej bazy danych, to idealny spos\u00f3b na zako\u0144czenie \u017cycia brutalnym samob\u00f3jstwem. I nie propaguj\u0119 tego, w Rosji jest to zabronione. Po prostu zaprojektujesz co\u015b \u017ale.<\/p>\n<p>Na przyk\u0142ad przychodzi do nas klient i m\u00f3wi: \u201eZbudujmy baz\u0119 danych dla seriali, albo baz\u0119 danych dla katalogu przepis\u00f3w. B\u0119d\u0105 tam potrawy z produktami albo lista seriali i aktor\u00f3w w nim\u201d. My rado\u015bnie m\u00f3wimy: \u201eZr\u00f3bmy to!\u201d. To dwa bajty do przes\u0142ania, par\u0119 tabel i wszystko gotowe, b\u0119dzie dzia\u0142a\u0107 bardzo szybko, niezawodnie. I wszystko jest wspaniale, a\u017c klienci nie przychodz\u0105 i nie m\u00f3wi\u0105, \u017ce gospodynie domowe rozwi\u0105zuj\u0105 jeszcze odwrotny problem: maj\u0105 list\u0119 produkt\u00f3w i chc\u0105 wiedzie\u0107, kt\u00f3re danie chc\u0105 przygotowa\u0107. Jeste\u015b martwy.<\/p>\n<p>Wszystko dlatego, \u017ce Cassandra to hybrydowa baza danych: jest jednocze\u015bnie typu key value i przechowuje dane w szerokich kolumnach. M\u00f3wi\u0105c j\u0119zykiem Javy lub Kotlina, mo\u017cna opisa\u0107 to w ten spos\u00f3b:<\/p>\n<p><code>Map&lt;RowKey, SortedMap&gt;<\/code><\/p>\n<p>To znaczy, mapa, w kt\u00f3rej znajduje si\u0119 r\u00f3wnie\u017c posortowana mapa. Pierwszym kluczem do tej mapy jest Row key lub Partition key \u2014 klucz partycjonowania. Drugim kluczem, kt\u00f3ry jest kluczem do ju\u017c posortowanej mapy, jest Clustering key.<\/p>\n<p>Aby zilustrowa\u0107 rozproszono\u015b\u0107 bazy danych, narysujemy trzy w\u0119z\u0142y. Teraz trzeba zrozumie\u0107, jak roz\u0142o\u017cy\u0107 dane na w\u0119z\u0142ach. Poniewa\u017c je\u015bli w\u0142o\u017cymy wszystko do jednego (mo\u017ce ich by\u0107 tysi\u0105c, dwa tysi\u0105ce, pi\u0119\u0107 \u2014 ile tylko zechcesz), to nie bardzo chodzi o rozproszono\u015b\u0107. Dlatego potrzebujemy funkcji matematycznej, kt\u00f3ra zwraca liczb\u0119. Po prostu liczb\u0119, d\u0142ugi int, kt\u00f3ry b\u0119dzie mie\u015bci\u0142 si\u0119 w jakim\u015b zakresie. I jeden w\u0119ze\u0142 b\u0119dzie odpowiada\u0142 za jeden zakres, drugi \u2014 za drugi, a n-ty \u2014 za n-ty. <\/p>\n<p><img decoding=\"async\" alt=\"Cassandra. Jak nie umrze\u0107, gdy znasz tylko Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/aab4d3cf1f7a552fb3c4c1eb528508c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLiczba ta jest uzyskiwana za pomoc\u0105 funkcji haszuj\u0105cej, kt\u00f3ra jest stosowana w\u0142a\u015bnie do tego, co nazywamy Partition key. To ta kolumna, kt\u00f3ra jest wskazana w dyrektywie Primary key i to ta kolumna, kt\u00f3ra b\u0119dzie pierwszym i g\u0142\u00f3wnym kluczem mapy. Okre\u015bla, na jaki w\u0119ze\u0142 trafi\u0105 jakie dane. Tabela w Cassandrze jest tworzona prawie z takim samym sk\u0142adniowym jak w 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 w tym przypadku sk\u0142ada si\u0119 z jednej kolumny, kt\u00f3ra jest r\u00f3wnie\u017c kluczem partycjonowania.<\/p>\n<p>Jak u\u0142o\u017cymy u\u017cytkownik\u00f3w? Cz\u0119\u015b\u0107 trafi na jeden w\u0119ze\u0142, cz\u0119\u015b\u0107 \u2014 na drugi, a cz\u0119\u015b\u0107 \u2014 na trzeci. Powstaje zwyk\u0142a tabela haszuj\u0105ca, czyli mapa, kt\u00f3ra w Pythonie jest s\u0142ownikiem, a tak\u017ce prost\u0105 struktur\u0105 Key value, z kt\u00f3rej mo\u017cemy odczytywa\u0107 wszystkie warto\u015bci, czyta\u0107 i zapisywa\u0107 po kluczu.<\/p>\n<p><img decoding=\"async\" alt=\"Cassandra. Jak nie umrze\u0107, gdy znasz tylko Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/61f365562dd5a39358a1ffcb7ff537eb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Select: kiedy allow filtering zamienia si\u0119 w pe\u0142ne skanowanie, czyli jak nie nale\u017cy tego robi\u0107<\/h2>\n<p>\nNapiszmy jaki\u015b select statement: <code>select * from users where userid = <\/code>. Wygl\u0105da to troch\u0119 jak w Oracle: piszemy select, podajemy warunki i wszystko dzia\u0142a, u\u017cytkownicy s\u0105 pobierani. Ale je\u015bli na przyk\u0142ad wybierzemy u\u017cytkownika z okre\u015blonym rokiem urodzenia, Cassandra narzeka, \u017ce nie mo\u017ce wykona\u0107 zapytania. Bo tak naprawd\u0119 nic nie wie o tym, jak s\u0105 u nas rozdzielane dane o roku urodzenia \u2014 jako klucz jest wskazana tylko jedna kolumna. Wtedy m\u00f3wi: \u201eDobrze, mog\u0119 nadal wykona\u0107 to zapytanie. Dodajcie allow filtering\u201d. Dodajemy dyrektyw\u0119, wszystko dzia\u0142a. I w tym momencie dzieje si\u0119 co\u015b strasznego. <\/p>\n<p>Kiedy testujemy na danych testowych, wszystko jest w porz\u0105dku. A kiedy wykonujecie zapytanie w produkcji, gdzie mamy na przyk\u0142ad 4 miliony rekord\u00f3w, to nie jest zbyt dobrze. Poniewa\u017c allow filtering \u2014 to dyrektywa, kt\u00f3ra pozwala Cassandrze zebra\u0107 wszystkie dane z tej tabeli ze wszystkich w\u0119z\u0142\u00f3w, wszystkich <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pl\/kompaniya\/data-centers\/\"   title=\"data-centra\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4645\">data-centra<\/a> (je\u015bli jest ich wiele w tym klastrze), a dopiero potem je filtrowa\u0107. To analogiczne do Full Scan, i w\u0105tpi\u0119, \u017ceby ktokolwiek by\u0142 z tego zadowolony. <\/p>\n<p>Gdyby\u015bmy potrzebowali tylko u\u017cytkownik\u00f3w wed\u0142ug identyfikator\u00f3w, to by nas zadowoli\u0142o. Ale czasami musimy pisa\u0107 inne zapytania i nak\u0142ada\u0107 inne ograniczenia na selekcj\u0119. Dlatego przypominamy sobie: to wszystko to mapa, kt\u00f3ra ma klucz partycjonowania, ale w jej wn\u0119trzu \u2014 posortowana mapa. <\/p>\n<p>I ona te\u017c ma klucz, kt\u00f3ry nazywamy Clustering Key. Ten klucz, kt\u00f3ry z kolei sk\u0142ada si\u0119 z kolumn, kt\u00f3re wybierzemy, za pomoc\u0105 kt\u00f3rych Cassandra rozumie, jak jej dane b\u0119d\u0105 fizycznie posortowane i b\u0119d\u0105 le\u017ca\u0142y na ka\u017cdym w\u0119\u017ale. To znaczy, dla jakiego\u015b klucza partycjonowania, Clustering key opowie, jak dok\u0142adnie dane umie\u015bci\u0107 w tym drzewie, jakie miejsce zajm\u0105.<\/p>\n<p>To w rzeczywisto\u015bci drzewo, tam po prostu wywo\u0142ywany jest komparator, do kt\u00f3rego przekazujemy pewien zestaw kolumn w postaci obiektu, a on te\u017c jest ustawiany w postaci wyliczenia kolumn. <\/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>Zwr\u00f3\u0107 uwag\u0119 na dyrektyw\u0119 Primary key, jej pierwszy argument (w naszym przypadku rok) zawsze jest kluczem partycjonowania. Mo\u017ce sk\u0142ada\u0107 si\u0119 z jednej lub kilku kolumn, to nie ma znaczenia. Je\u015bli kolumn jest kilka, nale\u017cy je umie\u015bci\u0107 w nawiasach, aby preprocesor j\u0119zykowy zrozumia\u0142, \u017ce to w\u0142a\u015bnie Primary key, a za nim wszystkie pozosta\u0142e kolumny \u2014 Clustering key. B\u0119d\u0105 one przesy\u0142ane w komparatorze w tej samej kolejno\u015bci, w jakiej si\u0119 pojawiaj\u0105. To znaczy, \u017ce pierwsza kolumna ma wi\u0119ksze znaczenie, druga \u2014 mniejsze i tak dalej. Jak piszemy dla klas danych, na przyk\u0142ad, pola equals: wymieniamy pola i dla nich okre\u015blamy, kt\u00f3re s\u0105 wi\u0119ksze, a kt\u00f3re mniejsze. W Cassandrze to, powiedzmy, pola klasy danych, do kt\u00f3rej b\u0119dzie stosowany zdefiniowany dla niej equals.<\/p>\n<h2>Ustalamy sortowanie, nak\u0142adamy ograniczenia<\/h2>\n<p>\nNale\u017cy pami\u0119ta\u0107, \u017ce kolejno\u015b\u0107 sortowania (malej\u0105ca, rosn\u0105ca, bez znaczenia) jest ustalana w tym samym momencie, gdy klucz jest tworzony, i p\u00f3\u017aniej nie mo\u017cna jej zmieni\u0107. Fizycznie okre\u015bla, jak b\u0119d\u0105 posortowane dane i jak b\u0119d\u0105 si\u0119 uk\u0142ada\u0142y. Je\u015bli zajdzie potrzeba zmiany Clustering key lub kolejno\u015bci sortowania, trzeba b\u0119dzie stworzy\u0107 now\u0105 tabel\u0119 i przela\u0107 do niej dane. Z ju\u017c istniej\u0105c\u0105 tak si\u0119 nie uda.<\/p>\n<p><img decoding=\"async\" alt=\"Cassandra. Jak nie umrze\u0107, gdy znasz tylko Oracle\" src=\"\/wp-content\/uploads\/2020\/02\/25fc1ef7abb35c728fdc7381a201b79c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWype\u0142nili\u015bmy nasz\u0105 tabel\u0119 u\u017cytkownikami i zauwa\u017cyli\u015bmy, \u017ce zgrupowali si\u0119 najpierw wed\u0142ug roku urodzenia, a nast\u0119pnie w obr\u0119bie ka\u017cdej nody wed\u0142ug wynagrodzenia i identyfikatora u\u017cytkownika. Teraz mo\u017cemy selekcjonowa\u0107, nak\u0142adaj\u0105c ograniczenia. <\/p>\n<p>Ponownie pojawia si\u0119 nasz dzia\u0142aj\u0105cy <code>gdzie, i<\/code>, a u\u017cytkownicy przypisuj\u0105 si\u0119 do nas, i wszystko znowu jest dobrze. Ale je\u015bli spr\u00f3bujemy u\u017cy\u0107 tylko cz\u0119\u015bci Clustering key, w dodatku mniej istotnej, to Cassandra natychmiast zasygnalizuje, \u017ce nie mo\u017ce znale\u017a\u0107 w naszej mapie miejsca, gdzie ten obiekt, kt\u00f3ry ma te pola dla komparatora jako null, nale\u017cy, a gdzie jest ten, kt\u00f3ry dopiero co zadali\u015bmy. B\u0119d\u0119 musia\u0142 ponownie pobra\u0107 wszystkie dane z tej nody i je przefiltrowa\u0107. I to jest odpowiednik pe\u0142nego skanowania w ramach nody, co jest niekorzystne.<\/p>\n<h2>W ka\u017cdej niejasnej sytuacji tw\u00f3rz now\u0105 tabel\u0119<\/h2>\n<p>\nJe\u015bli chcemy mie\u0107 mo\u017cliwo\u015b\u0107 wyci\u0105gania u\u017cytkownik\u00f3w po ID, wieku czy zarobkach, co robi\u0107? Nic. Po prostu u\u017cyjemy dw\u00f3ch tabel. Je\u017celi b\u0119dziemy potrzebowa\u0107 wyci\u0105ga\u0107 u\u017cytkownik\u00f3w trzema r\u00f3\u017cnymi sposobami \u2014 tabel b\u0119dzie trzy. Min\u0119\u0142y czasy, kiedy oszcz\u0119dzali\u015bmy miejsce na dysku. To najta\u0144szy zas\u00f3b. Kosztuje znacznie mniej ni\u017c czas odpowiedzi, kt\u00f3ry mo\u017ce by\u0107 zgubny dla u\u017cytkownika. U\u017cytkownik woli otrzyma\u0107 co\u015b w sekund\u0119, ni\u017c w 10 minut.<\/p>\n<p>Wymieniamy nadmiar zajmowanego miejsca, denormalizowane dane na mo\u017cliwo\u015b\u0107 dobrej skalowalno\u015bci, niezawodnej pracy. W ko\u0144cu klaster sk\u0142adaj\u0105cy si\u0119 z trzech centr\u00f3w danych, w ka\u017cdym z nich po pi\u0119\u0107 w\u0119z\u0142\u00f3w, przy akceptowalnym poziomie zachowania danych (gdy nic nie zostanie utracone), jest w stanie przetrwa\u0107 ca\u0142kowit\u0105 \u015bmier\u0107 jednego centrum danych. I jeszcze po dwa w\u0119z\u0142y w ka\u017cdym z pozosta\u0142ych dw\u00f3ch. I dopiero po tym zaczynaj\u0105 si\u0119 problemy. To do\u015b\u0107 dobre zabezpieczenie, kosztuj\u0105ce par\u0119 dodatkowych dysk\u00f3w SSD i procesor\u00f3w. Dlatego, aby korzysta\u0107 z Cassandry, kt\u00f3ra nie jest SQL, w kt\u00f3rej nie ma relacji ani kluczy obcych, nale\u017cy zna\u0107 kilka prostych zasad.<\/p>\n<p>Projektujemy wszystko od zapytania. Najwa\u017cniejsze s\u0105 nie dane, ale to, jak aplikacja planuje z nimi pracowa\u0107. Je\u015bli potrzebuje pozyskiwa\u0107 r\u00f3\u017cne dane w r\u00f3\u017cny spos\u00f3b lub te same dane na r\u00f3\u017cne sposoby, musimy je umie\u015bci\u0107 w spos\u00f3b wygodny dla aplikacji. W przeciwnym razie wpadniemy w pe\u0142ne skanowanie i \u017cadna zaleta Cassandry nam nie pomo\u017ce.<\/p>\n<p>Denormalizacja danych to norma. Zapominamy o normalnych formach, nie mamy ju\u017c baz relacyjnych. Umie\u015bcimy co\u015b 100 razy, b\u0119dzie le\u017ca\u0142o 100 razy. To wci\u0105\u017c ta\u0144sze ni\u017c spowolnienie dzia\u0142ania. <\/p>\n<p>Wybieramy klucze do partycjonowania tak, aby by\u0142y r\u00f3wnomiernie roz\u0142o\u017cone. Nie chcemy, aby hash naszych kluczy trafia\u0142 w jeden w\u0105ski zakres. To znaczy, rok urodzenia w powy\u017cszym przyk\u0142adzie \u2014 to z\u0142y przyk\u0142ad. W\u0142a\u015bciwie jest dobry, je\u015bli u\u017cytkownicy wed\u0142ug roku urodzenia s\u0105 normalnie roz\u0142o\u017ceni, a z\u0142y, je\u015bli mowa o uczniach 5. klasy \u2014 tam nie b\u0119dzie zbyt dobrze z partycjonowaniem. <\/p>\n<p>Sortowanie jest wybierane tylko raz na etapie tworzenia Klucza Klasteryzacji. Je\u017celi zajdzie potrzeba zmiany, b\u0119dziemy musieli przela\u0107 nasz\u0105 tabel\u0119 z innym kluczem.<\/p>\n<p>I to, co najwa\u017cniejsze: je\u015bli potrzebujemy 100 r\u00f3\u017cnych sposob\u00f3w na pozyskanie tych samych danych, b\u0119dziemy mieli 100 r\u00f3\u017cnych tabel.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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 nie umrze\u0107, je\u015bli znasz tylko Oracle | ProHoster","description":"Cze\u015b\u0107, Habr. Nazywam si\u0119 Misha Butrimov i chcia\u0142bym troch\u0119 opowiedzie\u0107 o Cassandrze.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/cassandra-kak-ne-umeret-esli-znaesh-tolko-oracle","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/41081","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=41081"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/41081\/revisions"}],"predecessor-version":[{"id":164523,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/41081\/revisions\/164523"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/41082"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=41081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=41081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=41081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}