{"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\/ro\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","title":{"rendered":"About the move from Redis to Redis-cluster","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"About the move from Redis to Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/ea8bc47f73ef3b06ccfdf94d323592bf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Venind dintr-un produs care s-a dezvoltat timp de mai bine de un deceniu, nu este surprinz\u0103tor s\u0103 \u00eent\u00e2lne\u0219ti tehnologii \u00eenvechite. Dar ce se \u00eent\u00e2mpl\u0103 dac\u0103, \u00een termen de \u0219ase luni, trebuie s\u0103 gestionezi o sarcin\u0103 de zece ori mai mare, iar costul c\u0103derilor cre\u0219te de sute de ori? \u00cen acest caz, ai nevoie de un inginer Highload experimentat. Dar, din lips\u0103 de personal specializat, problema a fost \u00eencredin\u021bat\u0103 mie. \u00cen prima parte a articolului, voi povesti cum am migrat de la Redis la Redis-cluster, iar \u00een a doua parte voi oferi sfaturi despre cum s\u0103 \u00eencepi utilizarea clusterului \u0219i la ce s\u0103 fii atent \u00een exploatarea sa.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"vybor-tehnologii\">Alegerea tehnologiei<\/h1>\n<p><\/p>\n<p>Este at\u00e2t de r\u0103u <em>Redis separat<\/em> (redis standalone) \u00een configura\u021bia 1 master \u0219i N slave? De ce \u00eel numesc tehnologie \u00eenvechit\u0103?<\/p>\n<p><\/p>\n<blockquote><p>Nu, Redis nu este at\u00e2t de r\u0103u... Totu\u0219i, exist\u0103 c\u00e2teva neajunsuri pe care nu le po\u021bi ignora.<\/p><\/blockquote>\n<p><\/p>\n<ul>\n<li>\n<p>\u00cen primul r\u00e2nd, Redis nu suport\u0103 mecanisme de recuperare \u00een caz de c\u0103dere a masterului. Pentru a rezolva aceast\u0103 problem\u0103, am folosit o configura\u021bie cu comutarea automat\u0103 a VIP-urilor pe un nou master, schimb\u00e2nd rolul unuia dintre slave \u0219i comut\u00e2nd celelalte. Acest mecanism a func\u021bionat, dar nu se putea numi o solu\u021bie fiabil\u0103. \u00cen primul r\u00e2nd, au existat alarme false, iar \u00een al doilea r\u00e2nd, era o solu\u021bie temporar\u0103, iar dup\u0103 activare erau necesare ac\u021biuni manuale pentru a restabili sistemul.<\/p>\n<p>\n<\/li>\n<li>\n<p>\u00cen al doilea r\u00e2nd, existenta unui singur master a dus la probleme de shardare. A fost necesar s\u0103 cream mai multe clustere independente \u201e1 master \u0219i N slave\u201d, apoi s\u0103 distribuim manual bazele pe aceste ma\u0219ini \u0219i s\u0103 sper\u0103m c\u0103 m\u00e2ine una dintre baze nu se va extinde at\u00e2t de mult \u00eenc\u00e2t va trebui s\u0103 o mut\u0103m pe o instan\u021b\u0103 separat\u0103.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Ce op\u021biuni avem?<\/p>\n<p><\/p>\n<ul>\n<li>Cea mai costisitoare \u0219i sofisticat\u0103 solu\u021bie este Redis-Enterprise. Aceasta este o solu\u021bie de tip cutie, cu suport tehnic complet. Cu toate c\u0103 arat\u0103 ideal din punct de vedere tehnic, nu ni se potrive\u0219te din motive ideologice. <\/li>\n<li>Redis-cluster. Din cutie, ofer\u0103 suport pentru comutarea automat\u0103 a masterului \u0219i shardare. Interfa\u021ba este aproape identic\u0103 cu versiunea obi\u0219nuit\u0103. Arat\u0103 promi\u021b\u0103tor, iar despre capcanele ascunse vom vorbi mai departe.<\/li>\n<li>Tarantool, Memcache, Aerospike \u0219i altele. Toate aceste instrumente fac cam acela\u0219i lucru. Dar fiecare are propriile sale dezavantaje. Am decis s\u0103 nu punem toate ou\u0103le \u00eentr-un singur co\u0219. Memcache \u0219i Tarantool le folosim pentru alte sarcini \u0219i, anticipez, voi spune c\u0103 \u00een practica noastr\u0103 am avut mai multe probleme cu ele.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"specifika-ispolzovaniya\">Specifica utiliz\u0103rii<\/h1>\n<p><\/p>\n<p>S\u0103 ne uit\u0103m la ce sarcini am rezolvat istoric cu Redis \u0219i ce func\u021bionalitate am folosit:<\/p>\n<p><\/p>\n<ul>\n<li>Cache \u00eenainte de cererile c\u0103tre servicii externe precum 2GIS | Golang<br \/>\n<blockquote><p>GET SET MGET MSET \"SELECT DB\"\n<\/p><\/blockquote>\n<\/li>\n<li>Cache \u00eenainte de MYSQL | PHP<br \/>\n<blockquote><p>GET SET MGET MSET SCAN \"KEY BY PATTERN\" \"SELECT DB\"\n<\/p><\/blockquote>\n<\/li>\n<li>Stocare principal\u0103 pentru serviciul de gestionare a sesiunilor \u0219i coordonatele \u0219oferilor | Golang<br \/>\n<blockquote><p>GET SET MGET MSET \"SELECT DB\" \"ADD GEO KEY\" \"GET GEO KEY\" SCAN\n<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Dup\u0103 cum vezi, nu este nicio matematic\u0103 avansat\u0103. Care este, a\u0219adar, dificultatea? S\u0103 analiz\u0103m fiecare metod\u0103 \u00een parte.<\/p>\n<p><\/p>\n<p>Metoda<br \/>\nDescriere<br \/>\nParticularit\u0103\u021bile Redis-cluster<br \/>\nSolu\u021bie<\/p>\n<p>GET SET<br \/>\nScrie\/cite\u0219te o cheie<\/p>\n<p>MGET MSET<br \/>\nScrie\/cite\u0219te mai multe chei<br \/>\nCheile vor fi distribuite pe diferite noduri. Bibliotecile disponibile pot face opera\u021bii multi doar \u00een cadrul unui singur nod<br \/>\n\u00cenlocuie\u0219te MGET cu un pipeline din N opera\u021bii GET<\/p>\n<p>SELECT DB<br \/>\nAlege baza cu care vom lucra<br \/>\nNu suport\u0103 mai multe baze de date<br \/>\nS\u0103 stoc\u0103m totul \u00eentr-o singur\u0103 baz\u0103. Adaug\u0103 prefixe la chei<\/p>\n<p>SCAN<br \/>\nParcurge toate cheile din baz\u0103<br \/>\nDeoarece avem o singur\u0103 baz\u0103, a parcurge toate cheile din cluster este prea costisitor<br \/>\nS\u0103 men\u021binem invarianta \u00eentr-o singur\u0103 cheie \u0219i s\u0103 facem HSCAN pe aceast\u0103 cheie. Sau s\u0103 renun\u021b\u0103m complet<\/p>\n<p>GEO<br \/>\nOpera\u021bii cu geocheia<br \/>\nGeocheia nu este sharduit\u0103<\/p>\n<p>KEY BY PATTERN<br \/>\nCaut\u0103 cheia dup\u0103 pattern<br \/>\nDeoarece avem o singur\u0103 baz\u0103, vom c\u0103uta printre toate cheile din cluster. Este prea costisitor<br \/>\nRenun\u021b\u0103m sau men\u021binem invarianta, a\u0219a cum este cazul cu SCAN-ul<\/p>\n<p><\/p>\n<h1 id=\"redis-vs-redis-cluster\">Redis vs Redis-cluster<\/h1>\n<p><\/p>\n<p>Ce pierdem \u0219i ce c\u00e2\u0219tig\u0103m la trecerea la cluster?<\/p>\n<p><\/p>\n<ul>\n<li>Dezavantaje: pierdem func\u021bionalitatea mai multor baze. \n<ul>\n<li>Dac\u0103 dorim s\u0103 stoc\u0103m date logic necorelate \u00eentr-un singur cluster, va trebui s\u0103 facem solu\u021bii temporare sub form\u0103 de prefixe. <\/li>\n<li>Pierd toate opera\u021biile \u201epe baz\u0103\u201d, cum ar fi SCAN, DBSIZE, CLEAR DB etc.<\/li>\n<li>Opera\u021biile multi au devenit semnificativ mai complexe, deoarece poate fi necesar\u0103 interac\u021biunea cu mai multe noduri.<\/li>\n<\/ul>\n<\/li>\n<li>Avantaje: \n<ul>\n<li>Toleran\u021b\u0103 la erori \u00een form\u0103 de comutare de urgen\u021b\u0103 a masterului.<\/li>\n<li>Sharduri pe partea de Redis.<\/li>\n<li>Transferarea datelor \u00eentre noduri atomar \u0219i f\u0103r\u0103 \u00eentreruperi.<\/li>\n<li>Ad\u0103ugarea \u0219i redistribuirea resurselor \u0219i a \u00eenc\u0103rc\u0103rilor f\u0103r\u0103 \u00eentreruperi.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><em>A\u0219 concluziona c\u0103, dac\u0103 nu este necesar\u0103 asigurarea unui nivel \u00eenalt de fiabilitate, mutarea pe un cluster nu merit\u0103, deoarece poate fi o sarcin\u0103 complicat\u0103. Dar, dac\u0103 trebuie s\u0103 alegem \u00eentre o versiune separat\u0103 \u0219i una cluster, ar trebui s\u0103 alegem clusterul, deoarece nu este cu nimic mai prejos \u0219i, \u00een plus, va elimina o parte din durerea de cap.<\/em><\/p>\n<p><\/p>\n<h1 id=\"podgotovka-k-pereezdu\">Preg\u0103tirea pentru mutare<\/h1>\n<p><\/p>\n<p>S\u0103 \u00eencepem cu cerin\u021bele pentru mutare:<\/p>\n<p><\/p>\n<ul>\n<li>Aceasta trebuie s\u0103 fie f\u0103r\u0103 \u00eentreruperi. O oprire complet\u0103 a serviciului timp de 5 minute nu este acceptabil\u0103 pentru noi.<\/li>\n<li>Trebuie s\u0103 fie c\u00e2t mai sigur\u0103 \u0219i gradual\u0103. Ne dorim s\u0103 avem un control asupra situa\u021biei. Nu dorim s\u0103 mut\u0103m totul deodat\u0103 \u0219i s\u0103 ne rug\u0103m la butonul de revenire.<\/li>\n<li>Pierderi minime de date \u00een timpul mut\u0103rii. \u00cen\u021belegem c\u0103 mutarea atomic\u0103 va fi foarte complicat\u0103, prin urmare, accept\u0103m o oarecare desincronizare \u00eentre datele din Redis-ul obi\u0219nuit \u0219i cel cluster.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"obsluzhivanie-klastera\">\u00centre\u021binerea clusterului<\/h1>\n<p><\/p>\n<p>\u00cenainte de a efectua mutarea, ar trebui s\u0103 ne \u00eentreb\u0103m dac\u0103 putem \u00eentre\u021bine clusterul:<\/p>\n<p><\/p>\n<ul>\n<li>Grafice. Folosim Prometheus \u0219i Grafana pentru graficele de \u00eenc\u0103rcare a procesoarelor, utilizarea memoriei, num\u0103rul de clien\u021bi, num\u0103rul de opera\u021bii GET, SET, AUTH etc.<\/li>\n<li>Expertiz\u0103. Imagineaz\u0103-\u021bi c\u0103, de m\u00e2ine, vei avea sub responsabilitate un cluster imens. Dac\u0103 se stric\u0103, nimeni \u00een afar\u0103 de tine nu \u00eel va putea repara. Dac\u0103 \u00eencepe s\u0103 fie lent - to\u021bi se vor \u00eendrepta spre tine. Dac\u0103 trebuie s\u0103 adaugi resurse sau s\u0103 redistribui sarcina - din nou, la tine. Pentru a nu albi prematur, este recomandat s\u0103 avem \u00een vedere aceste situa\u021bii \u0219i s\u0103 verific\u0103m din timp cum se va comporta tehnologia \u00een diferite ac\u021biuni. Vom discuta acest subiect mai \u00een detaliu \u00een sec\u021biunea \u201eExpertiz\u0103\u201d.<\/li>\n<li>Monitoriz\u0103ri \u0219i alerte. Atunci c\u00e2nd clusterul se stric\u0103, ne dorim s\u0103 fim primii care afl\u0103. Aici ne-am limitat la a fi anun\u021ba\u021bi c\u0103 toate nodurile returneaz\u0103 aceea\u0219i informa\u021bie despre starea clusterului (da, se poate \u00eent\u00e2mpla \u0219i altfel). Alte probleme se pot observa mai rapid prin alertele serviciilor client Redis.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"pereezd\">Mutare<\/h1>\n<p><\/p>\n<p>Cum ne vom muta:<\/p>\n<p><\/p>\n<ul>\n<li>\u00cen primul r\u00e2nd, trebuie s\u0103 preg\u0103tim biblioteca pentru a func\u021biona cu clusterul. Ca baz\u0103 pentru versiunea \u00een G\u043e, am folosit go-redis \u0219i am f\u0103cut c\u00e2teva modific\u0103ri. Am implementat metodele Multi prin pipeline-uri \u0219i am ajustat pu\u021bin regulile pentru repetarea cererilor. Cu versiunea pentru PHP au fost mai multe probleme, dar \u00een cele din urm\u0103 ne-am oprit asupra php-redis. Recent, au implementat suport pentru cluster, iar \u00een opinia noastr\u0103, arat\u0103 bine.<\/li>\n<li>Apoi trebuie s\u0103 desf\u0103\u0219ur\u0103m clusterul propriu-zis. Acest lucru se face literalmente \u00een dou\u0103 comenzi, pe baza fi\u0219ierului de configura\u021bie. Vom discuta despre configurare mai \u00een detaliu mai jos.<\/li>\n<li>Pentru o tranzi\u021bie gradual\u0103, folosim dry-mode. Deoarece avem dou\u0103 versiuni ale bibliotecii cu aceea\u0219i interfa\u021b\u0103 (una pentru versiunea obi\u0219nuit\u0103, alta pentru cluster), nu este nicio problem\u0103 s\u0103 cre\u0103m un wrapper care va func\u021biona cu versiunea separat\u0103 \u0219i va duplica toate cererile \u00een cluster, compar\u00e2nd r\u0103spunsurile \u0219i scriind abaterile \u00een jurnale (\u00een cazul nostru \u00een NewRelic). Astfel, chiar dac\u0103 versiunea cluster se va strica \u00een timpul implement\u0103rii, produc\u021bia noastr\u0103 nu va fi afectat\u0103. <\/li>\n<li>Dup\u0103 ce am desf\u0103\u0219urat clusterul \u00een dry-mode, putem observa lini\u0219tit graficul abaterilor r\u0103spunsurilor. Dac\u0103 procentajul erorilor se \u00eendreapt\u0103 lent, dar sigur, c\u0103tre o constant\u0103 mic\u0103, \u00eenseamn\u0103 c\u0103 totul este \u00een regul\u0103. De ce exist\u0103 totu\u0219i abateri? Pentru c\u0103 scrierea \u00een versiunea separat\u0103 se face pu\u021bin mai devreme dec\u00e2t \u00een cluster, iar din cauza micro-logurilor, datele pot diverge. R\u0103m\u00e2ne doar s\u0103 ne uit\u0103m la jurnalele abaterilor, iar dac\u0103 toate sunt explicabile prin neatomaritatea scrierii, putem merge mai departe.<\/li>\n<li>Acum putem schimba dry-mode \u00een direc\u021bia opus\u0103. Vom scrie \u0219i citi din cluster, iar dubl\u0103m \u00een versiunea separat\u0103. De ce? \u00cen urm\u0103toarea s\u0103pt\u0103m\u00e2n\u0103 dorim s\u0103 observ\u0103m func\u021bionarea clusterului. Dac\u0103 se va dovedi c\u0103 exist\u0103 probleme \u00een timpul v\u00e2rfurilor de \u00eenc\u0103rcare sau c\u0103 am omis ceva, avem \u00eentotdeauna o revenire de urgen\u021b\u0103 la codul vechi \u0219i datele actuale datorit\u0103 dry-mode.<\/li>\n<li>R\u0103m\u00e2ne s\u0103 dezactiv\u0103m dry-mode \u0219i s\u0103 demont\u0103m versiunea separat\u0103. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"ekspertiza\">Expertiz\u0103<\/h1>\n<p><\/p>\n<p>\u00cencepe\u021bi prin a vorbi pe scurt despre arhitectura clusterului.<\/p>\n<p><\/p>\n<p>\u00cen primul r\u00e2nd, Redis este un magazin de tip key-value. Ca \u0219i cheie se utilizeaz\u0103 \u0219iruri de caractere arbitrare. Ca valori pot fi utilizate numere, \u0219iruri de caractere \u0219i structuri \u00eentregi. Acestea din urm\u0103 sunt foarte numeroase, dar pentru a \u00een\u021belege arhitectura general\u0103, acest aspect nu este important.<br \/>\nUrm\u0103toarea nivel de abstractizare dup\u0103 chei sunt sloturile (SLOTS). Fiecare cheie apar\u021bine uneia dintre cele 16 383 de sloturi. \u00cen fiecare slot pot fi c\u00e2te chei dorim. Astfel, toate cheile se \u00eempart \u00een 16 383 de mul\u021bimi distincte.<br \/>\n<img decoding=\"async\" alt=\"About the move from Redis to Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/a5e4be23381b42287f693e01d5d59a99.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Apoi, \u00een cluster trebuie s\u0103 existe N noduri master. Fiecare nod poate fi considerat ca un instan\u021b de Redis separat, care \u0219tie totul despre celelalte noduri din cluster. Fiecare nod master con\u021bine un anumit num\u0103r de sloturi. Fiecare slot apar\u021bine doar unui nod master. Toate sloturile trebuie distribuite \u00eentre noduri. Dac\u0103 unele sloturi nu sunt distribuite, cheile stocate \u00een ele nu vor fi accesibile. Fiecare nod master are sens s\u0103 fie pornit pe o ma\u0219in\u0103 logic\u0103 sau fizic\u0103 separat\u0103. De asemenea, trebuie s\u0103 re\u021binem c\u0103 fiecare nod func\u021bioneaz\u0103 pe un singur nucleu, iar dac\u0103 dori\u021bi s\u0103 rula\u021bi mai multe instan\u021be Redis pe aceea\u0219i ma\u0219in\u0103 logic\u0103, asigura\u021bi-v\u0103 c\u0103 acestea vor rula pe nuclee diferite (nu am \u00eencercat a\u0219a, dar \u00een teorie ar trebui s\u0103 func\u021bioneze). Practic, nodurile master asigur\u0103 o fragmentare obi\u0219nuit\u0103, iar un num\u0103r mai mare de noduri master permite scalarea cererilor de scriere \u0219i citire.<\/p>\n<p><\/p>\n<p>Dup\u0103 ce toate cheile sunt distribuite pe sloturi, iar sloturile sunt \u00eemp\u0103r\u021bite \u00eentre nodurile master, la fiecare nod master se pot ad\u0103uga un num\u0103r nelimitat de noduri slave. \u00cen interiorul fiec\u0103rei astfel de leg\u0103turi \u201emaster-slave\u201d va func\u021biona replicarea obi\u0219nuit\u0103. Slavele sunt necesare pentru scalarea cererilor de citire \u0219i pentru comutarea de urgen\u021b\u0103 \u00een caz de defectare a masterului.<br \/>\n<img decoding=\"async\" alt=\"About the move from Redis to Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/90feb7ef9dacb858d5f21edc214df14d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acum s\u0103 discut\u0103m despre opera\u021biile pe care ar trebui s\u0103 le putem executa.<\/p>\n<p><\/p>\n<p>Vom accesa sistemul prin Redis-CLI. Deoarece Redis nu are un punct unic de acces, putem efectua urm\u0103toarele opera\u021bii pe oricare dintre noduri. Fiecare punct accentueaz\u0103 posibilitatea de a efectua opera\u021bia sub sarcin\u0103.<\/p>\n<p><\/p>\n<ul>\n<li>Primul \u0219i cel mai important lucru de care avem nevoie: opera\u021bia cluster nodes. Aceasta returneaz\u0103 starea clusterului, arat\u0103 lista nodurilor, rolurile lor, distribu\u021bia sloturilor etc. Informa\u021bii suplimentare pot fi ob\u021binute folosind cluster info \u0219i cluster slots.<\/li>\n<li>Ar fi bine s\u0103 po\u021bi ad\u0103uga \u0219i elimina noduri. Pentru aceasta exist\u0103 opera\u021biile cluster meet \u0219i cluster forget. Re\u021bine\u021bi c\u0103 trebuie aplicat cluster forget pentru FIECARE nod, at\u00e2t pentru mastere, c\u00e2t \u0219i pentru replici. Cluster meet trebuie apelat doar pe un singur nod. Aceast\u0103 diferen\u021b\u0103 poate fi descurajant\u0103, a\u0219a c\u0103 e mai bine s\u0103 o cuno\u0219ti \u00eenainte de a pune \u00een func\u021biune clusterul. Ad\u0103ugarea unui nod se realizeaz\u0103 \u00een siguran\u021b\u0103 \u00een timpul func\u021bion\u0103rii \u0219i nu afecteaz\u0103 activitatea clusterului (ceea ce este logic). Dac\u0103 dori\u021bi s\u0103 elimina\u021bi un nod din cluster, asigura\u021bi-v\u0103 c\u0103 nu mai are sloturi (altfel risca\u021bi s\u0103 pierde\u021bi accesul la toate cheile de pe acest nod). De asemenea, nu elimina\u021bi masterul care are slave-uri, altfel va avea loc o votare inutil\u0103 pentru un nou master. Dac\u0103 pe noduri nu mai sunt sloturi, atunci aceasta este o problem\u0103 minor\u0103, dar de ce s\u0103 avem alegeri inutile c\u00e2nd putem elimina mai \u00eent\u00e2i slave-urile.<\/li>\n<li>Dac\u0103 trebuie s\u0103 schimbi for\u021bat locurile \u00eentre master \u0219i slave, atunci comanda cluster failover este potrivit\u0103. Atunci c\u00e2nd o chemi \u00een timpul func\u021bion\u0103rii, trebuie s\u0103 \u00een\u021belegi c\u0103, pe durata opera\u021biei, masterul va fi inaccesibil. De obicei, schimbarea se realizeaz\u0103 \u00een mai pu\u021bin de o secund\u0103, dar nu este atomic\u0103. Po\u021bi s\u0103 te a\u0219tep\u021bi ca o parte din cererile c\u0103tre master \u00een acel moment s\u0103 se finalizeze cu o eroare.<\/li>\n<li>\u00cenainte de a elimina un nod din cluster, nu trebuie s\u0103 mai r\u0103m\u00e2n\u0103 sloturi pe acesta. Este mai bine s\u0103 le redistribui\u021bi folosind comanda cluster reshard. Sloturile vor fi mutate de la un master la altul. \u00centreaga opera\u021biune poate dura c\u00e2teva minute, \u00een func\u021bie de volumul de date transferate; \u00eens\u0103, procesul de transfer este sigur \u0219i nu afecteaz\u0103 func\u021bionarea cluster-ului. Astfel, toate datele pot fi transferate de la un nod la altul chiar sub sarcin\u0103, f\u0103r\u0103 a trebuie s\u0103 v\u0103 face\u021bi griji cu privire la disponibilitatea lor. Totu\u0219i, exist\u0103 \u0219i unele nuan\u021be. \u00cen primul r\u00e2nd, transferul datelor implic\u0103 o anumit\u0103 sarcin\u0103 asupra nodului destinatar \u0219i asupra celui de expediere. Dac\u0103 nodul destinat este deja foarte solicitat din punct de vedere al procesorului, nu ar trebui s\u0103 \u00eel supra\u00eenc\u0103rca\u021bi \u0219i cu primirea de noi date. \u00cen al doilea r\u00e2nd, odat\u0103 ce pe masterul-expeditor nu vor mai r\u0103m\u00e2ne sloturi, toate replicile sale vor trece imediat la masterul pe care au fost mutate aceste sloturi. Problema este c\u0103 toate aceste replici vor dori s\u0103 sincronizeze datele simultan. \u0218i ve\u021bi avea noroc dac\u0103 va fi o sincronizare par\u021bial\u0103, nu una complet\u0103. Lua\u021bi asta \u00een considerare \u0219i combina\u021bi opera\u021biunile de transfer al sloturilor \u0219i de deconectare\/transfer al replicilor. Sau, spera\u021bi c\u0103 ave\u021bi suficiente resurse disponibile.<\/li>\n<li>Ce s\u0103 face\u021bi dac\u0103, \u00een timpul transferului, a\u021bi descoperit c\u0103 a\u021bi pierdut sloturi? Sper c\u0103 aceast\u0103 problem\u0103 nu va ap\u0103rea pentru dumneavoastr\u0103, dar, \u00een caz contrar, exist\u0103 opera\u021bia cluster fix. Aceasta va redistribui sloturile pe noduri \u00eentr-o ordine aleatorie. Recomand s\u0103 verifica\u021bi cum func\u021bioneaz\u0103, elimin\u00e2nd anterior un nod din cluster care are sloturi distribuite. Deoarece datele \u00een sloturile nedistribuite sunt oricum inaccesibile, este prea t\u00e2rziu s\u0103 v\u0103 preocupa\u021bi de problemele de disponibilitate ale acestor sloturi. \u00cen schimb, opera\u021bia nu va afecta sloturile distribuite.<\/li>\n<li>O alt\u0103 opera\u021biune util\u0103 este monitor. Aceasta permite vizualizarea \u00een timp real a \u00eentregii liste de cereri care vin c\u0103tre nod. Mai mult, pe baza acesteia se poate realiza un grep pentru a verifica dac\u0103 exist\u0103 traficul dorit.<\/li>\n<\/ul>\n<p><\/p>\n<p>De asemenea, merit\u0103 men\u021bionat\u0103 procedura de comutare de urgen\u021b\u0103 a masterului. Pe scurt, exist\u0103, \u0219i, \u00een opinia mea, func\u021bioneaz\u0103 perfect. Cu toate acestea, nu trebuie s\u0103 crede\u021bi c\u0103, dac\u0103 deconecta\u021bi cablul din priz\u0103 de la ma\u0219ina cu nod master, Redis se va comuta imediat \u0219i clien\u021bii nu vor observa pierderea. Din experien\u021ba mea, comutarea dureaz\u0103 c\u00e2teva secunde. \u00cen acest timp, o parte din date va fi indisponibil\u0103: se detecteaz\u0103 indisponibilitatea masterului, nodurile voteaz\u0103 pentru un nou master, slavele se comut\u0103, datele se sincronizeaz\u0103. Cea mai bun\u0103 modalitate de a verifica pe cont propriu c\u0103 schema func\u021bioneaz\u0103 este s\u0103 efectua\u021bi exerci\u021bii locale. Lansa\u021bi un cluster pe laptopul dumneavoastr\u0103, aplica\u021bi o sarcin\u0103 minim\u0103, simula\u021bi o c\u0103dere (de exemplu, bloc\u00e2nd porturile), evalua\u021bi viteza de comutare. \u00cen opinia mea, doar juc\u00e2ndu-v\u0103 \u00een acest mod timp de o zi-dou\u0103, pute\u021bi fi siguri de func\u021bionarea tehnologiei. Sau, altfel spus, s\u0103 sper\u0103m c\u0103 software-ul utilizat de jum\u0103tate din internet func\u021bioneaz\u0103 cu adev\u0103rat.<\/p>\n<p><\/p>\n<h1 id=\"konfiguraciya\">Configura\u021bie<\/h1>\n<p><\/p>\n<p>Adesea, configura\u021bia este primul lucru necesar pentru a \u00eencepe lucrul cu instrumentul. \u0218i c\u00e2nd totul func\u021bioneaz\u0103, nu dorim s\u0103 atingem configura\u021bia. Sunt necesare eforturi considerabile pentru a te determina s\u0103 te \u00eentorci la set\u0103ri \u0219i s\u0103 le examinezi cu aten\u021bie. Din c\u00e2te \u00eemi amintesc, am avut cel pu\u021bin dou\u0103 e\u0219ecuri serioase din cauza neaten\u021biei fa\u021b\u0103 de configura\u021bie. Acorda\u021bi o aten\u021bie deosebit\u0103 urm\u00e2nd puncte:<\/p>\n<p><\/p>\n<ul>\n<li>timeout 0<br \/>\n<em>Timpul dup\u0103 care se \u00eenchid conexiunile inactive (\u00een secunde). 0 \u2013 nu se \u00eenchid<\/em><br \/>\nNu fiecare dintre bibliotecile noastre reu\u0219ea s\u0103 \u00eenchid\u0103 corect conexiunile. Dezactiv\u00e2nd aceast\u0103 setare, risc\u0103m s\u0103 ne lovim de limita num\u0103rului de clien\u021bi. Pe de alt\u0103 parte, dac\u0103 exist\u0103 o astfel de problem\u0103, \u00eentreruperea automat\u0103 a conexiunilor pierdute o va masca, iar noi s-ar putea s\u0103 nu o observ\u0103m. De asemenea, nu ar trebui s\u0103 activ\u0103m aceast\u0103 setare la utilizarea conexiunilor persistente.<\/li>\n<li>Save x y &amp; appendonly yes<br \/>\n<em>Salvarea RDB-snapshot-ului.<\/em><br \/>\nProblemele RDB\/AOF le vom discuta \u00een detaliu mai jos.<\/li>\n<li>stop-writes-on-bgsave-error no &amp; slave-serve-stale-data yes<br \/>\n<em>Dac\u0103 este activat, atunci \u00een cazul unei erori a RDB-snapshot-ului, masterul va \u00eenceta s\u0103 primeasc\u0103 cereri de modificare. Dac\u0103 conexiunea cu masterul este pierdut\u0103, atunci slave-ul poate continua s\u0103 r\u0103spund\u0103 la cereri (da). Sau poate \u00eenceta s\u0103 r\u0103spund\u0103 (nu)<\/em><br \/>\nNu ne mul\u021bume\u0219te situa\u021bia \u00een care Redis se transform\u0103 \u00een o dovleac.<\/li>\n<li>repl-ping-slave-period 5<br \/>\n<em>Dup\u0103 acest interval de timp, ne vom \u00eencepe s\u0103 ne facem griji c\u0103 masterul s-a stricat \u0219i c\u0103 ar trebui s\u0103 ini\u021biem procedura de failover.<\/em><br \/>\nVa trebui s\u0103 g\u0103sim manual echilibrul \u00eentre alertele false \u0219i ini\u021bierea failover-ului. \u00cen experien\u021ba noastr\u0103, aceasta dureaz\u0103 aproximativ 5 secunde.<\/li>\n<li>repl-backlog-size 1024mb &amp; epl-backlog-ttl 0<br \/>\n<em>At\u00e2t de multe date putem stoca \u00een buffer pentru replica c\u0103zut\u0103. Dac\u0103 bufferul se umple, va trebui s\u0103 ne sincroniz\u0103m complet.<\/em><br \/>\nPractic\u0103 ne arat\u0103 c\u0103 este mai bine s\u0103 set\u0103m o valoare mai mare. Exist\u0103 destule motive pentru care replica ar putea \u00eencepe s\u0103 \u00eent\u00e2rzie. Dac\u0103 \u00eent\u00e2rzie, este foarte probabil c\u0103 masterul t\u0103u se confrunt\u0103 deja cu dificult\u0103\u021bi, iar sincronizarea complet\u0103 va fi ultimul picur.<\/li>\n<li>maxclients 10000<br \/>\n<em>Num\u0103rul maxim de clien\u021bi simultani.<\/em><br \/>\nDin experien\u021ba noastr\u0103, este mai bine s\u0103 set\u0103m o valoare mai mare. Redis se descurc\u0103 perfect cu 10.000 de conexiuni. Asigur\u0103-te doar c\u0103 sistemul are suficiente socket-uri. <\/li>\n<li>maxmemory-policy volatile-ttl<br \/>\n<em>Regula dup\u0103 care se \u0219terg cheile atunci c\u00e2nd se atinge limita de memorie disponibil\u0103.<\/em><br \/>\nAici este important nu doar regula \u00een sine, ci \u00een\u021belegerea modului \u00een care va fi aplicat\u0103. Redis merit\u0103 l\u0103udat pentru capacitatea sa de a func\u021biona eficient atunci c\u00e2nd se atinge limita de memorie. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"problemy-rdb-i-aof\">Problemele RDB \u0219i AOF<\/h1>\n<p><\/p>\n<p>De\u0219i Redis \u00ee\u0219i stocheaz\u0103 toate informa\u021biile \u00een memoria RAM, exist\u0103 \u0219i un mecanism de salvare a datelor pe disc. Mai exact, trei mecanisme:<\/p>\n<p><\/p>\n<ul>\n<li>RDB-snapshot \u2014 o copie complet\u0103 a tuturor datelor. Se configureaz\u0103 cu ajutorul SAVE X Y \u0219i se cite\u0219te ca \u00abSalveaz\u0103 o copie complet\u0103 a tuturor datelor la fiecare X secunde, dac\u0103 s-au schimbat m\u0103car Y chei\u00bb.<\/li>\n<li>Append-only file \u2014 o list\u0103 de opera\u021bii \u00een ordinea \u00een care sunt executate. Adaug\u0103 noile opera\u021bii \u00een fi\u0219ier la fiecare X secunde sau la fiecare Y opera\u021bii.<\/li>\n<li>RDB \u0219i AOF \u2014 combina\u021bia celor dou\u0103 anterioare.<\/li>\n<\/ul>\n<p><\/p>\n<p>Toate metodele au propriile avantaje \u0219i dezavantaje; nu voi enumera toate, ci voi sublinia doar aspectele care, \u00een opinia mea, nu sunt evidente.<\/p>\n<p><\/p>\n<p>\u00cen primul r\u00e2nd, pentru salvarea unui snapshot RDB, este necesar s\u0103 se apeleze FORK. Dac\u0103 sunt multe date, acest lucru poate bloca \u00eentreg Redis-ul pentru o perioad\u0103 de c\u00e2teva milisecunde p\u00e2n\u0103 la o secund\u0103. \u00cen plus, sistemul necesita memorie pentru un astfel de snapshot, ceea ce duce la necesitatea de a avea pe ma\u0219ina logic\u0103 o rezerv\u0103 dubl\u0103 de RAM: dac\u0103 pentru Redis sunt aloca\u021bi 8 GB, atunci pe ma\u0219ina virtual\u0103 cu el trebuie s\u0103 fie disponibili 16.<\/p>\n<p><\/p>\n<p>\u00cen al doilea r\u00e2nd, exist\u0103 probleme cu sincronizarea par\u021bial\u0103. \u00cen modul AOF, la reconectarea slave-ului, \u00een loc de sincronizarea par\u021bial\u0103, poate fi efectuat\u0103 o sincronizare complet\u0103. Nu am reu\u0219it s\u0103 \u00een\u021beleg de ce se \u00eent\u00e2mpl\u0103 acest lucru. Dar merit\u0103 s\u0103 ne amintim acest aspect.<\/p>\n<p><\/p>\n<p>Aceste dou\u0103 puncte deja ne fac s\u0103 ne g\u00e2ndim dac\u0103 este necesar s\u0103 p\u0103str\u0103m aceste date pe disc, dac\u0103 oricum sunt duplicate de slave-uri. Datele pot fi pierdute doar \u00een cazul \u00een care toate slave-urile au o defec\u021biune, iar aceasta este o problem\u0103 de nivel \u201eincendiu \u00een DC\u201d. Ca un compromis, se poate propune p\u0103strarea datelor doar pe slave-uri, dar \u00een acest caz trebuie s\u0103 ne asigur\u0103m c\u0103 aceste slave-uri nu devin niciodat\u0103 master \u00een cazul unei recuper\u0103ri dup\u0103 o defec\u021biune (pentru asta exist\u0103 setarea prioritar\u0103 a slave-urilor \u00een configura\u021bia lor). Noi, \u00een fiecare caz concret, ne g\u00e2ndim dac\u0103 trebuie s\u0103 p\u0103str\u0103m datele pe disc, \u0219i de cele mai multe ori r\u0103spundem \u201enu\u201d.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Concluzie<\/h1>\n<p><\/p>\n<p>\u00cen concluzie, sper c\u0103 am reu\u0219it s\u0103 ofer o idee general\u0103 despre func\u021bionarea redis-cluster-ului celor care nu au auzit deloc despre el, precum \u0219i s\u0103 atrag aten\u021bia asupra unor aspecte mai pu\u021bin evidente pentru cei care \u00eel folosesc de mult timp.<br \/>\nV\u0103 mul\u021bumesc pentru timpul acordat \u0219i, ca de obicei, comentariile pe aceast\u0103 tem\u0103 sunt binevenite.<\/p>\n<p>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Despre migrarea de la Redis la Redis-cluster | ProHoster","description":"Venind \u00eentr-un produs care se dezvolt\u0103 foarte mult.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/91846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=91846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/91846\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/91847"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=91846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=91846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=91846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}