{"id":91846,"date":"2020-08-19T19:41:57","date_gmt":"2020-08-19T17:41:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster"},"modified":"2020-08-19T19:41:57","modified_gmt":"2020-08-19T17:41:57","slug":"o-pereezde-s-redis-na-redis-cluster","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","title":{"rendered":"O przeprowadzce z Redis do Redis-cluster","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"O przeprowadzce z Redis do Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/ea8bc47f73ef3b06ccfdf94d323592bf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przychodz\u0105c do produktu, kt\u00f3ry rozwija si\u0119 od ponad dziesi\u0119ciu lat, zupe\u0142nie nie dziwi fakt napotkania w nim przestarza\u0142ych technologii. Ale co, je\u015bli za sze\u015b\u0107 miesi\u0119cy b\u0119dziesz musia\u0142 obs\u0142u\u017cy\u0107 obci\u0105\u017cenie dziesi\u0119\u0107 razy wy\u017csze, a cena awarii wzro\u015bnie setki razy? W takim przypadku potrzebny jest \u015bwietny in\u017cynier Highload. Ale w obliczu braku odpowiedniego, rozwi\u0105zanie problemu powierzono mnie. W pierwszej cz\u0119\u015bci artyku\u0142u opowiem, jak przeprowadzali\u015bmy si\u0119 z Redis na Redis-cluster, a w drugiej cz\u0119\u015bci podam porady, jak zacz\u0105\u0107 korzysta\u0107 z klastra i na co zwr\u00f3ci\u0107 uwag\u0119 podczas eksploatacji.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"vybor-tehnologii\">Wyb\u00f3r technologii<\/h1>\n<p><\/p>\n<p>Czy naprawd\u0119 jest tak \u017ale <em>oddzielny Redis<\/em> (standalone redis) w konfiguracji 1 master i N slave'\u00f3w? Dlaczego nazywam to przestarza\u0142\u0105 technologi\u0105?<\/p>\n<p><\/p>\n<blockquote><p>Nie, Redis nie jest taki z\u0142y... Jednak s\u0105 pewne niedoci\u0105gni\u0119cia, kt\u00f3rych nie mo\u017cna zignorowa\u0107.<\/p><\/blockquote>\n<p><\/p>\n<ul>\n<li>\n<p>Po pierwsze, Redis nie obs\u0142uguje mechanizm\u00f3w awaryjnego przywracania po awarii mastera. Aby rozwi\u0105za\u0107 ten problem, wykorzystali\u015bmy konfiguracj\u0119 z automatycznym prze\u0142\u0105czaniem VIP-\u00f3w na nowego mastera, zmian\u0105 roli jednego ze slave'\u00f3w i prze\u0142\u0105czaniem pozosta\u0142ych. Ten mechanizm dzia\u0142a\u0142, ale nie mo\u017cna go by\u0142o nazwa\u0107 wiarygodnym rozwi\u0105zaniem. Po pierwsze, zdarza\u0142y si\u0119 fa\u0142szywe alarmy, a po drugie, by\u0142 jednorazowy i po jego uruchomieniu wymaga\u0142 r\u0119cznych dzia\u0142a\u0144 do zresetowania.<\/p>\n<p>\n<\/li>\n<li>\n<p>Po drugie, posiadanie tylko jednego mastera prowadzi\u0142o do problemu z shardowaniem. Musieli\u015bmy tworzy\u0107 kilka niezale\u017cnych klastr\u00f3w '1 master i N slave'\u00f3w', a nast\u0119pnie r\u0119cznie rozk\u0142ada\u0107 bazy na tych maszynach i mie\u0107 nadziej\u0119, \u017ce jutro jedna z baz nie rozro\u015bnie si\u0119 na tyle, \u017ce b\u0119dzie j\u0105 trzeba przenie\u015b\u0107 na oddzielny instans.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Jakie s\u0105 opcje?<\/p>\n<p><\/p>\n<ul>\n<li>Najdro\u017cszym i najbardziej rozbudowanym rozwi\u0105zaniem jest Redis-Enterprise. To pude\u0142kowe rozwi\u0105zanie z pe\u0142nym wsparciem technicznym. Mimo \u017ce wygl\u0105da idealnie pod wzgl\u0119dem technicznym, nie pasowa\u0142o nam z powod\u00f3w ideologicznych. <\/li>\n<li>Redis-cluster. Z pude\u0142ka ma wsparcie dla awaryjnego prze\u0142\u0105czania mastera i shardowania. Interfejs praktycznie nie r\u00f3\u017cni si\u0119 od zwyk\u0142ej wersji. Wygl\u0105da obiecuj\u0105co, o pu\u0142apkach porozmawiamy dalej.<\/li>\n<li>Tarantool, Memcache, Aerospike i inne. Wszystkie te narz\u0119dzia robi\u0105 mniej wi\u0119cej to samo. Ale ka\u017cde z nich ma swoje wady. Postanowili\u015bmy nie wk\u0142ada\u0107 wszystkich jajek do jednego koszyka. Memcache i Tarantool u\u017cywamy do innych zada\u0144, a zanim przejd\u0119 dalej, powiem, \u017ce w naszej praktyce mieli\u015bmy z nimi wi\u0119cej problem\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"specifika-ispolzovaniya\">Specyfika u\u017cycia<\/h1>\n<p><\/p>\n<p>Przyjrzyjmy si\u0119, jakie zadania historycznie rozwi\u0105zywali\u015bmy przy u\u017cyciu Redis i jakie funkcjonalno\u015bci wykorzystywali\u015bmy:<\/p>\n<p><\/p>\n<ul>\n<li>Cache przed zapytaniami do zdalnych serwis\u00f3w takich jak 2GIS | Golang<br \/>\n<blockquote><p>Pobierz Ustaw MGet MSet \"Wybierz DB\"\n<\/p><\/blockquote>\n<\/li>\n<li>Cache przed MYSQL | PHP<br \/>\n<blockquote><p>Pobierz Ustaw MGet MSet Przeskanuj \"Klucz wed\u0142ug wzorca\" \"Wybierz DB\"\n<\/p><\/blockquote>\n<\/li>\n<li>G\u0142\u00f3wne magazyn dla us\u0142ugi obs\u0142ugi sesji i wsp\u00f3\u0142rz\u0119dnych kierowc\u00f3w | Golang<br \/>\n<blockquote><p>Pobierz Ustaw MGet MSet \"Wybierz DB\" \"Dodaj klucz GEO\" \"Pobierz klucz GEO\" Przeskanuj\n<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Jak wida\u0107, \u017cadnej wy\u017cszej matematyki. W czym wi\u0119c tkwi problem? Przyjrzyjmy si\u0119 ka\u017cdemu metodzie osobno.<\/p>\n<p><\/p>\n<p>Metoda<br \/>\nOpis<br \/>\nCechy Redis-cluster<br \/>\nRozwi\u0105zanie<\/p>\n<p>GET SET<br \/>\nZapisz\/odczytaj klucz<\/p>\n<p>MGET MSET<br \/>\nZapisz\/odczytaj kilka kluczy<br \/>\nKlucze b\u0119d\u0105 roz\u0142o\u017cone na r\u00f3\u017cnych w\u0119z\u0142ach. Gotowe biblioteki potrafi\u0105 wykonywa\u0107 operacje typu Multi tylko w ramach jednego w\u0119z\u0142a<br \/>\nZast\u0105p MGET pipeline\u2019em z N operacjami GET<\/p>\n<p>SELECT DB<br \/>\nWybierz baz\u0119, z kt\u00f3r\u0105 b\u0119dziemy pracowa\u0107<br \/>\nNie obs\u0142uguje wielu baz danych<br \/>\nTrzymaj wszystko w jednej bazie. Dodaj do kluczy prefiksy<\/p>\n<p>SCAN<br \/>\nPrzejd\u017a przez wszystkie klucze w bazie<br \/>\nPoniewa\u017c mamy jedn\u0105 baz\u0119, przeszukiwanie wszystkich kluczy w klastrze jest zbyt kosztowne<br \/>\nUtrzymywa\u0107 inwariant wewn\u0105trz jednego klucza i robi\u0107 HSCAN po tym kluczu. Lub zrezygnowa\u0107 ca\u0142kowicie<\/p>\n<p>GEO<br \/>\nOperacje zwi\u0105zane z geokluczem<br \/>\nGeoklucz nie jest shardowany<\/p>\n<p>KEY BY PATTERN<br \/>\nWyszukiwanie klucza wed\u0142ug wzorca<br \/>\nPoniewa\u017c mamy jedn\u0105 baz\u0119, b\u0119dziemy szuka\u0107 w\u015br\u00f3d wszystkich kluczy w klastrze. Zbyt kosztowne<br \/>\nZrezygnowa\u0107 lub utrzymywa\u0107 inwariant, jak w przypadku SCAN-a<\/p>\n<p><\/p>\n<h1 id=\"redis-vs-redis-cluster\">Redis vs Redis-cluster<\/h1>\n<p><\/p>\n<p>Czego tracimy i co zyskujemy przy przej\u015bciu na klaster?<\/p>\n<p><\/p>\n<ul>\n<li>Wady: tracimy funkcjonalno\u015b\u0107 kilku baz. \n<ul>\n<li>Je\u015bli chcemy przechowywa\u0107 w jednym klastrze logicznie niespowi\u0105zane dane, b\u0119dziemy musieli stworzy\u0107 rozwi\u0105zania w postaci prefiks\u00f3w. <\/li>\n<li>Tracimy wszystkie operacje \u201ena bazie\u201d, takie jak SCAN, DBSIZE, CLEAR DB itd.<\/li>\n<li>Operacje wielokrotne sta\u0142y si\u0119 znacznie trudniejsze do realizacji, poniewa\u017c mo\u017ce by\u0107 wymagany dost\u0119p do kilku w\u0119z\u0142\u00f3w.<\/li>\n<\/ul>\n<\/li>\n<li>Zalety: \n<ul>\n<li>Odporno\u015b\u0107 na awarie w postaci awaryjnego prze\u0142\u0105czania lidera.<\/li>\n<li>Shardowanie po stronie Redis.<\/li>\n<li>Przenoszenie danych mi\u0119dzy w\u0119z\u0142ami atomowo i bez przestoj\u00f3w.<\/li>\n<li>Dodawanie i redystrybucja mocy i obci\u0105\u017ce\u0144 bez przestoj\u00f3w.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><em>Stwierdzi\u0142bym, \u017ce je\u015bli nie musisz zapewnia\u0107 wysokiego poziomu odporno\u015bci na awarie, to przeprowadzka na klaster nie jest tego warta, poniewa\u017c mo\u017ce by\u0107 to zadanie niezbyt proste. Ale je\u015bli wybierasz mi\u0119dzy oddzieln\u0105 wersj\u0105 a klastrem, to warto wybra\u0107 klaster, poniewa\u017c nie jest gorszy, a dodatkowo zdejmie z ciebie cz\u0119\u015b\u0107 b\u00f3lu g\u0142owy.<\/em><\/p>\n<p><\/p>\n<h1 id=\"podgotovka-k-pereezdu\">Przygotowanie do przeprowadzki<\/h1>\n<p><\/p>\n<p>Zacznijmy od wymaga\u0144 dotycz\u0105cych przeprowadzki:<\/p>\n<p><\/p>\n<ul>\n<li>Musimy zapewni\u0107, \u017ce b\u0119dzie bezszwowa. Ca\u0142kowite zatrzymanie us\u0142ugi na 5 minut nas nie satysfakcjonuje.<\/li>\n<li>Musimy zapewni\u0107, \u017ce b\u0119dzie jak najbardziej bezpieczna i stopniowa. Chcieliby\u015bmy mie\u0107 pewn\u0105 kontrol\u0119 nad sytuacj\u0105. Nie zamierzamy wrzuca\u0107 wszystkiego naraz i modli\u0107 si\u0119 nad przyciskiem przywracania.<\/li>\n<li>Minimalne straty danych podczas przeprowadzki. Rozumiemy, \u017ce przeprowadzka atomowa b\u0119dzie bardzo trudna, wi\u0119c dopuszczamy pewn\u0105 niesynchronizacj\u0119 mi\u0119dzy danymi w zwyk\u0142ym a klastrowym Redis.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"obsluzhivanie-klastera\">Utrzymanie klastra<\/h1>\n<p><\/p>\n<p>Przed sam\u0105 przeprowadzk\u0105 warto si\u0119 zastanowi\u0107, czy mo\u017cemy utrzyma\u0107 klaster:<\/p>\n<p><\/p>\n<ul>\n<li>Wykresy. U\u017cywamy Prometheusa i Grafany do wizualizacji obci\u0105\u017cenia procesor\u00f3w, zaj\u0119tej pami\u0119ci, liczby klient\u00f3w, liczby operacji GET, SET, AUTH itd.<\/li>\n<li>Ekspertyza. Wyobra\u017a sobie, \u017ce jutro pod twoj\u0105 odpowiedzialno\u015bci\u0105 b\u0119dzie ogromny klaster. Je\u015bli si\u0119 zepsuje, nikt opr\u00f3cz ciebie go nie naprawi. Je\u015bli zacznie zwalnia\u0107 \u2014 wszyscy przyjd\u0105 do ciebie. Je\u015bli trzeba doda\u0107 zasoby lub zr\u00f3wnowa\u017cy\u0107 obci\u0105\u017cenie \u2014 zn\u00f3w do ciebie. Aby nie posiwie\u0107 w wieku 25 lat, warto przewidzie\u0107 te przypadki i wcze\u015bniej sprawdzi\u0107, jak technologia zareaguje na r\u00f3\u017cne dzia\u0142ania. O tym porozmawiamy bardziej szczeg\u00f3\u0142owo w sekcji \u201eEkspertyza\u201d.<\/li>\n<li>Monitoring i powiadomienia. Kiedy klaster si\u0119 psuje, chcemy dowiedzie\u0107 si\u0119 o tym jako pierwsi. Ograniczyli\u015bmy si\u0119 do powiadamiania, \u017ce wszystkie w\u0119z\u0142y zwracaj\u0105 t\u0119 sam\u0105 informacj\u0119 o stanie klastra (tak, zdarza si\u0119 i inaczej). A inne problemy szybciej zauwa\u017cysz dzi\u0119ki powiadomieniom z us\u0142ug-klient\u00f3w Redis.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"pereezd\">Przeprowadzka<\/h1>\n<p><\/p>\n<p>Jak b\u0119dziemy przeprowadza\u0107:<\/p>\n<p><\/p>\n<ul>\n<li>Po pierwsze, musimy przygotowa\u0107 bibliotek\u0119 do pracy z klastrem. Jako podstaw\u0119 dla wersji w Go wzi\u0119li\u015bmy go-redis i nieco go zmodyfikowali\u015bmy. Zrealizowali\u015bmy metody Multi za pomoc\u0105 pipeline'\u00f3w, a tak\u017ce nieco poprawili\u015bmy zasady powtarzania zapyta\u0144. W wersji dla PHP napotkali\u015bmy wi\u0119cej problem\u00f3w, ale ostatecznie zdecydowali\u015bmy si\u0119 na php-redis. Niedawno wprowadzili wsparcie dla klastra, kt\u00f3re naszym zdaniem wygl\u0105da dobrze.<\/li>\n<li>Nast\u0119pnie musimy uruchomi\u0107 sam klaster. Robi si\u0119 to dos\u0142ownie w dw\u00f3ch poleceniach na podstawie pliku konfiguracyjnego. Szczeg\u00f3\u0142owo om\u00f3wimy konfiguracj\u0119 poni\u017cej.<\/li>\n<li>Do stopniowego przej\u015bcia u\u017cywamy trybu dry-mode. Poniewa\u017c mamy dwie wersje biblioteki o identycznym interfejsie (jedna dla wersji standardowej, druga dla klastra), nic nie stoi na przeszkodzie, by stworzy\u0107 wrapper, kt\u00f3ry b\u0119dzie dzia\u0142a\u0142 z osobn\u0105 wersj\u0105 i r\u00f3wnocze\u015bnie duplikowa\u0142 wszystkie zapytania do klastra, por\u00f3wnywa\u0142 odpowiedzi i zapisywa\u0142 r\u00f3\u017cnice w logach (w naszym przypadku w NewRelic). Dzi\u0119ki temu, nawet je\u015bli podczas wprowadzania wersja klastrowa ulegnie awarii, nasza produkcja nie zostanie dotkni\u0119ta. <\/li>\n<li>U\u017cywaj\u0105c klastra w trybie dry-mode, mo\u017cemy spokojnie obserwowa\u0107 wykres r\u00f3\u017cnic w odpowiedziach. Je\u015bli udzia\u0142 b\u0142\u0119d\u00f3w powoli, ale pewnie zmierza do jakiej\u015b niewielkiej konstante, to znaczy, \u017ce wszystko jest w porz\u0105dku. Dlaczego r\u00f3\u017cnice nadal si\u0119 pojawiaj\u0105? Poniewa\u017c zapis w osobnej wersji odbywa si\u0119 nieco wcze\u015bniej, ni\u017c w klastrze, i przez mikrolag dane mog\u0105 si\u0119 rozje\u017cd\u017ca\u0107. Wystarczy spojrze\u0107 na logi r\u00f3\u017cnic, a je\u015bli wszystkie s\u0105 wyt\u0142umaczalne brakiem atomowo\u015bci zapisu, mo\u017cna i\u015b\u0107 dalej.<\/li>\n<li>Teraz mo\u017cemy prze\u0142\u0105czy\u0107 dry-mode w drug\u0105 stron\u0119. B\u0119dziemy pisa\u0107 i czyta\u0107 z klastra, a duplikowa\u0107 do osobnej wersji. Po co? W ci\u0105gu nast\u0119pnego tygodnia chcemy obserwowa\u0107 prac\u0119 klastra. Je\u015bli oka\u017ce si\u0119, \u017ce w szczycie obci\u0105\u017cenia wyst\u0119puj\u0105 problemy lub co\u015b przeoczyli\u015bmy, zawsze mamy awaryjny powr\u00f3t do starego kodu i aktualnych danych dzi\u0119ki dry-mode.<\/li>\n<li>Pozostaje wy\u0142\u0105czy\u0107 dry-mode i zdemontowa\u0107 osobn\u0105 wersj\u0119. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"ekspertiza\">Ekspertyza<\/h1>\n<p><\/p>\n<p>Na pocz\u0105tek kr\u00f3tko o budowie klastra.<\/p>\n<p><\/p>\n<p>Po pierwsze, Redis to przechowalnia key-value. Jako klucz u\u017cywane s\u0105 dowolne napisy. Jako warto\u015bci mog\u0105 by\u0107 u\u017cywane liczby, napisy oraz z\u0142o\u017cone struktury. Ich jest wiele, ale dla zrozumienia og\u00f3lnej budowy nie jest to istotne.<br \/>\nNast\u0119pny poziom abstrakcji po kluczach to sloty (SLOTS). Ka\u017cdy klucz nale\u017cy do jednego z 16 383 slot\u00f3w. W obr\u0119bie ka\u017cdego slotu mo\u017ce by\u0107 dowolna liczba kluczy. W ten spos\u00f3b wszystkie klucze dziel\u0105 si\u0119 na 16 383 roz\u0142\u0105czne zbiory.<br \/>\n<img decoding=\"async\" alt=\"O przeprowadzce z Redis do Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/a5e4be23381b42287f693e01d5d59a99.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dalej, w klastrze powinno by\u0107 N w\u0119z\u0142\u00f3w master. Ka\u017cdy w\u0119ze\u0142 mo\u017cna traktowa\u0107 jako oddzielny instancj\u0119 Redis, kt\u00f3ra zna wszystko o innych w\u0119z\u0142ach w ramach klastra. Ka\u017cdy w\u0119ze\u0142 master zawiera pewn\u0105 liczb\u0119 slot\u00f3w. Ka\u017cdy slot nale\u017cy tylko do jednego w\u0119z\u0142a master. Wszystkie sloty musz\u0105 by\u0107 rozdzielone mi\u0119dzy w\u0119z\u0142ami. Je\u015bli jakie\u015b sloty nie s\u0105 rozdzielone, klucze znajduj\u0105ce si\u0119 w nich b\u0119d\u0105 niedost\u0119pne. Ka\u017cdy w\u0119ze\u0142 master warto uruchomi\u0107 na oddzielnej maszynie logicznej lub fizycznej. Nale\u017cy r\u00f3wnie\u017c pami\u0119ta\u0107, \u017ce ka\u017cdy w\u0119ze\u0142 dzia\u0142a tylko na jednym rdzeniu, a je\u015bli chcesz uruchomi\u0107 kilka instancji Redis na jednej maszynie logicznej, upewnij si\u0119, \u017ce b\u0119d\u0105 dzia\u0142a\u0142y na r\u00f3\u017cnych rdzeniach (nie pr\u00f3bowali\u015bmy tego robi\u0107, ale teoretycznie wszystko powinno dzia\u0142a\u0107). W istocie, w\u0119z\u0142y master zapewniaj\u0105 konwencjonalne sharding, a wi\u0119ksza liczba w\u0119z\u0142\u00f3w master pozwala na skalowanie zapyta\u0144 do zapisu i odczytu.<\/p>\n<p><\/p>\n<p>Po tym, jak wszystkie klucze zosta\u0142y przypisane do slot\u00f3w, a sloty rozmieszczone po w\u0119z\u0142ach master, do ka\u017cdej w\u0119z\u0142a master mo\u017cna doda\u0107 dowoln\u0105 liczb\u0119 w\u0119z\u0142\u00f3w slave. W ramach ka\u017cdej takiej pary \u201emaster-slave\u201d odbywa si\u0119 standardowa replikacja. W\u0119z\u0142y slaves s\u0105 potrzebne do skalowania zapyta\u0144 do odczytu oraz do awaryjnego prze\u0142\u0105czania w przypadku awarii mastera.<br \/>\n<img decoding=\"async\" alt=\"O przeprowadzce z Redis do Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/90feb7ef9dacb858d5f21edc214df14d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz porozmawiajmy o operacjach, kt\u00f3re warto zna\u0107.<\/p>\n<p><\/p>\n<p>Do systemu b\u0119dziemy si\u0119 odnosi\u0107 przez Redis-CLI. Poniewa\u017c Redis nie ma jednego punktu wej\u015bcia, wykona\u0107 nast\u0119puj\u0105ce operacje mo\u017cna na dowolnym z w\u0119z\u0142\u00f3w. W ka\u017cdym punkcie zwracam uwag\u0119 na mo\u017cliwo\u015b\u0107 wykonywania operacji pod obci\u0105\u017ceniem.<\/p>\n<p><\/p>\n<ul>\n<li>Pierwsze i najwa\u017cniejsze, co b\u0119dzie nam potrzebne: operacja cluster nodes. Zwraca ona stan klastra, pokazuje list\u0119 w\u0119z\u0142\u00f3w, ich role, rozmieszczenie slot\u00f3w itd. Dodatkowe informacje mo\u017cna uzyska\u0107 przy pomocy cluster info i cluster slots.<\/li>\n<li>Dobrze by\u0142oby umie\u0107 dodawa\u0107 i usuwa\u0107 w\u0119z\u0142y. W tym celu dost\u0119pne s\u0105 operacje cluster meet i cluster forget. Zauwa\u017c, \u017ce cluster forget musi by\u0107 zastosowane do KA\u017bDEGO w\u0119z\u0142a, zar\u00f3wno do master\u00f3w, jak i replik. Natomiast cluster meet wystarczy wywo\u0142a\u0107 tylko na jednym w\u0119\u017ale. Taka r\u00f3\u017cnica mo\u017ce by\u0107 zniech\u0119caj\u0105ca, dlatego lepiej dowiedzie\u0107 si\u0119 o niej przed uruchomieniem klastra w produkcji. Dodawanie w\u0119z\u0142a odbywa si\u0119 bezpiecznie na \u017cywo i nie wp\u0142ywa na dzia\u0142anie klastra (co jest logiczne). Je\u015bli jednak planujesz usun\u0105\u0107 w\u0119ze\u0142 z klastra, upewnij si\u0119, \u017ce nie ma na nim slot\u00f3w (w przeciwnym razie ryzykujesz utrat\u0119 dost\u0119pu do wszystkich kluczy na tym w\u0119\u017ale). Nie usuwaj te\u017c mastera, kt\u00f3ry ma slave'y, w przeciwnym razie b\u0119dzie si\u0119 odbywa\u0107 zb\u0119dne g\u0142osowanie na nowego mastera. Je\u015bli na w\u0119z\u0142ach ju\u017c nie ma slot\u00f3w, to jest to drobny problem, ale po co nam dodatkowe wybory, je\u015bli mo\u017cna najpierw usun\u0105\u0107 slave'y.<\/li>\n<li>Je\u015bli trzeba wymusi\u0107 zamian\u0119 mastera i slave'a, nada si\u0119 polecenie cluster failover. Uruchamiaj\u0105c je na \u017cywo, nale\u017cy zrozumie\u0107, \u017ce przez czas wykonywania operacji master b\u0119dzie niedost\u0119pny. Zazwyczaj prze\u0142\u0105czenie odbywa si\u0119 w mniej ni\u017c sekund\u0119, ale nie atomowo. Mo\u017cesz si\u0119 spodziewa\u0107, \u017ce cz\u0119\u015b\u0107 zapyta\u0144 do mastera w tym czasie zako\u0144czy si\u0119 b\u0142\u0119dem.<\/li>\n<li>Przed usuni\u0119ciem w\u0119z\u0142a z klastra nie powinno na nim pozosta\u0107 slot\u00f3w. Lepiej je przenie\u015b\u0107 za pomoc\u0105 polecenia cluster reshard. Sloty zostan\u0105 przeniesione z jednego mastera na inny. Ca\u0142a operacja mo\u017ce zaj\u0105\u0107 kilka minut, w zale\u017cno\u015bci od ilo\u015bci przenoszonych danych, jednak proces przenoszenia jest bezpieczny i nie wp\u0142ywa na dzia\u0142anie klastra. W ten spos\u00f3b wszystkie dane mo\u017cna przenie\u015b\u0107 z jednego w\u0119z\u0142a na drugi pod obci\u0105\u017ceniem, nie martwi\u0105c si\u0119 o ich dost\u0119pno\u015b\u0107. Istniej\u0105 jednak pewne niuanse. Po pierwsze, przenoszenie danych wi\u0105\u017ce si\u0119 z okre\u015blonym obci\u0105\u017ceniem w\u0119z\u0142a odbieraj\u0105cego i wysy\u0142aj\u0105cego. Je\u015bli w\u0119ze\u0142 odbieraj\u0105cy jest ju\u017c mocno obci\u0105\u017cony procesorem, nie nale\u017cy go dodatkowo obci\u0105\u017ca\u0107 nowymi danymi. Po drugie, gdy na masterze-\u017ar\u00f3dle nie pozostanie ani jeden slot, wszystkie jego slave'y natychmiast przejd\u0105 do mastera, na kt\u00f3ry te sloty zosta\u0142y przeniesione. Problem w tym, \u017ce wszystkie te slave'y jednocze\u015bnie zechc\u0105 zsynchronizowa\u0107 dane. I b\u0119dziecie mieli jeszcze szcz\u0119\u015bcie, je\u015bli b\u0119dzie to cz\u0119\u015bciowa, a nie pe\u0142na synchronizacja. We\u017acie to pod uwag\u0119 i \u0142\u0105czcie operacje przenoszenia slot\u00f3w z od\u0142\u0105czaniem\/przenoszeniem slave'\u00f3w. Albo miejcie nadziej\u0119, \u017ce macie wystarczaj\u0105cy zapas wydajno\u015bci.<\/li>\n<li>Co robi\u0107, je\u015bli podczas przenoszenia odkryli\u015bcie, \u017ce gdzie\u015b zagubili\u015bcie sloty? Mam nadziej\u0119, \u017ce ten problem was nie dotknie, ale je\u017celi, to istnieje operacja cluster fix. W jaki\u015b spos\u00f3b rozmieszcza sloty po w\u0119z\u0142ach w losowej kolejno\u015bci. Zalecam sprawdzenie jej dzia\u0142ania, uprzednio usuwaj\u0105c z klastra w\u0119ze\u0142 z rozproszonymi slotami. Poniewa\u017c dane w nierozproszonych slotach i tak s\u0105 niedost\u0119pne, martwienie si\u0119 o problemy z dost\u0119pno\u015bci\u0105 tych slot\u00f3w jest ju\u017c sp\u00f3\u017anione. Z kolei operacja nie wp\u0142ynie na rozproszone sloty.<\/li>\n<li>Jeszcze jedna przydatna operacja to monitor. Pozwala ona w czasie rzeczywistym zobaczy\u0107 ca\u0142y wykaz \u017c\u0105da\u0144 kierowanych do w\u0119z\u0142a. Co wi\u0119cej, mo\u017cna na niej wykona\u0107 grep i dowiedzie\u0107 si\u0119, czy jest potrzebny ruch.<\/li>\n<\/ul>\n<p><\/p>\n<p>Warto r\u00f3wnie\u017c wspomnie\u0107 o procedurze awaryjnego prze\u0142\u0105czania g\u0142\u00f3wnego. Kr\u00f3tko m\u00f3wi\u0105c, istnieje ona i, moim zdaniem, dzia\u0142a doskonale. Nie nale\u017cy jednak s\u0105dzi\u0107, \u017ce je\u015bli wyci\u0105gnie si\u0119 kabel z gniazdka w maszynie z g\u0142\u00f3wnym w\u0119z\u0142em, Redis natychmiast prze\u0142\u0105czy si\u0119 i klienci nie zauwa\u017c\u0105 przerwy w dost\u0119pie. Z mojej praktyki wynika, \u017ce prze\u0142\u0105czanie zajmuje kilka sekund. W tym czasie cz\u0119\u015b\u0107 danych b\u0119dzie niedost\u0119pna: nast\u0105pi odkrycie niedost\u0119pno\u015bci g\u0142\u00f3wnego, w\u0119z\u0142y zag\u0142osuj\u0105 na nowego, podrz\u0119dne b\u0119d\u0105 si\u0119 prze\u0142\u0105cza\u0107, a dane z synchronizowane. Najlepszym sposobem, aby samodzielnie si\u0119 przekona\u0107, \u017ce schemat dzia\u0142a, jest przeprowadzenie lokalnych \u0107wicze\u0144. Uruchom klaster na swoim laptopie, na\u0142\u00f3\u017c minimalne obci\u0105\u017cenie, zasymuluj awari\u0119 (na przyk\u0142ad blokuj\u0105c porty) i oceniaj szybko\u015b\u0107 prze\u0142\u0105czania. Moim zdaniem, tylko sp\u0119dzaj\u0105c w ten spos\u00f3b dzie\u0144 lub dwa, mo\u017cna by\u0107 pewnym dzia\u0142ania technologii. Albo zaufa\u0107, \u017ce oprogramowanie, z kt\u00f3rego korzysta po\u0142owa internetu, na pewno dzia\u0142a.<\/p>\n<p><\/p>\n<h1 id=\"konfiguraciya\">Konfiguracja<\/h1>\n<p><\/p>\n<p>Cz\u0119sto to konfiguracja jest pierwszym krokiem, kt\u00f3ry nale\u017cy wykona\u0107, aby zacz\u0105\u0107 korzysta\u0107 z narz\u0119dzia. A kiedy wszystko dzia\u0142a, nie chce si\u0119 rusza\u0107 konfiguracji. Wymaga to pewnych wysi\u0142k\u00f3w, aby zmusi\u0107 si\u0119 do powrotu do ustawie\u0144 i dok\u0142adnego ich przeszukania. Z mojej pami\u0119ci by\u0142o co najmniej dwa powa\u017cne wpadki z powodu niedba\u0142o\u015bci wobec konfiguracji. Zwr\u00f3\u0107 szczeg\u00f3ln\u0105 uwag\u0119 na nast\u0119puj\u0105ce punkty:<\/p>\n<p><\/p>\n<ul>\n<li>timeout 0<br \/>\n<em>Czas, po kt\u00f3rym zamykane s\u0105 nieaktywne po\u0142\u0105czenia (w sekundach). 0 \u2014 nie s\u0105 zamykane.<\/em><br \/>\nNie ka\u017cda nasza biblioteka potrafi\u0142a poprawnie zamyka\u0107 po\u0142\u0105czenia. Wy\u0142\u0105czaj\u0105c t\u0119 ustawienie, ryzykujemy natrafienie na limit liczby klient\u00f3w. Z drugiej strony, je\u015bli taki problem wyst\u0119puje, automatyczne zerwanie zaginionych po\u0142\u0105cze\u0144 zamaskuje go i mo\u017cemy tego nie zauwa\u017cy\u0107. Ponadto nie nale\u017cy w\u0142\u0105cza\u0107 tej opcji przy korzystaniu z po\u0142\u0105cze\u0144 persist.<\/li>\n<li>Save x y &amp; appendonly yes<br \/>\n<em>Zapisanie zrzutu RDB.<\/em><br \/>\nProblemy z RDB\/AOF om\u00f3wimy szczeg\u00f3\u0142owo poni\u017cej.<\/li>\n<li>stop-writes-on-bgsave-error no &amp; slave-serve-stale-data yes<br \/>\n<em>Je\u015bli w\u0142\u0105czone, to w przypadku awarii zrzutu RDB g\u0142\u00f3wny przestaje przyjmowa\u0107 \u017c\u0105dania zmian. Je\u015bli po\u0142\u0105czenie z g\u0142\u00f3wnym zostanie utracone, podrz\u0119dny mo\u017ce nadal odpowiada\u0107 na zapytania (tak). Lub przestanie odpowiada\u0107 (nie).<\/em><br \/>\nNie akceptujemy sytuacji, w kt\u00f3rej Redis staje si\u0119 dyni\u0105.<\/li>\n<li>repl-ping-slave-period 5<br \/>\n<em>Po tym czasie zaczniemy si\u0119 martwi\u0107, \u017ce master mo\u017ce by\u0107 uszkodzony i pora na przeprowadzenie procedury failover.<\/em><br \/>\nB\u0119dziemy musieli r\u0119cznie znale\u017a\u0107 r\u00f3wnowag\u0119 mi\u0119dzy fa\u0142szywymi alarmami a uruchomieniem failover. Z naszego do\u015bwiadczenia to trwa 5 sekund.<\/li>\n<li>repl-backlog-size 1024mb &amp; epl-backlog-ttl 0<br \/>\n<em>Dok\u0142adnie tyle danych mo\u017cemy przechowa\u0107 w buforze dla od\u0142\u0105czonej repliki. Je\u015bli bufor si\u0119 sko\u0144czy, konieczna b\u0119dzie pe\u0142na synchronizacja.<\/em><br \/>\nPraktyka pokazuje, \u017ce lepiej ustawi\u0107 wi\u0119ksz\u0105 warto\u015b\u0107. Przyczyn, dla kt\u00f3rych replika mo\u017ce zacz\u0105\u0107 si\u0119 op\u00f3\u017ania\u0107, jest wiele. Je\u015bli zacznie si\u0119 op\u00f3\u017ania\u0107, prawdopodobnie tw\u00f3j master ju\u017c ma trudno\u015bci, a pe\u0142na synchronizacja stanie si\u0119 ostatni\u0105 kropl\u0105.<\/li>\n<li>maxclients 10000<br \/>\n<em>Maksymalna liczba jednoczesnych klient\u00f3w.<\/em><br \/>\nZ naszego do\u015bwiadczenia lepiej ustawi\u0107 wi\u0119ksz\u0105 warto\u015b\u0107. Redis \u015bwietnie radzi sobie z 10 tys. po\u0142\u0105cze\u0144. Upewnij si\u0119 tylko, \u017ce w systemie jest wystarczaj\u0105co du\u017co gniazd. <\/li>\n<li>maxmemory-policy volatile-ttl<br \/>\n<em>Regu\u0142a, wed\u0142ug kt\u00f3rej klucze s\u0105 usuwane po osi\u0105gni\u0119ciu limitu dost\u0119pnej pami\u0119ci.<\/em><br \/>\nWa\u017cne jest nie tyle samo prawo, co zrozumienie, jak to b\u0119dzie wygl\u0105da\u0107. Redis zas\u0142uguje na pochwa\u0142\u0119 za zdolno\u015b\u0107 do pracy przy osi\u0105gni\u0119ciu limitu pami\u0119ci. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"problemy-rdb-i-aof\">Problemy RDB i AOF<\/h1>\n<p><\/p>\n<p>Chocia\u017c sam Redis przechowuje wszystkie informacje w pami\u0119ci operacyjnej, istnieje r\u00f3wnie\u017c mechanizm zapisywania danych na dysku. A dok\u0142adniej, trzy mechanizmy:<\/p>\n<p><\/p>\n<ul>\n<li>RDB-snapshot \u2014 pe\u0142ny zrzut wszystkich danych. Ustala si\u0119 go za pomoc\u0105 konfiguracji SAVE X Y i odczytuje jako \"Zachowa\u0107 pe\u0142ny zrzut wszystkich danych co X sekund, je\u015bli zmienia si\u0119 przynajmniej Y kluczy.\"<\/li>\n<li>Append-only file \u2014 lista operacji w kolejno\u015bci ich wykonania. Dodaje nowe operacje do pliku co X sekund lub co Y operacji.<\/li>\n<li>RDB i AOF \u2014 kombinacja dw\u00f3ch poprzednich.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ka\u017cda z metod ma swoje zalety i wady, nie b\u0119d\u0119 ich wszystkich wymienia\u0107, zwr\u00f3c\u0119 jedynie uwag\u0119 na nieoczywiste, moim zdaniem, aspekty.<\/p>\n<p><\/p>\n<p>Przede wszystkim, do zapisania RDB-snapshotu konieczne jest wywo\u0142anie FORK. Je\u015bli danych jest du\u017co, mo\u017ce to zablokowa\u0107 ca\u0142y Redis na okres od kilku milisekund do sekundy. Ponadto system musi przydzieli\u0107 pami\u0119\u0107 na taki zrzut, co prowadzi do konieczno\u015bci utrzymania na maszynie logicznej podw\u00f3jnego zapasu pami\u0119ci operacyjnej: je\u015bli dla Redis przydzielono 8 GB, to na wirtualnej maszynie z nim powinno by\u0107 dost\u0119pne 16.<\/p>\n<p><\/p>\n<p>Po drugie, wyst\u0119puj\u0105 problemy z cz\u0119\u015bciow\u0105 synchronizacj\u0105. W trybie AOF, po ponownym po\u0142\u0105czeniu slave'a, mo\u017ce by\u0107 wykonywana pe\u0142na synchronizacja zamiast cz\u0119\u015bciowej. Dlaczego tak si\u0119 dzieje, nie zdo\u0142a\u0142em zrozumie\u0107. Ale warto to mie\u0107 na uwadze.<\/p>\n<p><\/p>\n<p>Te dwa punkty zmuszaj\u0105 do zastanowienia si\u0119, czy naprawd\u0119 potrzebujemy tych danych na dysku, skoro s\u0105 ju\u017c zduplikowane przez slave'y. Utrata danych mo\u017ce nast\u0105pi\u0107 tylko w przypadku awarii wszystkich slave'\u00f3w, a to jest problem na poziomie \u00abpo\u017caru w centrum danych\u00bb. Jako kompromis mo\u017cna zaproponowa\u0107 przechowywanie danych tylko na slave'ach, ale w takim przypadku trzeba upewni\u0107 si\u0119, \u017ce te slave'y nigdy nie stan\u0105 si\u0119 masterem podczas awaryjnego przywracania (w tym celu istnieje ustawienie priorytetu slave'\u00f3w w ich konfiguracji). W ka\u017cdym konkretnym przypadku zastanawiamy si\u0119, czy dane powinny by\u0107 zapisywane na dysku i najcz\u0119\u015bciej odpowiadamy \u201enie\u201d.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Podsumowanie<\/h1>\n<p><\/p>\n<p>Na koniec mam nadziej\u0119, \u017ce uda\u0142o mi si\u0119 przedstawi\u0107 og\u00f3lny obraz dzia\u0142ania redis-cluster-a tym, kt\u00f3rzy w og\u00f3le o nim nie s\u0142yszeli, a tak\u017ce zwr\u00f3ci\u0107 uwag\u0119 na nieoczywiste kwestie dla tych, kt\u00f3rzy ju\u017c od d\u0142u\u017cszego czasu go u\u017cywaj\u0105.<br \/>\nDzi\u0119kuj\u0119 za po\u015bwi\u0119cony czas i, jak zwykle, komentarze na temat s\u0105 mile widziane.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/citymobil\/blog\/515620\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0445\u043e\u0434\u044f \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u043b\u0435\u0442, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0432 \u043d\u0435\u043c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0432 10 \u0440\u0430\u0437 \u0432\u044b\u0448\u0435, \u0430 \u0446\u0435\u043d\u0430 \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0442\u043d\u0438 \u0440\u0430\u0437? \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043a\u0440\u0443\u0442\u043e\u0439 Highload Engineer. \u041d\u043e \u0437\u0430 \u043d\u0435\u0438\u043c\u0435\u043d\u0438\u0435\u043c \u0433\u043e\u0440\u043d\u0438\u0447\u043d\u043e\u0439 \u0442\u0430\u043a\u043e\u0432\u043e\u0433\u043e, \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u043c\u043d\u0435. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91847,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91846","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=\"\u041f\u0440\u0438\u0445\u043e\u0434\u044f \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435.\" \/>\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\/o-pereezde-s-redis-na-redis-cluster\" \/>\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\u041e \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0435 \u0441 Redis \u043d\u0430 Redis-cluster | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0445\u043e\u0434\u044f \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster\" \/>\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-19T17:41:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-19T17:41:57+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\udd47O migracji z Redis na Redis-cluster | ProHoster","description":"Wchodz\u0105c w produkt, kt\u00f3ry rozwija si\u0119 szybciej.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","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\u041e \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0435 \u0441 Redis \u043d\u0430 Redis-cluster | ProHoster","og:description":"\u041f\u0440\u0438\u0445\u043e\u0434\u044f \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","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-19T17:41:57+00:00","article:modified_time":"2020-08-19T17:41:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91846","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:19:41","updated":"2022-10-03 14:54:15","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\/91846","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=91846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/91846\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/91847"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=91846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=91846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=91846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}