{"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\/hr\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","title":{"rendered":"O prijelazu s Redis-a na Redis-cluster","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"O prijelazu s Redis-a na Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/ea8bc47f73ef3b06ccfdf94d323592bf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kada se suo\u010davate s proizvodom koji se razvija vi\u0161e od deset godina, nije iznena\u0111uju\u0107e nai\u0107i na zastarjele tehnologije. No, \u0161to ako za \u0161est mjeseci trebate odr\u017eavati optere\u0107enje deset puta ve\u0107e, a cijena pada raste stotinama puta? U tom slu\u010daju trebat \u0107e vam vrhunski Highload in\u017eenjer. Ali, zbog nedostatka takvog stru\u010dnjaka, problem je povjeren meni. U prvom dijelu \u010dlanka \u0107u opisati kako smo migrirali s Redis-a na Redis-klaster, a u drugom dijelu \u0107u dati savjete kako zapo\u010deti kori\u0161tenje klastera i na \u0161to obratiti pa\u017enju tijekom eksploatacije.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"vybor-tehnologii\">Izbor tehnologije<\/h1>\n<p><\/p>\n<p>Je li tako lo\u0161 <em>odvojeni Redis<\/em> (standalone redis) u konfiguraciji 1 majstor i N robova? Za\u0161to ga nazivam zastarjelom tehnologijom?<\/p>\n<p><\/p>\n<blockquote><p>Ne, Redis nije tako lo\u0161\u2026 Me\u0111utim, postoji nekoliko nedostataka koje ne mo\u017eemo ignorirati.<\/p><\/blockquote>\n<p><\/p>\n<ul>\n<li>\n<p>Prvo, Redis ne podr\u017eava mehanizme za oporavak od pada majstora. Za rje\u0161avanje ovog problema koristili smo konfiguraciju s automatskim prebacivanjem VIP-ova na novog majstora, promjenom uloge jednog od robova i prebacivanjem ostalih. Ovaj mehanizam je funkcionirao, ali ga nije bilo mogu\u0107e nazvati pouzdanim rje\u0161enjem. Prvo, doga\u0111ali su se la\u017eni alarmi, a drugo, bio je jednokratno rje\u0161enje, i nakon aktivacije zahtijevao je ru\u010dne radnje za ponovo pokretanje.<\/p>\n<p>\n<\/li>\n<li>\n<p>Drugo, postojanje samo jednog majstora dovodilo je do problema s \u0161ardiranjem. Morali smo kreirati nekoliko neovisnih klastera \"1 majstor i N robova\", a zatim ru\u010dno raspodijeliti baze po tim strojevima i nadati se da ne\u0107e do\u0107i do situacije da jedna od baza naraste toliko da je treba premjestiti na zasebni instance.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Koje su opcije?<\/p>\n<p><\/p>\n<ul>\n<li>Najskuplje i najbogatije rje\u0161enje je Redis-Enterprise. To je kutijsko rje\u0161enje s punom tehni\u010dkom podr\u0161kom. Iako izgleda idealno s tehni\u010dkog stajali\u0161ta, nije nam odgovaralo iz ideolo\u0161kih razloga. <\/li>\n<li>Redis-klaster. Iz kutije dolazi s podr\u0161kom za automatsko prebacivanje majstora i \u0161ardiranje. Su\u010delje se gotovo ne razlikuje od uobi\u010dajene verzije. Izgleda obe\u0107avaju\u0107e, o potencijalnim problemima \u0107emo razgovarati kasnije.<\/li>\n<li>Tarantool, Memcache, Aerospike i drugi. Svi ti alati rade otprilike isto. No, svaki ima svoje nedostatke. Odluka je bila ne staviti sva jaja u jednu ko\u0161aru. Memcache i Tarantool koristimo za druge zadatke, i, unaprijed \u0107u re\u0107i, na na\u0161oj praksi bilo je vi\u0161e problema s njima.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"specifika-ispolzovaniya\">Specifi\u010dnost kori\u0161tenja<\/h1>\n<p><\/p>\n<p>Pogledajmo koje smo zadatke povijesno rje\u0161avali s Redisom i koju funkcionalnost smo koristili:<\/p>\n<p><\/p>\n<ul>\n<li>Ke\u0161iranje prije zahtjeva za udaljenim uslugama poput 2GIS | Golang<br \/>\n<blockquote><p>GET SET MGET MSET \"ODABERI DB\"\n<\/p><\/blockquote>\n<\/li>\n<li>Ke\u0161iranje prije MYSQL | PHP<br \/>\n<blockquote><p>GET SET MGET MSET SCAN \"KLJU\u010c PO OBRACU\" \"ODABERI DB\"\n<\/p><\/blockquote>\n<\/li>\n<li>Glavno spremi\u0161te za uslugu rada s sesijama i koordinatama voza\u010da | Golang<br \/>\n<blockquote><p>GET SET MGET MSET \"ODABERI DB\" \"DODAJ GEO KLJU\u010c\" \"DO\u0110I GEO KLJU\u010c\" SCAN\n<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Kao \u0161to vidite, nema tu nikakve visoke matematike. U \u010demu je onda slo\u017eenost? Hajde da rastavimo svaki metod posebno.<\/p>\n<p><\/p>\n<p>Metoda<br \/>\nOpis<br \/>\nKarakteristike Redis-clustera<br \/>\nRe\u0161enje<\/p>\n<p>GET SET<br \/>\nZapisati\/pro\u010ditati klju\u010d<\/p>\n<p>MGET MSET<br \/>\nZapisati\/pro\u010ditati vi\u0161e klju\u010deva<br \/>\nKlju\u010devi \u0107e biti raspore\u0111eni na razli\u010ditim \u010dvorovima. Gotove biblioteke znaju raditi Multi-operacije samo unutar jednog \u010dvora<br \/>\nZamijeniti MGET s pipeline-om od N GET operacija<\/p>\n<p>SELECT DB<br \/>\nOdabrati bazu s kojom \u0107emo raditi<br \/>\nNe podr\u017eava vi\u0161e baza podataka<br \/>\nSve staviti u jednu bazu. Dodati prefikse klju\u010deva<\/p>\n<p>SCAN<br \/>\nPro\u0107i kroz sve klju\u010deve u bazi<br \/>\nBudu\u0107i da imamo jednu bazu, prolazak kroz sve klju\u010deve u klasteru je previ\u0161e skupo<br \/>\nOdr\u017eavati invarijant unutar jednog klju\u010da i raditi HSCAN po tom klju\u010du. Ili potpuno odustati<\/p>\n<p>GEO<br \/>\nOperacije rada s geo-klju\u010dem<br \/>\nGeo-klju\u010d se ne dijeli<\/p>\n<p>KEY BY PATTERN<br \/>\nPretra\u017eivanje klju\u010da po obrascu<br \/>\nBudu\u0107i da imamo jednu bazu, tra\u017eit \u0107emo po svim klju\u010devima u klasteru. Previ\u0161e skupo<br \/>\nOdustati ili odr\u017eavati invarijant, kao i u slu\u010daju SCAN-a<\/p>\n<p><\/p>\n<h1 id=\"redis-vs-redis-cluster\">Redis vs Redis-cluster<\/h1>\n<p><\/p>\n<p>\u0160to gubimo, a \u0161to dobivamo prelaskom na klaster?<\/p>\n<p><\/p>\n<ul>\n<li>Nedostaci: gubimo funkcionalnost vi\u0161e baza. \n<ul>\n<li>Ako \u017eelimo pohraniti logi\u010dki nepovezane podatke u jednom klasteru, morat \u0107emo koristiti prefikse kao workaround. <\/li>\n<li>Gubimo sve operacije 'po bazi', kao \u0161to su SCAN, DBSIZE, CLEAR DB itd.<\/li>\n<li>Multi-operacije su postale znatno slo\u017eenije za implementaciju, jer mo\u017ee biti potrebno obratiti se vi\u0161e \u010dvorovima.<\/li>\n<\/ul>\n<\/li>\n<li>Prednosti: \n<ul>\n<li>Otpornost na kvarove u obliku nu\u017enog prebacivanja glavnog \u010dvora.<\/li>\n<li>Shardiranje na strani Redisa.<\/li>\n<li>Premje\u0161tanje podataka izme\u0111u \u010dvorova atomarno i bez zastoja.<\/li>\n<li>Dodavanje i preusmjeravanje resursa i optere\u0107enja bez zastoja.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><em>Zaklju\u010dio bih da, ako vam nije potreban visok nivo otpornosti na kvarove, premje\u0161tanje na klaster nije isplativo, jer to mo\u017ee biti slo\u017een zadatak. No, ako birate izme\u0111u odvojene verzije i klastera, klaster je bolji izbor, jer nije ni\u0161ta lo\u0161iji i dodatno \u0107e vam olak\u0161ati dio briga.<\/em><\/p>\n<p><\/p>\n<h1 id=\"podgotovka-k-pereezdu\">Priprema za premje\u0161tanje<\/h1>\n<p><\/p>\n<p>Po\u010dnimo s zahtjevima za premje\u0161tanje:<\/p>\n<p><\/p>\n<ul>\n<li>Mora biti neprimjetno. Potpuno zaustavljanje usluge na 5 minuta nam ne odgovara.<\/li>\n<li>Mora biti \u0161to sigurnije i postepeno. \u017delimo imati odre\u0111enu kontrolu nad situacijom. Ne \u017eelimo sve prebaciti odjednom i moliti se za povratak.<\/li>\n<li>Minimalni gubici podataka prilikom premje\u0161tanja. Razumijemo da \u0107e biti vrlo te\u0161ko premjestiti sve odjednom, stoga dopu\u0161tamo odre\u0111enu nesinhronizaciju izme\u0111u podataka u obi\u010dnom i klasterskom Redis-u.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"obsluzhivanie-klastera\">Odr\u017eavanje klastera<\/h1>\n<p><\/p>\n<p>Prije samog premje\u0161tanja treba razmisliti o tome mo\u017eemo li odr\u017eavati klaster:<\/p>\n<p><\/p>\n<ul>\n<li>Grafikon. Koristimo Prometheus i Grafanu za grafike optere\u0107enja procesora, zauzete memorije, broja klijenata, broja GET, SET, AUTH operacija i sli\u010dno.<\/li>\n<li>Stru\u010dnost. Zamislite da \u0107e sutra biti odgovornost za ogroman klaster. Ako se pokvari, nitko osim vas ga ne mo\u017ee popraviti. Ako po\u010dne usporavati \u2014 svi \u0107e se obratiti vama. Ako treba dodati resurse ili preraspodijeliti optere\u0107enje \u2014 ponovo k vama. Da ne biste osijedili u 25. godini, po\u017eeljno je unaprijed razmotriti ove slu\u010dajeve i provjeriti kako \u0107e tehnologija reagirati na odre\u0111ene akcije. O tome \u0107emo vi\u0161e razgovarati u odjeljku \"Stru\u010dnost\".<\/li>\n<li>Monitoring i obavje\u0161tavanje. Kada klaster prestane raditi, \u017eelimo saznati prvi. Ovdje smo se ograni\u010dili na obavijest da sve \u010dvorove vra\u0107aju jednake informacije o stanju klastera (da, to mo\u017ee biti razli\u010dito). Ostale probleme je br\u017ee prepoznati putem obavijesti klijentskih usluga Redis-a.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"pereezd\">Premje\u0161tanje<\/h1>\n<p><\/p>\n<p>Kako \u0107emo se preseliti:<\/p>\n<p><\/p>\n<ul>\n<li>Prvo, potrebno je pripremiti biblioteku za rad s klasterom. Kao osnovu za verziju na G\u043e uzeli smo go-redis i malo je prilagodili. Implementirali smo Multi-metode putem pipeline-a, a tako\u0111er smo malo izmijenili pravila ponavljanja zahtjeva. S verzijom za PHP bilo je vi\u0161e problema, ali na kraju smo se odlu\u010dili za php-redis. Nedavno su uveli podr\u0161ku za klaster, a po na\u0161em mi\u0161ljenju, to izgleda dobro.<\/li>\n<li>Sljede\u0107e, potrebno je postaviti sam klaster. To se doslovno radi u dvije naredbe na temelju konfiguracijske datoteke. Detaljnije \u0107emo raspraviti postavke u nastavku.<\/li>\n<li>Za postupni prijelaz koristimo dry-mode. Budu\u0107i da imamo dvije verzije biblioteke s identi\u010dnim su\u010deljem (jedna za uobi\u010dajenu verziju, druga za klaster), ni\u0161ta ne spre\u010dava izradu omota koji \u0107e raditi s zasebnom verzijom i paralelno duplicirati sve zahtjeve u klaster, uspore\u0111ivati odgovore i zapisivati razlike u logove (u na\u0161em slu\u010daju u NewRelic). Tako, \u010dak i ako se klaster verzija pokvari prilikom implementacije, na\u0161 produkcijski sustav to ne\u0107e pogo\u0111eno. <\/li>\n<li>Implementacijom klastera u dry- modu, mo\u017eemo mirno promatrati grafikon razlika u odgovorima. Ako postotak gre\u0161aka sporo, ali sigurno ide prema nekoj maloj konstanti, zna\u010di da je sve u redu. Za\u0161to razlike i dalje postoje? Zato \u0161to zapis u zasebnoj verziji dolazi malo ranije nego u klasteru, i zbog mikroka\u0161njenja podaci se mogu razlikovati. Preostaje samo pogledati logove razlika, ako su svi oni obja\u0161njeni neatomarno\u0161\u0107u zapisa, onda mo\u017eemo i\u0107i dalje.<\/li>\n<li>Sada mo\u017eemo prebaciti dry-mode u suprotnu stranu. Pisat \u0107emo i \u010ditati iz klastera, a duplicirat \u0107emo u zasebnu verziju. Za\u0161to? U sljede\u0107em tjednu \u017eelimo pratiti rad klastera. Ako se ispostavi da postoje problemi pod vrhunskim optere\u0107enjem ili ako ne\u0161to nismo uzeli u obzir, uvijek imamo mogu\u0107nost povratka na stari kod i aktualne podatke zahvaljuju\u0107i dry-mode.<\/li>\n<li>Preostaje isklju\u010diti dry-mode i demontirati zasebnu verziju. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"ekspertiza\">Stru\u010dnost<\/h1>\n<p><\/p>\n<p>Prvo \u0107emo ukratko opisati strukturu klastera.<\/p>\n<p><\/p>\n<p>Prvo, Redis je key-value skladi\u0161te. Kao klju\u010devi koriste se proizvoljne string vrijednosti. Kao vrijednosti mogu se koristiti brojevi, stringovi i slo\u017eene strukture. Posljednjih je bezbroj, ali za razumijevanje op\u0107e strukture nije va\u017eno.<br \/>\nSljede\u0107a razina apstrakcije nakon klju\u010deva su slotovi (SLOTS). Svaki klju\u010d pripada jednom od 16 383 slota. Unutar svakog slota mo\u017ee biti neograni\u010den broj klju\u010deva. Tako da se svi klju\u010devi raspore\u0111uju u 16 383 nepreklapaju\u0107e skupine.<br \/>\n<img decoding=\"async\" alt=\"O prijelazu s Redis-a na Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/a5e4be23381b42287f693e01d5d59a99.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nadalje, u klasteru treba biti N master-nodova. Svaka nod se mo\u017ee smatrati zasebnom instancom Redisa koja zna sve o ostalim nodovima unutar klastera. Svaki master-nod sadr\u017ei odre\u0111eni broj slotova. Svaki slot pripada samo jednom master-nodu. Sve slotove treba rasporediti izme\u0111u nodova. Ako neki slotovi nisu raspore\u0111eni, klju\u010devi koji se pohranjuju u njima ne\u0107e biti dostupni. Svaki master-nod je najbolje pokrenuti na zasebnoj logi\u010dkoj ili fizi\u010dkoj ma\u0161ini. Tako\u0111er, treba imati na umu da svaki nod radi samo na jednoj jezgri, a ako \u017eelite pokrenuti vi\u0161e instanci Redisa na jednoj logi\u010dkoj ma\u0161ini, pobrinite se da \u0107e raditi na razli\u010ditim jezgrama (to nismo testirali, ali teorijski bi sve trebalo funkcionirati). U su\u0161tini, master-nodovi omogu\u0107uju uobi\u010dajeno sharding, a ve\u0107i broj master-nodova omogu\u0107uje skaliranje zahtjeva za pisanjem i \u010ditanjem.<\/p>\n<p><\/p>\n<p>Nakon \u0161to su svi klju\u010devi raspore\u0111eni po slotovima, a slotovi raspore\u0111eni po master-nodovima, svakoj master-nodu mo\u017eete dodati proizvoljan broj slave-nodova. Unutar svake takve poveznice \"master-slave\" radit \u0107e uobi\u010dajena replikacija. Slaves su potrebni za skaliranje zahtjeva za \u010ditanjem i za prebacivanje u slu\u010daju kvara mastera.<br \/>\n<img decoding=\"async\" alt=\"O prijelazu s Redis-a na Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/90feb7ef9dacb858d5f21edc214df14d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sada \u0107emo razgovarati o operacijama koje bi bilo dobro znati izvoditi.<\/p>\n<p><\/p>\n<p>Sustavu \u0107emo se obra\u0107ati putem Redis-CLI. Budu\u0107i da Redis nema jedinstvenu to\u010dku ulaza, sljede\u0107e operacije mogu se izvoditi na bilo kojem od nodova. U svakom stavku posebno nagla\u0161avam mogu\u0107nost izvo\u0111enja operacije pod optere\u0107enjem.<\/p>\n<p><\/p>\n<ul>\n<li>Prvo i najva\u017enije \u0161to nam treba: operacija cluster nodes. Ona vra\u0107a stanje klastera, prikazuje popis nodova, njihove uloge, raspodjelu slotova itd. Dodatne informacije mo\u017eete dobiti pomo\u0107u cluster info i cluster slots.<\/li>\n<li>Bilo bi dobro imati mogu\u0107nost dodavanja i uklanjanja nodova. Za to postoje operacije cluster meet i cluster forget. Imajte na umu da se cluster forget mora primijeniti na SVAKI nod, kako na master, tako i na replike. A cluster meet dovoljno je pozvati samo na jednom nodu. Ova razlika mo\u017ee zbuniti, pa je bolje saznati o njoj prije nego \u0161to pokrenete klaster u rad. Dodavanje nodova sigurno se vr\u0161i u radu i ne utje\u010de na rad klastera (\u0161to je logi\u010dno). Me\u0111utim, ako namjeravate ukloniti nod iz klastera, trebate se uvjeriti da na njemu vi\u0161e nema slotova (ina\u010de riskirate gubitak pristupa svim klju\u010devima na tom nodu). Tako\u0111er, nemojte uklanjati master koji ima slave, ina\u010de \u0107e se provesti nepotrebno glasanje za novog mastera. Ako vi\u0161e nema slotova na nodovima, to je mali problem, ali za\u0161to bismo se suo\u010davali s dodatnim izborima ako prvo mo\u017eemo ukloniti slave.<\/li>\n<li>Ako je potrebno prisilno zamijeniti master i slave, odgovaraju\u0107a komanda je cluster failover. Kada je pozivate u radu, morate biti svjesni da \u0107e master biti nedostupan tijekom izvo\u0111enja operacije. Obi\u010dno se prebacivanje doga\u0111a za manje od sekunde, ali nije atomarno. Mo\u017eete o\u010dekivati da \u0107e dio zahtjeva prema masteru u to vrijeme zavr\u0161iti gre\u0161kom.<\/li>\n<li>Prije nego \u0161to uklonite \u010dvor iz klastera, ne bi smjelo ostati slotova na njemu. Preporu\u010duje se preraspodjela putem naredbe cluster reshard. Slotovi \u0107e biti premje\u0161teni s jednog majstora na drugi. Cijela operacija mo\u017ee potrajati nekoliko minuta, ovisno o koli\u010dini podataka koja se premje\u0161ta, me\u0111utim, proces prijenosa je siguran i ne utje\u010de na rad klastera. Tako, svi podaci mogu se premjestiti s jednog \u010dvora na drugi tijekom optere\u0107enja, bez brige o njihovoj dostupnosti. No, postoje i nijanse. Prvo, prijenos podataka povezan je s odre\u0111enim optere\u0107enjem na prijemnom i \u0161aljivom \u010dvoru. Ako je prijemni \u010dvor ve\u0107 jako optere\u0107en procesorom, ne biste ga trebali dodatno optere\u0107ivati primanjem novih podataka. Drugo, \u010dim na majstoru-\u0161aljivcu ne ostane nijedan slot, svi njegovi sljedbenici odmah \u0107e pre\u0107i na majstora na koji su ti slotovi premje\u0161teni. I problem je u tome \u0161to \u0107e svi ti sljedbenici \u017eeljeti odmah sinhronizirati podatke. I jo\u0161 \u0107ete imati sre\u0107e ako to bude djelomi\u010dna, a ne potpuna sinhronizacija. Uzmite to u obzir i kombinirajte operacije prijenosa slotova i isklju\u010divanja\/premje\u0161tanja sljedbenika. Ili se nadajte da imate dovoljno prostora za manevriranje.<\/li>\n<li>\u0160to u\u010diniti ako prilikom prijenosa otkrijete da ste negdje izgubili slotove? Nadam se da vas ovaj problem ne\u0107e zadesiti, ali ako to bude potrebno, postoji operacija cluster fix. Ona \u0107e na neki na\u010din raspodijeliti slotove po \u010dvorovima nasumi\u010dno. Preporu\u010dujem da provjerite njen rad nakon \u0161to prethodno uklonite \u010dvor s raspodijeljenim slotovima iz klastera. Budu\u0107i da podaci u neraspodijeljenim slotovima i ina\u010de nisu dostupni, prekasno je brinuti se o problemima s dostupno\u0161\u0107u tih slotova. S druge strane, operacija ne\u0107e utjecati na raspodijeljene slotove.<\/li>\n<li>Jo\u0161 jedna korisna operacija je monitor. Ona omogu\u0107ava u stvarnom vremenu vidjeti cijeli popis upita koji idu prema \u010dvoru. \u0160tovi\u0161e, po njoj se mo\u017ee napraviti grep i saznati postoji li potreban promet.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tako\u0111er vrijedi spomenuti postupak prebacivanja glavnog \u010dvora. Ukratko, postoji, i po mom mi\u0161ljenju, djeluje odli\u010dno. Me\u0111utim, ne treba misliti da \u0107e Redis odmah prebaciti klijente i da oni ne\u0107e primijetiti gubitak ako izvu\u010dete utika\u010d iz uti\u010dnice na ma\u0161ini s glavnim \u010dvorom. Na mom iskustvu, prebacivanje traje nekoliko sekundi. Tijekom tog perioda, dio podataka ne\u0107e biti dostupan: otkriva se nedostupnost glavnog \u010dvora, \u010dvorovi glasaju za novog, replikanti se prebacuju, podaci se sinkroniziraju. Najbolji na\u010din da se uvjerite sami da shema radi je provesti lokalne vje\u017ebe. Pokrenite klaster na svom laptopu, dajte minimalno optere\u0107enje, simulirajte pad (npr. blokiranjem portova), procijenite brzinu prebacivanja. Po mom mi\u0161ljenju, samo igraju\u0107i se ovako jedan do dva dana, mo\u017eete biti sigurni u rad tehnologije. Ili se nadati da softver koji koristi pola interneta sigurno funkcionira.<\/p>\n<p><\/p>\n<h1 id=\"konfiguraciya\">Konfiguracija<\/h1>\n<p><\/p>\n<p>\u010cesto, konfiguracija je prvo \u0161to je potrebno za po\u010detak rada s alatom. A kada sve proradi, ne \u017eeli se dirati konfiguracija. Potrebna su odre\u0111ena ulaganja da se natjerate da se vratite postavkama i pa\u017eljivo ih pregledate. U mom sje\u0107anju imali smo barem dva ozbiljna problema zbog nepa\u017enje prema konfiguraciji. Obratite posebnu pozornost na sljede\u0107e to\u010dke:<\/p>\n<p><\/p>\n<ul>\n<li>timeout 0<br \/>\n<em>Vrijeme nakon kojeg se zatvaraju neaktivne veze (u sekundama). 0 \u2014 ne zatvaraju se.<\/em><br \/>\nNisu sve na\u0161e biblioteke ispravno zatvarale veze. Isklju\u010div\u0161i ovu postavku, rizikujemo da naletimo na limit broja klijenata. S druge strane, ako postoji takav problem, automatsko prekidanje izgubljenih veza \u0107e ga prikriti, i mo\u017eda ne\u0107emo primijetiti. Osim toga, ne treba aktivirati ovu postavku kada koristimo persist- veze.<\/li>\n<li>Save x y &amp; appendonly yes<br \/>\n<em>Spremanje RDB snimke.<\/em><br \/>\nProbleme RDB\/AOF detaljno \u0107emo raspraviti u nastavku.<\/li>\n<li>stop-writes-on-bgsave-error no &amp; slave-serve-stale-data yes<br \/>\n<em>Ako je uklju\u010deno, prilikom kvara RDB snimke, glavni \u010dvor prestaje primati zahtjeve za promjenom. Ako se veza s glavnim \u010dvorom izgubi, replikant mo\u017ee nastaviti odgovarati na zahtjeve (yes). Ili \u0107e prestati odgovarati (no).<\/em><br \/>\nNismo zadovoljni situacijom u kojoj Redis postaje bundeva.<\/li>\n<li>repl-ping-slave-period 5<br \/>\n<em>Nakon ovog vremenskog razdoblja po\u010det \u0107emo brinuti se da je majstor pokvaren i da je vrijeme za postupak prebacivanja.<\/em><br \/>\nTrebalo bi ru\u010dno prona\u0107i ravnote\u017eu izme\u0111u la\u017enih alarma i pokretanja prebacivanja. U na\u0161oj praksi to je 5 sekundi.<\/li>\n<li>repl-backlog-size 1024mb &amp; epl-backlog-ttl 0<br \/>\n<em>Toliko podataka mo\u017eemo pohraniti u bafer za isklju\u010denu repliku. Ako bafer zavr\u0161i, morat \u0107emo se potpuno sinkronizirati.<\/em><br \/>\nPraksa sugerira da je bolje postaviti ve\u0107u vrijednost. Razloga zbog kojih replika mo\u017ee po\u010deti kasniti je mnogo. Ako kasni, vjerojatno va\u0161 majstor ve\u0107 te\u0161ko podnosi optere\u0107enje, a potpuna sinkronizacija bit \u0107e posljednja kap.<\/li>\n<li>maxclients 10000<br \/>\n<em>Maksimalni broj istovremenih klijenata.<\/em><br \/>\nPrema na\u0161em iskustvu, bolje je postaviti ve\u0107u vrijednost. Redis se odli\u010dno nosi sa 10 tisu\u0107a veza. Samo se pobrinite da sustav ima dovoljno soketa. <\/li>\n<li>maxmemory-policy volatile-ttl<br \/>\n<em>Pravila prema kojima se klju\u010devi bri\u0161u pri dostizanju limita dostupne memorije.<\/em><br \/>\nBitno je ne samo samo pravilo, ve\u0107 i razumijevanje kako \u0107e se to odvijati. Redis zaslu\u017euje pohvalu za sposobnost normalnog rada kada se dostigne limit memorije. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"problemy-rdb-i-aof\">Problemi RDB i AOF<\/h1>\n<p><\/p>\n<p>Iako sam Redis pohranjuje sve informacije u radnoj memoriji, tako\u0111er postoji mehanizam za pohranu podataka na disk. Preciznije, tri mehanizma:<\/p>\n<p><\/p>\n<ul>\n<li>RDB-snapshot \u2014 potpuni preslik svih podataka. Postavlja se putem konfiguracije SAVE X Y i \u010dita kao \"Spremi potpuni snimak svih podataka svake X sekundi, ako je promijenjeno barem Y klju\u010deva.\"<\/li>\n<li>Append-only file \u2014 popis operacija u redoslijedu njihova izvr\u0161enja. Dodaje nove operacije u datoteku svake X sekundi ili svake Y operacija.<\/li>\n<li>RDB i AOF \u2014 kombinacija dvaju prethodnih.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sve metode imaju svoje prednosti i nedostatke, ne\u0107u ih sve nabrajati, samo \u0107u se osvrnuti na o\u010dite, po mom mi\u0161ljenju, aspekte.<\/p>\n<p><\/p>\n<p>Prvo, za pohranu RDB-snimka potrebno je pozvati FORK. Ako podataka ima puno, to mo\u017ee obustaviti cijeli Redis na razdoblje od nekoliko milisekundi do sekunde. Osim toga, sustav mora osloboditi memoriju za takav snimak, \u0161to dovodi do potrebe za odr\u017eavanjem dvostrukog kapaciteta radne memorije na logi\u010dkoj ma\u0161ini: ako je za Redis dodijeljeno 8 GB, na virtualnoj ma\u0161ini s njim mora biti dostupno 16.<\/p>\n<p><\/p>\n<p>Drugo, postoje problemi s djelomi\u010dnom sinkronizacijom. U AOF na\u010dinu rada, prilikom ponovnog povezivanja slava, mo\u017ee se dogoditi potpuna sinkronizacija umjesto djelomi\u010dne. Za\u0161to se to doga\u0111a, nisam uspio razumjeti. No, treba to imati na umu.<\/p>\n<p><\/p>\n<p>Ove dvije to\u010dke ve\u0107 izazivaju razmi\u0161ljanje o tome koliko su nam ti podaci na disku stvarno potrebni, ako su ve\u0107 duplirani kroz slave. Gubitak podataka mo\u017ee se dogoditi samo kada svi slavi prestanu raditi, a to je problem razine \u201epo\u017ear u DC-u\u201c. Kao kompromis, mo\u017eemo predlo\u017eiti da se podaci \u010duvaju samo na slavima, ali u tom slu\u010daju treba osigurati da ti slavi nikada ne postanu glavni tijekom oporavka u slu\u010daju kvara (za to postoji postavka prioriteta slava u njihovoj konfiguraciji). U svakom pojedinom slu\u010daju razmi\u0161ljamo o tome treba li \u010duvati podatke na disku, i naj\u010de\u0161\u0107e odgovaramo \u201ene\u201c.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Zaklju\u010dak<\/h1>\n<p><\/p>\n<p>Na kraju, nadam se da sam uspio dati op\u0107enitu predstavu o radu redis-clustera onima koji o njemu nisu ni\u0161ta \u010duli, a tako\u0111er sam skrenuo pa\u017enju na neke nejasne aspekte za one koji ga ve\u0107 dugo koriste.<br \/>\nHvala vam na vremenu i, kao i obi\u010dno, komentari na temu su dobrodo\u0161li.<\/p>\n<p>Izvor: <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.5 - 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\/hr\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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 prelasku s Redis na Redis-cluster | ProHoster","description":"Ulazak u proizvod koji se vi\u0161e razvija.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/91846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=91846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/91846\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/91847"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=91846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=91846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=91846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}