{"id":37585,"date":"2019-10-31T22:18:27","date_gmt":"2019-10-31T19:18:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql\/"},"modified":"2019-10-31T22:18:27","modified_gmt":"2019-10-31T19:18:27","slug":"kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql","title":{"rendered":"Jak zajrze\u0107 w oczy Kassandrze i nie straci\u0107 przy tym danych, stabilno\u015bci i wiary w NoSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Jak zajrze\u0107 w oczy Kassandrze i nie straci\u0107 przy tym danych, stabilno\u015bci i wiary w NoSQL\" src=\"\/wp-content\/uploads\/2019\/08\/4845d37a9928f888639c4ebeb7807787.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>M\u00f3wi si\u0119, \u017ce w \u017cyciu wszystko warto spr\u00f3bowa\u0107 przynajmniej raz. A je\u015bli jeste\u015b przyzwyczajony do pracy z relacyjnymi bazami danych, powiniene\u015b nawi\u0105za\u0107 praktyczny kontakt z NoSQL chocia\u017cby dla og\u00f3lnego rozwoju. Obecnie, z powodu szybkiego rozwoju tej technologii, istnieje wiele kontrowersyjnych opinii i gor\u0105cych spor\u00f3w na ten temat, co szczeg\u00f3lnie podsyca zainteresowanie.<br \/>\nJe\u015bli zg\u0142\u0119bi\u0107 istot\u0119 wszystkich tych spor\u00f3w, mo\u017cna zauwa\u017cy\u0107, \u017ce wynikaj\u0105 one z niew\u0142a\u015bciwego podej\u015bcia. Ci, kt\u00f3rzy u\u017cywaj\u0105 baz NoSQL tam, gdzie s\u0105 one potrzebne, s\u0105 zadowoleni i czerpi\u0105 wszystkie korzy\u015bci z tego rozwi\u0105zania. Natomiast eksperymentatorzy, kt\u00f3rzy polegaj\u0105 na tej technologii jak na panaceum tam, gdzie nie ma dla niej zastosowania, do\u015bwiadczaj\u0105 rozczarowania, trac\u0105c mocne strony relacyjnych baz bez zyskiwania znacz\u0105cych korzy\u015bci.<\/p>\n<p><\/p>\n<p>Opowiem o naszym do\u015bwiadczeniu w implementacji rozwi\u0105zania opartego na bazie danych Cassandra: z czym musieli\u015bmy si\u0119 zmierzy\u0107, jak wyszli\u015bmy z trudnych sytuacji, czy uda\u0142o nam si\u0119 zyska\u0107 na u\u017cywaniu NoSQL i gdzie musieli\u015bmy zainwestowa\u0107 dodatkowe wysi\u0142ki\/\u015brodki.<br \/>\nPocz\u0105tkowym zadaniem by\u0142o zbudowanie systemu rejestruj\u0105cego po\u0142\u0105czenia w pewnym magazynie.<\/p>\n<p><\/p>\n<p>Zasada dzia\u0142ania systemu jest nast\u0119puj\u0105ca. Na wej\u015bciu przychodz\u0105 pliki o okre\u015blonej strukturze, opisuj\u0105cej struktur\u0119 po\u0142\u0105czenia. Nast\u0119pnie aplikacja zapewnia zapis tej struktury w odpowiednich kolumnach. W dalszej perspektywie zapisane po\u0142\u0105czenia s\u0105 wykorzystywane do wy\u015bwietlania informacji o zu\u017cyciu ruchu dla abonent\u00f3w (naliczenia, po\u0142\u0105czenia, historia salda).<\/p>\n<p>\n<img decoding=\"async\" alt=\"Jak zajrze\u0107 w oczy Kassandrze i nie straci\u0107 przy tym danych, stabilno\u015bci i wiary w NoSQL\" src=\"\/wp-content\/uploads\/2019\/08\/c7b095dc8879011adb751c96427af512.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dlaczego wybrali\u015bmy Cassandr\u0119, jest zupe\u0142nie jasne \u2014 dzia\u0142a jak karabin maszynowy, jest \u0142atwo skalowalna, odporna na awarie.<\/p>\n<p>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Oto, co da\u0142o nam do\u015bwiadczenie<\/h2>\n<p><\/p>\n<p>Tak, awaria w\u0119z\u0142a to nie tragedia. W tym tkwi esencja odporno\u015bci na awarie Cassandry. Ale <b>w\u0119ze\u0142 mo\u017ce by\u0107 \u017cywy i jednocze\u015bnie zacz\u0105\u0107 obni\u017ca\u0107 wydajno\u015b\u0107<\/b>. Jak si\u0119 okaza\u0142o, od razu wp\u0142ywa to na wydajno\u015b\u0107 ca\u0142ego klastra.<\/p>\n<p><\/p>\n<p><b>Cassandra nie zapewni wsparcia tam, gdzie Oracle ratowa\u0142 swoimi ograniczeniami<\/b>. I je\u015bli autor aplikacji nie zrozumia\u0142 tego wcze\u015bniej, to przychodz\u0105cy duplikat dla Cassandry nie jest bynajmniej gorszy od orygina\u0142u. Skoro przyszed\u0142, wstawimy go.<\/p>\n<p><\/p>\n<p>Bezp\u0142atna Cassandra \u201ez pude\u0142ka\u201d nagle nie przypad\u0142a do gustu bezpiecze\u0144stwa informacji: <b>Brak logowania dzia\u0142a\u0144 u\u017cytkownik\u00f3w oraz podzia\u0142u uprawnie\u0144.<\/b>. Informacje o po\u0142\u0105czeniach odnosz\u0105 si\u0119 do danych osobowych, co oznacza, \u017ce wszystkie pr\u00f3by ich zapytania lub zmiany musz\u0105 by\u0107 rejestrowane z mo\u017cliwo\u015bci\u0105 p\u00f3\u017aniejszej audytacji. Nale\u017cy r\u00f3wnie\u017c zda\u0107 sobie spraw\u0119 z konieczno\u015bci rozdzielenia uprawnie\u0144 na r\u00f3\u017cne poziomy dla r\u00f3\u017cnych u\u017cytkownik\u00f3w. Prosty in\u017cynier operacyjny i superadministrator, kt\u00f3ry ma swobod\u0119 usuni\u0119cia ca\u0142ego keyspace, to r\u00f3\u017cne role, r\u00f3\u017cna odpowiedzialno\u015b\u0107 i kompetencje. Bez takiego rozdzielenia uprawnie\u0144 warto\u015b\u0107 i integralno\u015b\u0107 danych zostan\u0105 szybko poddane w\u0105tpliwo\u015bci, szybciej ni\u017c przy poziomie sp\u00f3jno\u015bci ANY. <\/p>\n<p><\/p>\n<p>Nie uwzgl\u0119dnili\u015bmy, \u017ce w przypadku po\u0142\u0105cze\u0144 potrzebna jest zar\u00f3wno powa\u017cna analityka, jak i okresowe pr\u00f3bkowanie wed\u0142ug r\u00f3\u017cnych kryteri\u00f3w. Poniewa\u017c wybrane rekordy maj\u0105 by\u0107 p\u00f3\u017aniej usuwane i nadpisywane (w ramach zadania musimy wspiera\u0107 proces aktualizacji danych w przypadku b\u0142\u0119dnie dostarczonych informacji), Cassandra nie jest tutaj pomocna. <b>Cassandra, jak skarbonka \u2013 \u0142atwo jest do niej wk\u0142ada\u0107 dane, ale nie da si\u0119 ich przeliczy\u0107.<\/b><\/p>\n<p><\/p>\n<p><b>Napotkali\u015bmy problem z transferem danych do stref testowych.<\/b> (5 nod\u00f3w w te\u015bcie przeciwko 20 w produkcji). W takim wypadku nie mo\u017cna u\u017cy\u0107 zrzutu.<\/p>\n<p><\/p>\n<p>Problem z aktualizacj\u0105 schematu danych aplikacji, kt\u00f3ra zapisuje do Cassandry. <b>Roll-back spowoduje ogromn\u0105 ilo\u015b\u0107 nagrobk\u00f3w, co w nieprzewidywalny spos\u00f3b mo\u017ce obni\u017cy\u0107 wydajno\u015b\u0107.<\/b>. Cassandra jest zoptymalizowana pod k\u0105tem zapisu i przed zapisaniem nie my\u015bli zbyt wiele. Ka\u017cda operacja na istniej\u0105cych danych jest r\u00f3wnie\u017c zapisem. Tzn. usuwaj\u0105c zb\u0119dne, po prostu generujemy jeszcze wi\u0119cej zapis\u00f3w, a tylko cz\u0119\u015b\u0107 z nich b\u0119dzie oznaczona nagrobkami.<\/p>\n<p><\/p>\n<p>Timeouty podczas wstawiania. Cassandra jest wspania\u0142a w zapisie, ale <b>czasami nap\u0142ywaj\u0105cy strumie\u0144 mo\u017ce j\u0105 znacznie zaskoczy\u0107.<\/b>. Dzieje si\u0119 tak, gdy aplikacja zaczyna powtarza\u0107 kilka zapis\u00f3w, kt\u00f3re nie mog\u0105 by\u0107 wstawione z jakiego\u015b powodu. I potrzebujemy prawdziwego DBA, kt\u00f3ry b\u0119dzie monitorowa\u0142 gc.log, logi systemowe i debugowe pod k\u0105tem wolnych zapyta\u0144 oraz metryk dotycz\u0105cych pending compaction.\n<\/p>\n<p><\/p>\n<p>Kilka centr\u00f3w danych w klastrze. <b>Sk\u0105d czyta\u0107 i gdzie pisa\u0107?<\/b> <br \/>\nCzy mo\u017cna podzieli\u0107 na odczyt i zapis? A je\u015bli tak, to czy bli\u017cej aplikacji powinien by\u0107 DC do zapisu, czy odczytu? Czy nie dojdzie do rzeczywistych problem\u00f3w z podzia\u0142em, je\u015bli \u017ale wybierzemy poziom sp\u00f3jno\u015bci? Jest tak wiele pyta\u0144, wiele niezbadanych ustawie\u0144 i mo\u017cliwo\u015bci, kt\u00f3re chcia\u0142oby si\u0119 przetestowa\u0107.\n<\/p>\n<p><\/p>\n<h2>Jak rozwi\u0105zali\u015bmy to<\/h2>\n<p><\/p>\n<p><b>Aby w\u0119ze\u0142 si\u0119 nie zawiesza\u0142, wy\u0142\u0105czyli\u015bmy SWAP<\/b>. I teraz, gdy brakuje pami\u0119ci, w\u0119ze\u0142 powinien si\u0119 wy\u0142\u0105czy\u0107, zamiast generowa\u0107 d\u0142ugie przerwy GC.<\/p>\n<p><\/p>\n<p>Zatem, nie polegamy ju\u017c na logice w DB. <b>Programi\u015bci aplikacji przystosowuj\u0105 si\u0119 i zaczynaj\u0105 aktywnie zabezpiecza\u0107 si\u0119 w swoim kodzie.<\/b> Idealne, wyra\u017ane oddzielenie przechowywania i przetwarzania danych.<\/p>\n<p><\/p>\n<p><b>Zakupili\u015bmy wsparcie od DataStax.<\/b> Rozw\u00f3j wersji pude\u0142kowej Cassandry zosta\u0142 ju\u017c wstrzymany (ostatni commit w lutym 2018 roku). Jednocze\u015bnie, Datastax oferuje doskona\u0142\u0105 us\u0142ug\u0119 oraz du\u017c\u0105 ilo\u015b\u0107 dopracowanych i dostosowanych do istniej\u0105cych system\u00f3w rozwi\u0105za\u0144.<\/p>\n<p><\/p>\n<p>Chcia\u0142bym r\u00f3wnie\u017c zauwa\u017cy\u0107, \u017ce Cassandra nie jest zbyt wygodna do zapyta\u0144 selekcyjnych. Oczywi\u015bcie, CQL to ogromny krok naprz\u00f3d dla u\u017cytkownik\u00f3w (w por\u00f3wnaniu z Thrift). Ale je\u015bli masz ca\u0142e dzia\u0142y, kt\u00f3re przyzwyczai\u0142y si\u0119 do wygodnych z\u0142\u0105cze\u0144, swobodnej filtracji po dowolnym polu i mo\u017cliwo\u015bci optymalizacji zapyta\u0144, a te dzia\u0142y pracuj\u0105 nad tym, aby zamyka\u0107 roszczenia i awarie, to rozwi\u0105zanie w Cassandra jawi im si\u0119 jako wrogie i g\u0142upie. Zacz\u0119li\u015bmy zastanawia\u0107 si\u0119, jak nasi koledzy mog\u0105 wykonywa\u0107 zapytania. <\/p>\n<p><\/p>\n<p>Rozwa\u017cali\u015bmy dwie opcje. W pierwszej opcji zapisujemy wywo\u0142ania nie tylko w C*, ale tak\u017ce w archiwalnej bazie danych Oracle. Tylko w przeciwie\u0144stwie do C*, w tej bazie przechowywane s\u0105 wywo\u0142ania tylko za bie\u017c\u0105cy miesi\u0105c (wystarczaj\u0105ca g\u0142\u0119boko\u015b\u0107 przechowywania wywo\u0142a\u0144 dla przypadk\u00f3w przetargowych). Od razu dostrzeg\u0142em nast\u0119puj\u0105cy problem: je\u015bli zapisujemy synchronizacyjnie, to tracimy wszystkie zalety C*, zwi\u0105zane z szybkim wstawianiem; je\u015bli asynchronicznie \u2013 nie ma gwarancji, \u017ce wszystkie potrzebne wywo\u0142ania trafi\u0105 do Oracle. Jednym z plus\u00f3w by\u0142 jednak du\u017cy: do u\u017cytku pozostaje ten sam znany PL\/SQL Developer, tzn. prawie realizujemy wzorzec \u201eFasada\u201d. Alternatywna opcja. Realizujemy mechanizm, kt\u00f3ry eksportuje wywo\u0142ania z C*, \u015bci\u0105ga jakie\u015b dane do wzbogacenia z odpowiednich tabel w Oracle, \u0142\u0105czy uzyskane zestawy i daje nam uzyskany rezultat, kt\u00f3ry p\u00f3\u017aniej jako\u015b wykorzystujemy (odtwarzamy, powtarzamy, analizujemy, podziwiamy). Minusy: proces wydaje si\u0119 do\u015b\u0107 wieloetapowy, a poza tym brakuje interfejsu dla pracownik\u00f3w eksploatacji.<\/p>\n<p><\/p>\n<p>Ostatecznie jednak zdecydowali\u015bmy si\u0119 na drug\u0105 opcj\u0119. <b>Do wybierania z r\u00f3\u017cnych zbior\u00f3w u\u017cyli\u015bmy Apache Spark.<\/b> Istota mechanizmu sprowadza\u0142a si\u0119 do kodu w Javie, kt\u00f3ry na podstawie wskazanych kluczy (abonent, czas wywo\u0142ania \u2013 klucze sekcji) wyci\u0105ga dane z C*, a tak\u017ce potrzebne dane do wzbogacenia z ka\u017cdej innej bazy danych. Nast\u0119pnie \u0142\u0105czy je w swojej pami\u0119ci i wyprowadza wynik do tabeli wynikowej. Nad sparkiem stworzyli\u015bmy interfejs webowy i okaza\u0142o si\u0119 to ca\u0142kiem odpowiednie do eksploatacji.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Jak zajrze\u0107 w oczy Kassandrze i nie straci\u0107 przy tym danych, stabilno\u015bci i wiary w NoSQL\" src=\"\/wp-content\/uploads\/2019\/08\/5754363569f159dd7b86972bb0cef732.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Podczas rozwi\u0105zania problemu z aktualizacj\u0105 danych, zesp\u00f3\u0142 ponownie rozwa\u017ca\u0142 kilka sposob\u00f3w rozwi\u0105zania. Zar\u00f3wno transfer przez Sstloader, jak i opcja z podzia\u0142em klastra w strefie testowej na dwie cz\u0119\u015bci, z kt\u00f3rych ka\u017cda naprzemiennie \u0142\u0105czy si\u0119 z klasterem produkcyjnym, zasilaj\u0105c si\u0119 od niego. Podczas aktualizacji test\u00f3w planowano zmienia\u0107 ich miejscami: ta cz\u0119\u015b\u0107, kt\u00f3ra pracowa\u0142a w te\u015bcie, jest czyszczona i przenoszona do produkcji, podczas gdy druga zaczyna pracowa\u0107 z danymi oddzielnie. Jednak po ponownym przemy\u015bleniu, bardziej racjonalnie ocenili\u015bmy dane, kt\u00f3re warto przenie\u015b\u0107, i zrozumieli\u015bmy, \u017ce same wywo\u0142ania \u2013 to niesp\u00f3jna jednostka dla test\u00f3w, szybko generowana w przypadku potrzeby, a zestaw danych produkcyjnych nie ma warto\u015bci do przeniesienia do test\u00f3w. Istnieje kilka obiekt\u00f3w-magazyn\u00f3w, kt\u00f3re warto przenie\u015b\u0107, ale to dos\u0142ownie kilka tabel, kt\u00f3re nie s\u0105 zbyt ci\u0119\u017ckie. Dlatego <b>w ramach rozwi\u0105zania ponownie pom\u00f3g\u0142 nam Spark, dzi\u0119ki kt\u00f3remu napisali\u015bmy i zacz\u0119li\u015bmy aktywnie u\u017cywa\u0107 skryptu do transferu danych mi\u0119dzy tabelami produkcji-test.<\/b><\/p>\n<p><\/p>\n<p><b>Nasza obecna polityka wdro\u017ce\u0144 pozwala nam dzia\u0142a\u0107 bez rollback\u00f3w.<\/b> Przed produkcj\u0105 odbywa si\u0119 obowi\u0105zkowe wdro\u017cenie na test, gdzie b\u0142\u0105d nie kosztuje tak du\u017co. W przypadku niepowodzenia zawsze mo\u017cna usun\u0105\u0107 kespace i wdro\u017cy\u0107 ca\u0142\u0105 schem\u0119 od pocz\u0105tku.<\/p>\n<p><\/p>\n<p>Aby zapewni\u0107 ci\u0105g\u0142\u0105 dost\u0119pno\u015b\u0107 Cassandry, potrzebny jest DBA i nie tylko on. <b>Wszyscy, kt\u00f3rzy pracuj\u0105 z aplikacj\u0105, musz\u0105 rozumie\u0107, gdzie i jak sprawdza\u0107 aktualn\u0105 sytuacj\u0119 oraz jak na czas diagnozowa\u0107 problemy.<\/b> W tym celu aktywnie u\u017cywamy DataStax OpsCenter (zarz\u0105dzanie i monitorowanie obci\u0105\u017ce\u0144), metryk systemowych Cassandra Driver (liczba timeout\u00f3w dla zapisu w C*, liczba timeout\u00f3w dla odczytu z C*, maksymalna latencja itp.), monitorujemy dzia\u0142anie samej aplikacji, kt\u00f3ra dzia\u0142a z Cassandr\u0105.\n<\/p>\n<p><\/p>\n<p>Kiedy zastanawiali\u015bmy si\u0119 nad poprzednim pytaniem, zrozumieli\u015bmy, gdzie mo\u017ce kry\u0107 si\u0119 nasz g\u0142\u00f3wny ryzyko. To s\u0105 formy wy\u015bwietlania danych, kt\u00f3re wyprowadzaj\u0105 dane z kilku niezale\u017cnych zapyta\u0144 do magazynu. W ten spos\u00f3b mo\u017cemy uzyska\u0107 do\u015b\u0107 niesp\u00f3jne informacje. Ale ten problem by\u0142by r\u00f3wnie\u017c aktualny, gdyby\u015bmy pracowali tylko z jednym centrum danych. Najrozs\u0105dniej by\u0142oby tutaj oczywi\u015bcie stworzy\u0107 parti\u0119 funkcji odczytu danych w zewn\u0119trznej aplikacji, kt\u00f3ra zapewni uzyskanie danych w jednolitym czasie. Je\u015bli chodzi o rozdzielenie na odczyt i zapis w kwestii wydajno\u015bci, zatrzyma\u0142 nas ryzyko, \u017ce przy pewnej stracie po\u0142\u0105czenia mi\u0119dzy centrum danych, mo\u017cemy otrzyma\u0107 dwa zupe\u0142nie niesp\u00f3jne ze sob\u0105 klastry.<\/p>\n<p><\/p>\n<p>W rezultacie, na chwil\u0119 obecn\u0105 <b>zatrzymali\u015bmy si\u0119 na poziomie sp\u00f3jno\u015bci dla zapisu EACH_QUORUM, dla odczytu \u2013 LOCAL_QUORUM<\/b><\/p>\n<p><\/p>\n<h2>Kr\u00f3tkie wra\u017cenia i wnioski<\/h2>\n<p><\/p>\n<p>Aby oceni\u0107 uzyskane rozwi\u0105zanie z punktu widzenia wsparcia eksploatacyjnego i perspektyw dalszego rozwoju, postanowili\u015bmy pomy\u015ble\u0107, gdzie jeszcze mo\u017cna zastosowa\u0107 takie opracowanie.<\/p>\n<p><\/p>\n<p>Je\u015bli chodzi o konkretne pomys\u0142y, to skoring danych dla program\u00f3w typu \"P\u0142a\u0107, kiedy chcesz\" (\u0142adujemy w S* informacje, obliczenie w skryptach Spark), uwzgl\u0119dnianie reklamacji z agregacj\u0105 wed\u0142ug kierunk\u00f3w, przechowywanie r\u00f3l i obliczanie na podstawie matrycy r\u00f3l uprawnie\u0144 u\u017cytkownik\u00f3w. <\/p>\n<p><\/p>\n<p>Jak widzimy, repertuar jest szeroki i r\u00f3\u017cnorodny. I je\u015bli wybiera\u0107 oboz w\u015br\u00f3d zwolennik\u00f3w\/przeciwnik\u00f3w NoSQL, to przy\u0142\u0105czymy si\u0119 do zwolennik\u00f3w, gdy\u017c dostali\u015bmy swoje korzy\u015bci, i to tam, gdzie si\u0119 ich spodziewali\u015bmy.<\/p>\n<p><\/p>\n<p>Nawet wariant Cassandra z pude\u0142ka pozwala na poziome skalowanie w czasie rzeczywistym, bezproblemowo rozwi\u0105zuj\u0105c problem zwi\u0119kszenia danych w systemie. Uda\u0142o nam si\u0119 wydzieli\u0107 w osobny kontur bardzo obci\u0105\u017cony mechanizm do obliczania agregat\u00f3w wed\u0142ug po\u0142\u0105cze\u0144, a tak\u017ce podzieli\u0107 schemat i logik\u0119 aplikacji, pozbywaj\u0105c si\u0119 z\u0142ej praktyki pisania niestandardowych zada\u0144 i obiekt\u00f3w w samej bazie danych. Zyskali\u015bmy mo\u017cliwo\u015b\u0107 wyboru i dostosowywania, w celu przyspieszenia, na jakich centrach danych b\u0119dziemy przeprowadza\u0107 obliczenia, a na kt\u00f3rych zapisywa\u0107 dane, zabezpieczaj\u0105c si\u0119 przed awariami zar\u00f3wno poszczeg\u00f3lnych w\u0119z\u0142\u00f3w, jak i ca\u0142ego centrum danych.<\/p>\n<p><\/p>\n<p>Wdra\u017caj\u0105c nasz\u0105 architektur\u0119 do nowych projekt\u00f3w, maj\u0105c ju\u017c pewne do\u015bwiadczenie, chcieliby\u015bmy od razu uwzgl\u0119dni\u0107 opisane powy\u017cej niuanse i unikn\u0105\u0107 pewnych b\u0142\u0119d\u00f3w oraz z\u0142agodzi\u0107 niekt\u00f3re ostre kraw\u0119dzie, kt\u00f3rych nie uda\u0142o si\u0119 unikn\u0105\u0107 na pocz\u0105tku.<\/p>\n<p><\/p>\n<p>Na przyk\u0142ad, <b>na bie\u017c\u0105co \u015bledzi\u0107 aktualizacje samej Kassandra<\/b>, poniewa\u017c wiele problem\u00f3w, kt\u00f3re napotkali\u015bmy, by\u0142y ju\u017c znane i naprawiane.<\/p>\n<p><\/p>\n<p><b>Nie umieszcza\u0107 zar\u00f3wno bazy danych, jak i Sparka na tych samych w\u0119z\u0142ach<\/b> (lub \u015bci\u015ble dzieli\u0107 wed\u0142ug dopuszczalnej ilo\u015bci zu\u017cycia zasob\u00f3w), poniewa\u017c Spark mo\u017ce zje\u015b\u0107 wi\u0119cej pami\u0119ci RAM, ni\u017c to mo\u017cliwe, a my szybko napotkamy problem numer 1 z naszej listy.<\/p>\n<p><\/p>\n<p><b>Zwi\u0119ksza\u0107 monitoring i umiej\u0119tno\u015bci eksploatacji ju\u017c na etapie testowania projektu. <\/b><b>Pocz\u0105tkowo bra\u0107 pod uwag\u0119 maksymalnie wszystkich potencjalnych u\u017cytkownik\u00f3w naszego rozwi\u0105zania<\/b>, poniewa\u017c to od tego b\u0119dzie z czasem zale\u017ce\u0107 struktura bazy danych.<\/p>\n<p><\/p>\n<p>Kilka razy przeanalizowa\u0107 uzyskan\u0105 schem\u0119 pod k\u0105tem mo\u017cliwej optymalizacji. Okre\u015bli\u0107, kt\u00f3re pola mo\u017cna serializowa\u0107. Zrozumie\u0107, jakie dodatkowe tabele powinni\u015bmy stworzy\u0107, aby najdok\u0142adniej i optymalnie uwzgl\u0119dni\u0107, a nast\u0119pnie zwraca\u0107 wymagane informacje na zapytania (na przyk\u0142ad, zak\u0142adaj\u0105c, \u017ce te same dane mo\u017cemy przechowywa\u0107 w r\u00f3\u017cnych tabelach, uwzgl\u0119dniaj\u0105c r\u00f3\u017cne podzia\u0142y wed\u0142ug r\u00f3\u017cnych kryteri\u00f3w, mo\u017cemy znacznie zaoszcz\u0119dzi\u0107 czas procesora przy zapytaniach do odczytu).<\/p>\n<p><\/p>\n<p>Nie\u017ale <b>od razu przewidzie\u0107 nak\u0142adanie TTL i czyszczenie przestarza\u0142ych danych.<\/b><\/p>\n<p><\/p>\n<p>Podczas eksportowania danych z Cassandry <b>logika aplikacji musi dzia\u0142a\u0107 na zasadzie FETCH, aby nie wszystkie wiersze by\u0142y \u0142adowane do pami\u0119ci jednocze\u015bnie, ale wybierane partiami.<\/b><\/p>\n<p><\/p>\n<p>Warto przed prze\u0142o\u017ceniem projektu na opisan\u0105 architektur\u0119 <b>sprawdzi\u0107 odporno\u015b\u0107 systemu, przeprowadzaj\u0105c seri\u0119 test\u00f3w awaryjnych<\/b>, takich jak utrata danych w jednym centrum danych, odzyskiwanie uszkodzonych danych w okre\u015blonym okresie, spadki sieci mi\u0119dzy centrami danych. Takie testy nie tylko pozwol\u0105 oceni\u0107 zalety i wady proponowanej architektury, ale r\u00f3wnie\u017c dadz\u0105 cenn\u0105 praktyk\u0119 in\u017cynierom je przeprowadzaj\u0105cym, a nabyta umiej\u0119tno\u015b\u0107 b\u0119dzie nieoceniona, gdy awarie systemu wyst\u0105pi\u0105 w produkcji.<\/p>\n<p><\/p>\n<p>Je\u015bli pracujemy z krytycznymi informacjami (takimi jak dane do przeprowadzania rozlicze\u0144, obliczanie zaleg\u0142o\u015bci abonenta), warto r\u00f3wnie\u017c zwr\u00f3ci\u0107 uwag\u0119 na narz\u0119dzia, kt\u00f3re pozwol\u0105 zmniejszy\u0107 ryzyko wynikaj\u0105ce z charakterystyki system\u00f3w zarz\u0105dzania bazami danych. Na przyk\u0142ad, warto wykorzysta\u0107 narz\u0119dzie nodesync (Datastax), opracowuj\u0105c optymaln\u0105 strategi\u0119 jego u\u017cycia, aby <b>w celu zapewnienia sp\u00f3jno\u015bci nie generowa\u0107 nadmiernego obci\u0105\u017cenia dla Cassandry<\/b> i stosowa\u0107 je tylko do okre\u015blonych tabel w okre\u015blonym okresie.<\/p>\n<p><\/p>\n<p>C\u00f3\u017c, po p\u00f3\u0142 roku \u017cycia z Cassandr\u0105? Generalnie, nie ma nierozwi\u0105zanych problem\u00f3w. Nie dopu\u015bcili\u015bmy r\u00f3wnie\u017c do powa\u017cnych awarii ani utraty danych. Tak, trzeba by\u0142o pomy\u015ble\u0107 nad rekompensat\u0105 niekt\u00f3rych wcze\u015bniej nieprzewidzianych problem\u00f3w, ale ostatecznie nie wp\u0142yn\u0119\u0142o to znacz\u0105co na nasze rozwi\u0105zanie architektoniczne. Je\u015bli chcesz i nie boisz si\u0119 pr\u00f3bowa\u0107 czego\u015b nowego, a jednocze\u015bnie nie chcesz si\u0119 zbytnio rozczarowa\u0107, przygotuj si\u0119 na to, \u017ce nic nie jest za darmo. Trzeba b\u0119dzie wi\u0119cej przygl\u0105da\u0107 si\u0119, zg\u0142\u0119bia\u0107 dokumentacj\u0119 i zbiera\u0107 swoje indywidualne pu\u0142apki, ni\u017c w starym rozwi\u0105zaniu legacy, a \u017cadna teoria nie wska\u017ce z wyprzedzeniem, jakie pu\u0142apki czekaj\u0105 na ciebie.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/465333\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0413\u043e\u0432\u043e\u0440\u044f\u0442, \u0432 \u0436\u0438\u0437\u043d\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u0440\u0430\u0437. \u0418 \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0421\u0423\u0411\u0414, \u0442\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441 NoSQL \u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u0441\u0438\u043b\u0443 \u0431\u0443\u0440\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u044b\u0445 \u043c\u043d\u0435\u043d\u0438\u0439 \u0438 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u0441\u043f\u043e\u0440\u043e\u0432 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043e\u0433\u0440\u0435\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441. \u0415\u0441\u043b\u0438 \u0432\u043d\u0438\u043a\u043d\u0443\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28210,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37585","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\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\/administrirovanie\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql\" \/>\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\udd47\u041a\u0430\u043a \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0433\u043b\u0430\u0437\u0430 \u041a\u0430\u0441\u0441\u0430\u043d\u0434\u0440\u0435 \u0438 \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u0435\u0440\u0443 \u0432 NoSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql\" \/>\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=\"2019-10-31T19:18:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:18:27+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\udd47Jak spojrze\u0107 w oczy Cassandrze i nie utraci\u0107 przy tym danych, stabilno\u015bci i wiary w NoSQL | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql","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\udd47\u041a\u0430\u043a \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0433\u043b\u0430\u0437\u0430 \u041a\u0430\u0441\u0441\u0430\u043d\u0434\u0440\u0435 \u0438 \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u0435\u0440\u0443 \u0432 NoSQL | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-zaglyanut-v-glaza-kassandre-i-ne-poteryat-pri-etom-dannye-stabilnost-i-veru-v-nosql","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":"2019-10-31T19:18:27+00:00","article:modified_time":"2019-10-31T19:18:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37585","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":"2026-01-23 18:29:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 14:06:01","updated":"2026-01-23 18:29:19","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\/37585","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=37585"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37585\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/28210"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=37585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=37585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=37585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}