{"id":91635,"date":"2020-08-15T19:42:23","date_gmt":"2020-08-15T17:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem"},"modified":"2020-08-15T19:42:23","modified_gmt":"2020-08-15T17:42:23","slug":"na-puti-k-besservernym-bazam-dannyh-kak-i-zachem","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem","title":{"rendered":"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107! Nazywam si\u0119 Nikolaj Golow. Wcze\u015bniej pracowa\u0142em w Avito i przez sze\u015b\u0107 lat kierowa\u0142em platform\u0105 danych, zajmuj\u0105c si\u0119 wszystkimi bazami: analitycznymi (Vertica, ClickHouse), strumieniowymi i OLTP (Redis, Tarantool, VoltDB, MongoDB, PostgreSQL). W tym czasie zapozna\u0142em si\u0119 z du\u017c\u0105 liczb\u0105 baz danych \u2014 bardzo r\u00f3\u017cnych i nietypowych oraz z nietypowymi przypadkami ich u\u017cycia.<\/p>\n<p>Obecnie pracuj\u0119 w ManyChat. W zasadzie to startup \u2014 nowy, ambitny i szybko rozwijaj\u0105cy si\u0119. I kiedy tylko do\u0142\u0105czy\u0142em do firmy, pojawi\u0142o si\u0119 klasyczne pytanie: \u201eCo teraz powinien wybra\u0107 m\u0142ody startup z rynku DBMS i baz danych?\u201d. <\/p>\n<p>W tym artykule, opartym na moim wyst\u0105pieniu na <noindex><a rel=\"nofollow\" href=\"https:\/\/ritfest.ru\/2020\/\">internetowym festiwalu RIT++2020<\/a><\/noindex>, odpowiem na to pytanie. Wersja wideo prezentacji jest dost\u0119pna na <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/H23f_z13ro4\">YouTube<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego\" src=\"\/wp-content\/uploads\/2020\/08\/6a5df9b75ad435ebe88adf920ab9ea8b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Powszechnie znane bazy danych z 2020 roku<\/h2>\n<p>\nMamy rok 2020, rozejrza\u0142em si\u0119 i dostrzeg\u0142em trzy typy baz danych. <\/p>\n<p>Pierwszy typ \u2014 <b>klasyczne bazy OLTP<\/b>: PostgreSQL, SQL Server, Oracle, MySQL. Zosta\u0142y napisane dawno temu, ale wci\u0105\u017c s\u0105 aktualne, poniewa\u017c s\u0105 dobrze znane \u015brodowisku programist\u00f3w.<\/p>\n<p>Drugi typ \u2014 <b>bazy z \"zerowych\"<\/b>. Stara\u0142y si\u0119 odej\u015b\u0107 od klasycznych wzorc\u00f3w, rezygnuj\u0105c z SQL, tradycyjnych struktur i ACID, dzi\u0119ki wbudowanemu shardingowi i innym atrakcyjnym funkcjom. Na przyk\u0142ad, to Cassandra, MongoDB, Redis lub Tarantool. Wszystkie te rozwi\u0105zania chcia\u0142y zaoferowa\u0107 rynkowi co\u015b zasadniczo nowego i zaj\u0119\u0142y swoj\u0105 nisz\u0119, poniewa\u017c w okre\u015blonych zadaniach okaza\u0142y si\u0119 niezwykle wygodne. Te bazy okre\u015bl\u0119 szerokim terminem NOSQL.<\/p>\n<p>\"Zerowe\" si\u0119 zako\u0144czy\u0142y, do baz NOSQL przywykli\u015bmy, a \u015bwiat, z mojego punktu widzenia, uczyni\u0142 kolejny krok \u2014 ku <b>zarz\u0105dzanym bazom<\/b>. Ich rdze\u0144 jest taki sam jak w klasycznych bazach OLTP lub nowych NoSQL. Jednak nie wymagaj\u0105 DBA i DevOps i dzia\u0142aj\u0105 na zarz\u0105dzanym sprz\u0119cie w chmurze. Dla programisty to \"po prostu baza\", kt\u00f3ra gdzie\u015b dzia\u0142a, a to, jak zosta\u0142a zainstalowana na serwerze, kto skonfigurowa\u0142 serwer i kto go aktualizuje, nikogo nie obchodzi.<\/p>\n<p>Przyk\u0142ady takich baz:<\/p>\n<ul>\n<li>AWS RDS \u2014 zarz\u0105dzana nak\u0142adka na PostgreSQL\/MySQL.<\/li>\n<li>DynamoDB \u2014 odpowiednik bazy opartej na dokumentach AWS, przypomina Redis i MongoDB.<\/li>\n<li>Amazon Redshift \u2014 zarz\u0105dzana baza analityczna.<\/li>\n<\/ul>\n<p>\nJest to oparta na starych bazach, ale przeniesiona do zarz\u0105dzanego \u015brodowiska, bez potrzeby pracy ze sprz\u0119tem. <\/p>\n<p><i>Uwaga. Przyk\u0142ady zosta\u0142y wybrane dla \u015brodowiska AWS, ale ich odpowiedniki istniej\u0105 r\u00f3wnie\u017c w Microsoft Azure, Google Cloud lub Yandex.Cloud.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego\" src=\"\/wp-content\/uploads\/2020\/08\/06e50904f795b3b5dc62ca45622b2dd7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCo wi\u0119c nowego z tego? W 2020 roku nic z tego.<\/p>\n<h2>Koncepcja Serverless<\/h2>\n<p>\nRzeczywi\u015bcie nowe na rynku w 2020 roku to rozwi\u0105zania serverless lub bezserwerowe.<\/p>\n<p>Postaram si\u0119 wyja\u015bni\u0107, co to oznacza, na przyk\u0142adzie zwyk\u0142ej us\u0142ugi lub aplikacji backendowej.<br \/>\nAby uruchomi\u0107 zwyk\u0142\u0105 aplikacj\u0119 backendow\u0105, kupujemy lub wynajmujemy serwer, kopiujemy na niego kod, publikujemy na zewn\u0105trz endpoint i regularnie p\u0142acimy za wynajem, pr\u0105d i us\u0142ugi centrum danych. To standardowy schemat.<\/p>\n<p>Czy mo\u017cna to zrobi\u0107 inaczej? Z us\u0142ugami bezserwerowymi mo\u017cna.<\/p>\n<p>Na czym polega ten spos\u00f3b: nie ma serwera, nawet wynajmowania wirtualnego instance'u w chmurze. Aby uruchomi\u0107 us\u0142ug\u0119, kopiujemy kod (funkcje) do repozytorium i publikujemy na zewn\u0105trz endpoint. Nast\u0119pnie p\u0142acimy tylko za ka\u017cde wywo\u0142anie tej funkcji, ca\u0142kowicie ignoruj\u0105c sprz\u0119t, na kt\u00f3rym jest wykonywana.<\/p>\n<p>Postaram si\u0119 zilustrowa\u0107 to podej\u015bcie obrazkami.<br \/>\n<img decoding=\"async\" alt=\"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego\" src=\"\/wp-content\/uploads\/2020\/08\/705cf89c51b8166da772b1d877262b44.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Klasyczny deployment<\/b>. Mamy us\u0142ug\u0119 z okre\u015blonym obci\u0105\u017ceniem. Podnosimy dwa instancje: fizyczne serwery lub instancje w AWS. Do tych instancji kierowane s\u0105 zewn\u0119trzne zapytania, kt\u00f3re s\u0105 tam przetwarzane. <\/p>\n<p>Jak wida\u0107 na obrazku, serwery s\u0105 wykorzystywane w r\u00f3\u017cnym stopniu. Jeden jest wykorzystywany w 100%, obs\u0142uguj\u0105c dwa zapytania, a drugi tylko w 50% \u2014 cz\u0119\u015bciowo stoi bezczynnie. Je\u015bli przyjdzie nie trzy zapytania, a 30, to ca\u0142y system nie poradzi sobie z obci\u0105\u017ceniem i zacznie zwalnia\u0107.<\/p>\n<p><img decoding=\"async\" alt=\"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego\" src=\"\/wp-content\/uploads\/2020\/08\/005b1f91ced2f2b29363cf975ed085e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Bezserwerowy deployment<\/b>. W \u015brodowisku bezserwerowym taka us\u0142uga nie ma instancji ani serwer\u00f3w. Jest pewien zbi\u00f3r rozgrzanych zasob\u00f3w \u2014 ma\u0142ych przygotowanych kontener\u00f3w Docker z wdro\u017conym kodem funkcji. System otrzymuje zewn\u0119trzne zapytania i na ka\u017cde z nich bezserwerowy framework uruchamia ma\u0142y kontener z kodem: przetwarza w\u0142a\u015bnie to zapytanie i zamyka kontener.<\/p>\n<p>Jedno zapytanie \u2014 jeden uruchomiony kontener, 1000 zapyta\u0144 \u2014 1000 kontener\u00f3w. A wdra\u017canie na serwerach fizycznych to ju\u017c zadanie dostawcy chmury. Jest to ca\u0142kowicie ukryte przez bezserwerowy framework. W tej koncepcji p\u0142acimy za ka\u017cde wywo\u0142anie. Na przyk\u0142ad, je\u015bli przychodzi jedno wywo\u0142anie dziennie \u2014 p\u0142acimy za jedno wywo\u0142anie, przyjdzie milion na minut\u0119 \u2014 p\u0142acimy za milion. Lub na sekund\u0119, to te\u017c si\u0119 zdarza.<\/p>\n<p>Koncepcja publikacji funkcji bezserwerowej nadaje si\u0119 do serwisu stateless. A je\u015bli potrzebujesz serwisu statefull, nale\u017cy doda\u0107 baz\u0119 danych. W takim przypadku, gdy dochodzi do pracy ze stanem, ka\u017cda funkcja statefull po prostu zapisuje i odczytuje z bazy danych. Co wi\u0119cej, z bazy danych dowolnego z trzech typ\u00f3w opisanych na pocz\u0105tku artyku\u0142u.<\/p>\n<p>Jakie ograniczenie og\u00f3lne maj\u0105 wszystkie te bazy? To koszty zwi\u0105zane z ci\u0105gle u\u017cywanym serwerem w chmurze lub fizycznym (lub kilkoma serwerami). Niezale\u017cnie od tego, czy korzystamy z klasycznej bazy, czy zarz\u0105dzanej, czy mamy Devops i administratora, wci\u0105\u017c p\u0142acimy 24 na 7 za sprz\u0119t, elektryczno\u015b\u0107 i wynajem centrum danych. Je\u015bli mamy klasyczn\u0105 baz\u0119, p\u0142acimy za master i slave. Je\u015bli mamy wysokoobci\u0105\u017con\u0105, sharded baz\u0119 \u2013 p\u0142acimy za 10, 20 lub 30 serwer\u00f3w, i p\u0142acimy non stop.<\/p>\n<p>Obecno\u015b\u0107 w strukturze wydatk\u00f3w stale zarezerwowanych serwer\u00f3w dawniej by\u0142a postrzegana jako nieuniknione z\u0142o. Zwyk\u0142e bazy maj\u0105 r\u00f3wnie\u017c inne trudno\u015bci, takie jak limity na liczb\u0119 po\u0142\u0105cze\u0144, ograniczenia skalowalno\u015bci, geograficzny konsensus \u2013 mo\u017cna je jako\u015b rozwi\u0105za\u0107 w okre\u015blonych bazach, ale nie wszystkie na raz i nie idealnie.<\/p>\n<h2>Bezserwerowa baza danych \u2013 teoria<\/h2>\n<p>\nPytanie z 2020 roku: czy baz\u0119 danych mo\u017cna r\u00f3wnie\u017c uczyni\u0107 bezserwerow\u0105? Wszyscy s\u0142yszeli o bezserwerowym backendzie\u2026 a dlaczego by nie spr\u00f3bowa\u0107 tak\u017ce bazy danych uczyni\u0107 bezserwerow\u0105?<\/p>\n<p>To brzmi dziwnie, poniewa\u017c baza danych to statefull serwis, niezbyt odpowiedni dla infrastruktury bezserwerowej. Przy tym r\u00f3wnie\u017c stan bazy danych jest bardzo du\u017cy: gigabajty, terabajty, a w bazach analitycznych nawet petabajty. Nie mo\u017cna go tak po prostu umie\u015bci\u0107 w lekkich kontenerach Docker.<\/p>\n<p>Z drugiej strony, prawie wszystkie nowoczesne bazy to ogromna ilo\u015b\u0107 logiki i komponent\u00f3w: transakcje, zapewnienie integralno\u015bci, procedury, relacyjne zale\u017cno\u015bci i wiele logiki. Znaczna cz\u0119\u015b\u0107 logiki bazy danych potrzebuje stosunkowo niewielkiego stanu. Gigabajty i terabajty s\u0105 bezpo\u015brednio wykorzystywane tylko przez ma\u0142\u0105 cz\u0119\u015b\u0107 logiki bazy danych zwi\u0105zanej z bezpo\u015brednim wykonywaniem zapyta\u0144.<\/p>\n<p>W zwi\u0105zku z tym pomys\u0142: je\u015bli cz\u0119\u015b\u0107 logiki dopuszcza stateless wykonanie, dlaczego by nie podzieli\u0107 bazy na cz\u0119\u015bci Stateful i Stateless.<\/p>\n<h2>Bezserwerowe rozwi\u0105zania dla OLAP<\/h2>\n<p>\nPrzyjrzyjmy si\u0119, jak mo\u017ce wygl\u0105da\u0107 podzia\u0142 bazy danych na cz\u0119\u015bci Stateful i Stateless na praktycznych przyk\u0142adach.<\/p>\n<p><img decoding=\"async\" alt=\"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego\" src=\"\/wp-content\/uploads\/2020\/08\/51793a5649e68dafc9e7ce395da9e065.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Na przyk\u0142ad, mamy analityczn\u0105 baz\u0119 danych<\/b>: dane zewn\u0119trzne (czerwony cylinder po lewej), proces ETL, kt\u00f3ry \u0142adowa\u0142 dane do bazy, oraz analityk, kt\u00f3ry wysy\u0142a zapytania SQL do bazy. To klasyczny schemat dzia\u0142ania hurtowni danych. <\/p>\n<p>W tym schemacie, warunkowo, proces ETL wykonuje si\u0119 raz. P\u00f3\u017aniej trzeba stale p\u0142aci\u0107 za serwery, na kt\u00f3rych dzia\u0142a baza z danymi za\u0142adowanymi przez ETL, aby mo\u017cna by\u0142o wysy\u0142a\u0107 zapytania. <\/p>\n<p>Rozwa\u017cmy alternatywne podej\u015bcie, kt\u00f3re zosta\u0142o wdro\u017cone w bazie AWS Athena Serverless. Tutaj nie ma serwera, kt\u00f3ry by\u0142by stale dedykowany do przechowywania za\u0142adowanych danych. Zamiast tego:<\/p>\n<ul>\n<li>U\u017cytkownik wysy\u0142a zapytanie SQL do Athena. Optymalizator Athena analizuje zapytanie SQL i szuka w magazynie metadanych konkretnych danych potrzebnych do wykonania zapytania.<\/li>\n<li>Optymalizator, na podstawie zgromadzonych danych, wyci\u0105ga potrzebne dane z zewn\u0119trznych \u017ar\u00f3de\u0142 do tymczasowego magazynu (tymczasowej bazy danych).<\/li>\n<li>W tymczasowym magazynie wykonuje si\u0119 zapytanie SQL od u\u017cytkownika, a wynik jest zwracany u\u017cytkownikowi. <\/li>\n<li>Tymczasowy magazyn jest czyszczony, zasoby s\u0105 zwalniane.<\/li>\n<\/ul>\n<p>W tej architekturze p\u0142acimy tylko za proces wykonania zapytania. Brak zapyta\u0144 \u2014 brak wydatk\u00f3w.<\/p>\n<p><img decoding=\"async\" alt=\"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego\" src=\"\/wp-content\/uploads\/2020\/08\/0e21282b66e3120524c2324811cb04a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo skuteczne podej\u015bcie i jest realizowane nie tylko w Athena Serverless, ale tak\u017ce w Redshift Spectrum (w AWS).<\/p>\n<p>Na przyk\u0142adzie Athena wida\u0107, \u017ce serwerowa baza danych dzia\u0142a na rzeczywistych zapytaniach z dziesi\u0105tkami i setkami terabajt\u00f3w danych. Dla setek terabajt\u00f3w potrzebne b\u0119d\u0105 setki serwer\u00f3w, ale nie musimy za nie p\u0142aci\u0107 \u2014 p\u0142acimy za zapytania. Pr\u0119dko\u015b\u0107 ka\u017cdego zapytania jest (bardzo) niska w por\u00f3wnaniu z wyspecjalizowanymi bazami analitycznymi, takimi jak Vertica, ale nie p\u0142acimy za okresy bezczynno\u015bci.<\/p>\n<p>Taka baza danych nadaje si\u0119 do rzadkich analitycznych zapyta\u0144 ad-hoc. Na przyk\u0142ad, gdy spontanicznie zdecydujemy si\u0119 sprawdzi\u0107 hipotez\u0119 na olbrzymiej ilo\u015bci danych. W takich przypadkach Athena sprawdza si\u0119 idealnie. Dla regularnych zapyta\u0144 taki system staje si\u0119 drogi. W takim przypadku nale\u017cy buforowa\u0107 dane w jakim\u015b wyspecjalizowanym rozwi\u0105zaniu. <\/p>\n<h2>Serverless dla rozwi\u0105za\u0144 OLTP<\/h2>\n<p>\nW poprzednim przyk\u0142adzie rozwa\u017cano zadania OLAP (analityczne). Teraz om\u00f3wimy zadania OLTP.<\/p>\n<p>Przedstawmy skalowalny PostgreSQL lub MySQL. Podnie\u015bmy standardow\u0105 zarz\u0105dzan\u0105 instancj\u0119 PostgreSQL lub MySQL na minimalnych zasobach. Kiedy na instancj\u0119 nap\u0142ywa wi\u0119ksze obci\u0105\u017cenie, do\u0142\u0105czamy dodatkowe repliki, na kt\u00f3re rozdzielamy cz\u0119\u015b\u0107 obci\u0105\u017cenia odczytowego. Je\u015bli nie ma zapyta\u0144 i obci\u0105\u017cenia \u2014 wy\u0142\u0105czamy repliki. Pierwsza instancja to master, a pozosta\u0142e to repliki.<\/p>\n<p>Ta idea zosta\u0142a zrealizowana w bazie o nazwie Aurora Serverless AWS. Zasada jest prosta: zapytania z zewn\u0119trznych aplikacji przyjmuje zesp\u00f3\u0142 proxy. Widz\u0105c wzrost obci\u0105\u017cenia, przydziela zasoby obliczeniowe z wst\u0119pnie uruchomionych minimalnych instancji \u2014 po\u0142\u0105czenie nast\u0119puje maksymalnie szybko. Wy\u0142\u0105czanie instancji odbywa si\u0119 w ten sam spos\u00f3b.<\/p>\n<p>W ramach Aurory istnieje poj\u0119cie Aurora Capacity Unit, ACU. To (umownie) instancja (serwer). Ka\u017cde konkretne ACU mo\u017ce by\u0107 master lub slave. Ka\u017cda jednostka pojemno\u015bci ma w\u0142asn\u0105 pami\u0119\u0107 RAM, procesor i minimalny dysk. W zwi\u0105zku z tym jedna instancja jest master, a pozosta\u0142e to repliki tylko do odczytu.<\/p>\n<p>Liczba tych dzia\u0142aj\u0105cych jednostek pojemno\u015bci Aurora jest parametrem konfigurowalnym. Minimalna liczba mo\u017ce wynosi\u0107 jeden lub zero (w takim przypadku baza nie dzia\u0142a, je\u015bli nie ma zapyta\u0144).<\/p>\n<p><img decoding=\"async\" alt=\"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego\" src=\"\/wp-content\/uploads\/2020\/08\/ab034e66fbd8874f062a656afa7044c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGdy baza otrzymuje zapytania, zesp\u00f3\u0142 proxy podnosi jednostki pojemno\u015bci Aurora, zwi\u0119kszaj\u0105c zasoby wydajno\u015bci systemu. Mo\u017cliwo\u015b\u0107 zwi\u0119kszania i zmniejszania zasob\u00f3w pozwala systemowi \u201e\u017conglowa\u0107\u201d zasobami: automatycznie wy\u0142\u0105cza\u0107 poszczeg\u00f3lne ACU (zast\u0119puj\u0105c je nowymi) i wdra\u017ca\u0107 na wy\u0142\u0105czone zasoby wszystkie aktualne aktualizacje.<\/p>\n<p>Baza Aurora Serverless mo\u017ce skalowa\u0107 obci\u0105\u017cenie odczytowe. Ale w dokumentacji nie jest to powiedziane wprost. Mo\u017ce powsta\u0107 wra\u017cenie, \u017ce mog\u0105 uruchamia\u0107 multi-master. \u017badnego magicznego aspektu tu nie ma. <\/p>\n<p>Ta baza dobrze nadaje si\u0119 do unikania wydawania ogromnych pieni\u0119dzy na systemy z nieprzewidywalnym dost\u0119pem. Na przyk\u0142ad, przy tworzeniu MVP lub marketingowych stron wizyt\u00f3wkowych, zwykle nie spodziewamy si\u0119 stabilnego obci\u0105\u017cenia. W zwi\u0105zku z tym, przy braku dost\u0119pu, nie p\u0142acimy za instancje. Gdy nagle pojawia si\u0119 obci\u0105\u017cenie, na przyk\u0142ad po konferencji lub kampanii reklamowej, t\u0142umy ludzi odwiedzaj\u0105 stron\u0119, a obci\u0105\u017cenie gwa\u0142townie ro\u015bnie, Aurora Serverless automatycznie przyjmuje to obci\u0105\u017cenie i szybko uruchamia brakuj\u0105ce zasoby (ACU). Po zako\u0144czeniu konferencji wszyscy zapominaj\u0105 o prototypie, serwery (ACU) gasn\u0105, a wydatki spadaj\u0105 do zera \u2014 to wygodne.<\/p>\n<p>To rozwi\u0105zanie nie nadaje si\u0119 do stabilnego wysokiego obci\u0105\u017cenia, poniewa\u017c nie potrafi skalowa\u0107 obci\u0105\u017cenia zapisu. Wszystkie te po\u0142\u0105czenia i od\u0142\u0105czenia zasob\u00f3w odbywaj\u0105 si\u0119 w momencie tzw. \u201epunktu skalowania\u201d \u2014 momentu, w kt\u00f3rym baza nie jest trzymana przez transakcj\u0119 ani przez tymczasowe tabele. Na przyk\u0142ad, w ci\u0105gu tygodnia punkt skalowania mo\u017ce si\u0119 nie zdarzy\u0107, a baza dzia\u0142a na tych samych zasobach i po prostu nie mo\u017ce ani si\u0119 rozbudowa\u0107, ani skurczy\u0107. <\/p>\n<p>Nie ma magii \u2014 to zwyk\u0142y PostgreSQL. Ale proces dodawania maszyn i od\u0142\u0105czania jest cz\u0119\u015bciowo zautomatyzowany.<\/p>\n<h2>Serverless by design<\/h2>\n<p>\nAurora Serverless to stara baza, przepisana pod chmury, aby wykorzysta\u0107 oddzielne zalety Serverless. A teraz opowiem o bazie, kt\u00f3ra zosta\u0142a pierwotnie napisana pod chmury, w podej\u015bciu serverless \u2014 Serverless-by-design. Zosta\u0142a od razu zaprojektowana bez za\u0142o\u017cenia, \u017ce dzia\u0142a na fizycznych serwerach.<\/p>\n<p>Ta baza nazywa si\u0119 Snowflake. Ma trzy kluczowe bloki.<\/p>\n<p><img decoding=\"async\" alt=\"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego\" src=\"\/wp-content\/uploads\/2020\/08\/15f9f07ed0281686e509ca6ced387db3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPierwszy \u2013 to blok metadanych. To szybki serwis in-memory, kt\u00f3ry rozwi\u0105zuje kwestie zwi\u0105zane z bezpiecze\u0144stwem, metadanymi, transakcjami, optymalizacj\u0105 zapyta\u0144 (na ilustracji po lewej).<\/p>\n<p>Drugi blok \u2013 to wiele wirtualnych klastr\u00f3w obliczeniowych do oblicze\u0144 (na ilustracji \u2013 zestaw niebieskich k\u00f3\u0142ek).<\/p>\n<p>Trzeci blok \u2013 to system przechowywania danych oparty na S3. S3 to bezwymiarowe obiektowe przechowywanie w AWS, co\u015b w rodzaju bezwymiarowego Dropboxa dla biznesu.<\/p>\n<p>Przyjrzyjmy si\u0119, jak dzia\u0142a Snowflake, zak\u0142adaj\u0105c zimny start. To znaczy, \u017ce baza istnieje, dane zosta\u0142y za\u0142adowane, a zapyta\u0144 nie ma. W zwi\u0105zku z tym, je\u015bli nie ma zapyta\u0144 do bazy, uruchomiony mamy szybki serwis Metadata w pami\u0119ci (pierwszy blok). A w naszym przypadku mamy r\u00f3wnie\u017c magazyn S3, w kt\u00f3rym znajduj\u0105 si\u0119 dane tabel, podzielone na tzw. mikropartycje. Upraszczaj\u0105c: je\u015bli w tabeli znajduj\u0105 si\u0119 transakcje, to mikropartycje to dni transakcji. Ka\u017cdy dzie\u0144 to oddzielna mikropartycja, oddzielny plik. Gdy baza dzia\u0142a w takim trybie, p\u0142acisz tylko za miejsce zajmowane przez dane. Co wi\u0119cej, stawka za miejsce jest bardzo niska (szczeg\u00f3lnie bior\u0105c pod uwag\u0119 znaczne kompresje). Serwis metadanych r\u00f3wnie\u017c dzia\u0142a ca\u0142y czas, ale aby zoptymalizowa\u0107 zapytania, nie potrzebuje wielu zasob\u00f3w, wi\u0119c mo\u017cna uzna\u0107 go za warunkowo bezp\u0142atny. <\/p>\n<p>Teraz wyobra\u017amy sobie, \u017ce u\u017cytkownik przyszed\u0142 do naszej bazy i z\u0142o\u017cy\u0142 zapytanie SQL. Zapytanie SQL jest natychmiast kierowane do przetworzenia do serwisu Metadata. Odpowiednio, po otrzymaniu zapytania, ten serwis analizuje zapytanie, dost\u0119pne dane, uprawnienia u\u017cytkownika i, je\u015bli wszystko jest w porz\u0105dku, tworzy plan przetwarzania zapytania.<\/p>\n<p>Nast\u0119pnie serwis inicjuje uruchomienie klastra obliczeniowego. Klastr obliczeniowy to klaster serwer\u00f3w, kt\u00f3re przeprowadzaj\u0105 obliczenia. To znaczy, \u017ce klaster mo\u017ce zawiera\u0107 1 serwer, 2 serwery, 4, 8, 16, 32 \u2014 ile chcesz. Sk\u0142adasz zapytanie, a w jego odpowiedzi natychmiast rozpoczyna si\u0119 uruchamianie tego klastra. To naprawd\u0119 zajmuje sekundy.<\/p>\n<p><img decoding=\"async\" alt=\"W kierunku baz danych bezserwerowych \u2014 jak i dlaczego\" src=\"\/wp-content\/uploads\/2020\/08\/51b11aee0b0868681c4978f5becd1f1d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNast\u0119pnie, po uruchomieniu klastra, mikropartycje potrzebne do przetworzenia Twojego zapytania s\u0105 kopiowane z S3 do klastra. Oznacza to, \u017ce je\u015bli do wykonania zapytania SQL potrzebne s\u0105 dwie partycje z jednej tabeli i jedna z drugiej, do klastra zostan\u0105 skopiowane tylko te trzy potrzebne partycje, a nie wszystkie tabele w ca\u0142o\u015bci. Dlatego, poniewa\u017c wszystko znajduje si\u0119 w ramach jednego centrum danych i jest po\u0142\u0105czone bardzo szybkimi kana\u0142ami, ca\u0142y proces przesy\u0142ania danych odbywa si\u0119 bardzo szybko: w ci\u0105gu sekund, rzadko w ci\u0105gu minut, chyba \u017ce mamy do czynienia z jakimi\u015b niezwykle z\u0142o\u017conymi zapytaniami. W zwi\u0105zku z tym mikropartycje s\u0105 kopiowane do klastra obliczeniowego, a po zako\u0144czeniu tego procesu zapytanie SQL jest wykonywane na tym klastrze. Wynikiem tego zapytania mo\u017ce by\u0107 jeden wiersz, kilka wierszy lub tabela \u2014 s\u0105 one nast\u0119pnie wysy\u0142ane do u\u017cytkownika, aby m\u00f3g\u0142 je pobra\u0107, wy\u015bwietli\u0107 w swoim narz\u0119dziu BI lub w inny spos\u00f3b wykorzysta\u0107.<\/p>\n<p>Ka\u017cde zapytanie SQL mo\u017ce nie tylko oblicza\u0107 agregaty z wcze\u015bniej za\u0142adowanych danych, ale tak\u017ce \u0142adowa\u0107\/formowa\u0107 nowe dane w bazie. Oznacza to, \u017ce mo\u017ce to by\u0107 zapytanie, kt\u00f3re na przyk\u0142ad wstawia nowe rekordy do innej tabeli, co prowadzi do powstania nowej partycji w klastrze obliczeniowym, kt\u00f3ra z kolei automatycznie zostaje zapisana w jednolitym magazynie S3.<\/p>\n<p>Opisany powy\u017cej scenariusz, od momentu przybycia u\u017cytkownika do uruchomienia klastra, za\u0142adunku danych, wykonania zapyta\u0144 i otrzymania wynik\u00f3w, jest naliczany wed\u0142ug stawki za minuty korzystania z uruchomionego wirtualnego klastra obliczeniowego, wirtualnego magazynu. Stawka r\u00f3\u017cni si\u0119 w zale\u017cno\u015bci od strefy AWS i rozmiaru klastra, ale \u015brednio wynosi kilka dolar\u00f3w za godzin\u0119. Klaster sk\u0142adaj\u0105cy si\u0119 z czterech maszyn kosztuje dwa razy wi\u0119cej ni\u017c klaster z dw\u00f3ch maszyn, a klaster z o\u015bmiu maszyn jeszcze dwa razy wi\u0119cej. Dost\u0119pne s\u0105 opcje z 16 lub 32 maszynami, w zale\u017cno\u015bci od z\u0142o\u017cono\u015bci zapyta\u0144. P\u0142acisz jednak tylko za te minuty, kiedy klaster rzeczywi\u015bcie dzia\u0142a, poniewa\u017c gdy zapyta\u0144 nie ma, mo\u017cesz jakby odczeka\u0107, a po 5-10 minutach oczekiwania (mo\u017cna to dostosowa\u0107) klaster sam si\u0119 wy\u0142\u0105czy, zwalniaj\u0105c zasoby i staj\u0105c si\u0119 bezp\u0142atnym.<\/p>\n<p>Scenariusz, w kt\u00f3rym sk\u0142adaj\u0105c zapytanie, klaster uruchamia si\u0119, m\u00f3wi\u0105c w skr\u00f3cie, w ci\u0105gu minuty, przez kolejn\u0105 minut\u0119 wykonuje obliczenia, a nast\u0119pnie przez pi\u0119\u0107 minut si\u0119 wy\u0142\u0105cza, a w rezultacie p\u0142acisz za siedem minut pracy tego klastra, a nie za miesi\u0105ce czy lata.<\/p>\n<p>Pierwszy scenariusz opisa\u0142 u\u017cycie Snowflake w wariancie jednego u\u017cytkownika. Teraz wyobra\u017amy sobie, \u017ce u\u017cytkownik\u00f3w jest wielu, co ju\u017c bardziej zbli\u017ca si\u0119 do rzeczywistego scenariusza.<\/p>\n<p>Przypu\u015b\u0107my, \u017ce mamy wielu analityk\u00f3w i raporty Tableau, kt\u00f3re nieustannie bombarduj\u0105 nasz\u0105 baz\u0119 du\u017c\u0105 ilo\u015bci\u0105 prostych analitycznych zapyta\u0144 SQL.<\/p>\n<p>Ponadto za\u0142\u00f3\u017cmy, \u017ce mamy pomys\u0142owych Data Scientist\u00f3w, kt\u00f3rzy pr\u00f3buj\u0105 robi\u0107 z danymi rzeczy niezwyk\u0142e, operuj\u0105c dziesi\u0105tkami terabajt\u00f3w, analizuj\u0105c miliardy i tryliony wierszy danych. <\/p>\n<p>Dla opisanych powy\u017cej dw\u00f3ch typ\u00f3w obci\u0105\u017cenia Snowflake umo\u017cliwia uruchamianie kilku niezale\u017cnych klastr\u00f3w obliczeniowych o r\u00f3\u017cnej mocy. Te klastry obliczeniowe dzia\u0142aj\u0105 niezale\u017cnie, ale na wsp\u00f3lnych, zgody danych.<\/p>\n<p>Dla du\u017cej liczby lekkich zapyta\u0144 mo\u017cna uruchomi\u0107 2-3 ma\u0142e klastry, na przyk\u0142ad po 2 maszyny ka\u017cdy. To zachowanie mo\u017cna wdro\u017cy\u0107 r\u00f3wnie\u017c za pomoc\u0105 automatycznych ustawie\u0144. M\u00f3wi\u0105c: \u201eSnowflake, uruchom ma\u0142y klaster. Je\u015bli obci\u0105\u017cenie wzro\u015bnie ponad okre\u015blony parametr, uruchom analogiczny drugi, trzeci. Kiedy obci\u0105\u017cenie zacznie male\u0107 \u2014 zga\u015b zb\u0119dne\u201d. Dzi\u0119ki temu niezale\u017cnie od tego, ile analityk\u00f3w przychodzi i zaczyna przegl\u0105da\u0107 raporty, wszystkim wystarczy zasob\u00f3w.<\/p>\n<p>Jednocze\u015bnie, je\u015bli analitycy \u015bpi\u0105, a nikt nie przegl\u0105da raport\u00f3w \u2014 klastry mog\u0105 ca\u0142kowicie si\u0119 wy\u0142\u0105czy\u0107, a Ty przestajesz za nie p\u0142aci\u0107.<\/p>\n<p>Jednak w przypadku ci\u0119\u017cszych zapyta\u0144 (od Data Scientist\u00f3w) mo\u017cesz uruchomi\u0107 jeden bardzo du\u017cy klaster na przyk\u0142ad 32 maszyn. Ten klaster r\u00f3wnie\u017c b\u0119dzie op\u0142acany tylko za te minuty i godziny, kiedy dzia\u0142a Twoje ogromne zapytanie.<\/p>\n<p>Opisana powy\u017cej mo\u017cliwo\u015b\u0107 pozwala dzieli\u0107 obci\u0105\u017cenia na klastry nie tylko dla 2, ale i dla wi\u0119cej rodzaj\u00f3w obci\u0105\u017cenia (ETL, monitorowanie, materializacja raport\u00f3w,\u2026).<\/p>\n<p>Podsumujmy Snowflake. Baza \u0142\u0105czy pi\u0119kn\u0105 ide\u0119 z funkcjonaln\u0105 realizacj\u0105. W ManyChat u\u017cywamy Snowflake do analizy wszystkich dost\u0119pnych danych. Mamy nie trzy klastry, jak w przyk\u0142adzie, a od 5 do 9, w r\u00f3\u017cnych rozmiarach. Posiadamy klastrowe maszyny 16-rdzeniowe, 2-rdzeniowe, a tak\u017ce super ma\u0142e 1-rdzeniowe do niekt\u00f3rych zada\u0144. One efektywnie rozdzielaj\u0105 obci\u0105\u017cenie i pozwalaj\u0105 nam zaoszcz\u0119dzi\u0107.<\/p>\n<p>Baza skutecznie skalowalna jest na obci\u0105\u017ceniach odczytu i zapisu. To ogromna r\u00f3\u017cnica i znacz\u0105cy prze\u0142om w por\u00f3wnaniu do 'Aurory', kt\u00f3ra obs\u0142ugiwa\u0142a tylko obci\u0105\u017cenie odczytu. Snowflake umo\u017cliwia skalowanie tych obci\u0105\u017ce\u0144 obliczeniowymi klastrami, w tym zapisu. Jak wspomnia\u0142em, w ManyChat u\u017cywamy kilku klastr\u00f3w, a ma\u0142e i super ma\u0142e klastry najcz\u0119\u015bciej wykorzystywane s\u0105 do ETL, do \u0142adowania danych. Analitycy pracuj\u0105 z kolei na \u015brednich klastrach, kt\u00f3re s\u0105 ca\u0142kowicie niezagro\u017cone obci\u0105\u017ceniem ETL, dlatego dzia\u0142aj\u0105 bardzo szybko. <\/p>\n<p>Odpowiednio, baza dobrze nadaje si\u0119 do zada\u0144 OLAP. Niestety, nie nadaje si\u0119 jeszcze do obci\u0105\u017ce\u0144 OLTP. Po pierwsze, ta baza jest kolumnowa, co poci\u0105ga za sob\u0105 odpowiednie konsekwencje. Po drugie, sama koncepcja, w kt\u00f3rej na ka\u017cde zapytanie odpowiednio uruchamiasz obliczeniowy klaster i obci\u0105\u017casz go danymi, niestety, dla obci\u0105\u017ce\u0144 OLTP jest jeszcze niewystarczaj\u0105co szybka. Sekundy oczekiwania w przypadku zada\u0144 OLAP s\u0105 akceptowalne, ale w przypadku obci\u0105\u017ce\u0144 OLTP s\u0105 niedopuszczalne; lepiej by\u0142oby w 100 ms, a jeszcze lepiej \u2014 w 10 ms.<\/p>\n<h2>Podsumowanie<\/h2>\n<p>\nBaza danych bezserwerowa mo\u017cliwa jest dzi\u0119ki podzia\u0142owi bazy danych na cz\u0119\u015bci Stateless i Stateful. Z pewno\u015bci\u0105 zauwa\u017cy\u0142e\u015b, \u017ce we wszystkich podanych przyk\u0142adach cz\u0119\u015b\u0107 Stateful \u2014 to, powiedzmy, przechowywanie mikropartycji w S3, a Stateless \u2014 to optymalizator, praca z metadanymi, przetwarzanie kwestii bezpiecze\u0144stwa, kt\u00f3re mog\u0105 by\u0107 uruchomione jako niezale\u017cne, lekkie us\u0142ugi Stateless.<\/p>\n<p>Wykonywanie zapyta\u0144 SQL mo\u017cna r\u00f3wnie\u017c postrzega\u0107 jako us\u0142ugi z lekkim stanem, kt\u00f3re mog\u0105 dzia\u0142a\u0107 w trybie bezserwerowym, jak obliczeniowe klastry Snowflake, pobiera\u0107 tylko potrzebne dane, wykonywa\u0107 zapytanie i 'wygasza\u0107'.<\/p>\n<p>Bazy danych bezserwerowych poziomu produkcyjnego s\u0105 ju\u017c dost\u0119pne i dzia\u0142aj\u0105. Te bazy bezserwerowe s\u0105 gotowe do radzenia sobie z zadaniami OLAP. Niestety, w przypadku zada\u0144 OLTP stosowane s\u0105... z pewnymi zastrze\u017ceniami, poniewa\u017c istniej\u0105 ograniczenia. Z jednej strony jest to wada. Z drugiej strony to szansa. Mo\u017ce kto\u015b z czytelnik\u00f3w znajdzie spos\u00f3b, aby baza OLTP sta\u0142a si\u0119 ca\u0142kowicie bezserwerowa, bez ogranicze\u0144 Aurora.<\/p>\n<p>Mam nadziej\u0119, \u017ce to by\u0142o interesuj\u0105ce. Za bezserwerow\u0105 przysz\u0142o\u015b\u0107 \ud83d\ude42<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/514298\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u043e\u043b\u043e\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\u0439. \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u0410\u0432\u0438\u0442\u043e \u0438 \u0448\u0435\u0441\u0442\u044c \u043b\u0435\u0442 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u043b Data Platform, \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0431\u0430\u0437\u0430\u043c\u0438: \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 (Vertica, ClickHouse), \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u043c\u0438 \u0438 OLTP (Redis, Tarantool, VoltDB, MongoDB, PostgreSQL). \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0445, \u0438 \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u043a\u0435\u0439\u0441\u0430\u043c\u0438 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0435\u0439\u0447\u0430\u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91636,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91635","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=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u043e\u043b\u043e\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\u0439.\" \/>\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\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem\" \/>\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\u041d\u0430 \u043f\u0443\u0442\u0438 \u043a \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c \u0431\u0430\u0437\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u043e\u043b\u043e\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem\" \/>\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-08-15T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-15T17:42:23+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\udd47Na drodze do bezserwerowych baz danych \u2014 jak i dlaczego | ProHoster","description":"Cze\u015b\u0107 wszystkim! Nazywam si\u0119 G\u0142\u00f3w Nikolaj.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem","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\u041d\u0430 \u043f\u0443\u0442\u0438 \u043a \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c \u0431\u0430\u0437\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u043e\u043b\u043e\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\u0439.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/na-puti-k-besservernym-bazam-dannyh-kak-i-zachem","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-08-15T17:42:23+00:00","article:modified_time":"2020-08-15T17:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91635","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-02-28 12:23:25","updated":"2022-09-27 17:18:10","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\/91635","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=91635"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/91635\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/91636"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=91635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=91635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=91635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}