{"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\/fr\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","title":{"rendered":"Migration de Redis vers Redis-cluster","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Migration de Redis vers Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/ea8bc47f73ef3b06ccfdf94d323592bf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En entrant dans un produit qui \u00e9volue depuis plus d'une d\u00e9cennie, il n'est pas surprenant de rencontrer des technologies obsol\u00e8tes. Mais que se passe-t-il si, dans six mois, vous devez g\u00e9rer une charge dix fois sup\u00e9rieure, et que le co\u00fbt des pannes augmente de centaines de fois ? Dans ce cas, vous avez besoin d'un ing\u00e9nieur Highload comp\u00e9tent. Mais en l'absence d'une telle personne, j'ai \u00e9t\u00e9 charg\u00e9 de r\u00e9soudre le probl\u00e8me. Dans la premi\u00e8re partie de cet article, je vais expliquer comment nous avons migr\u00e9 de Redis vers Redis-cluster, et dans la deuxi\u00e8me partie, je donnerai des conseils sur la fa\u00e7on de commencer \u00e0 utiliser le cluster et sur quoi faire attention lors de son exploitation.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"vybor-tehnologii\">Choix de la technologie<\/h1>\n<p><\/p>\n<p>Est-ce si mauvais <em>un Redis s\u00e9par\u00e9<\/em> (redis autonome) dans une configuration de 1 ma\u00eetre et N esclaves ? Pourquoi est-ce que je l'appelle une technologie obsol\u00e8te ?<\/p>\n<p><\/p>\n<blockquote><p>Non, Redis n'est pas si mauvais... Cependant, il y a certains d\u00e9fauts qu'il ne faut pas ignorer.<\/p><\/blockquote>\n<p><\/p>\n<ul>\n<li>\n<p>D'abord, Redis ne prend pas en charge les m\u00e9canismes de reprise apr\u00e8s une panne du ma\u00eetre. Pour r\u00e9soudre ce probl\u00e8me, nous avons utilis\u00e9 une configuration avec basculement automatique des VIP vers un nouveau ma\u00eetre, changement de r\u00f4le d'un des esclaves et basculement des autres. Ce m\u00e9canisme fonctionnait, mais il ne pouvait pas \u00eatre qualifi\u00e9 de solution fiable. Premi\u00e8rement, il y avait des d\u00e9clenchements intempestifs, et deuxi\u00e8mement, il \u00e9tait temporaire, et apr\u00e8s un d\u00e9clenchement, des actions manuelles \u00e9taient n\u00e9cessaires pour r\u00e9initialiser le syst\u00e8me.<\/p>\n<p>\n<\/li>\n<li>\n<p>Deuxi\u00e8mement, avoir uniquement un ma\u00eetre posait un probl\u00e8me de sharding. Il fallait cr\u00e9er plusieurs clusters ind\u00e9pendants \u00ab 1 ma\u00eetre et N esclaves \u00bb, puis distribuer manuellement les bases de donn\u00e9es sur ces machines et esp\u00e9rer qu'une des bases ne gonfle pas au point qu'il faille la d\u00e9placer sur une instance s\u00e9par\u00e9e.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Quelles sont les options ?<\/p>\n<p><\/p>\n<ul>\n<li>La solution la plus co\u00fbteuse et la plus riche est Redis-Enterprise. C'est une solution pr\u00eate \u00e0 l'emploi avec un support technique complet. Bien qu'elle semble id\u00e9ale d'un point de vue technique, elle ne nous convenait pas sur le plan id\u00e9ologique. <\/li>\n<li>Redis-cluster. Prise en charge int\u00e9gr\u00e9e de basculement de ma\u00eetre et de sharding. L'interface ne diff\u00e8re presque pas de la version classique. Cela semble prometteur ; nous discuterons des pi\u00e8ges plus loin.<\/li>\n<li>Tarantool, Memcache, Aerospike et d'autres. Tous ces outils remplissent \u00e0 peu pr\u00e8s la m\u00eame fonction. Mais chacun pr\u00e9sente ses propres inconv\u00e9nients. Nous avons d\u00e9cid\u00e9 de ne pas mettre tous nos \u0153ufs dans le m\u00eame panier. Nous utilisons Memcache et Tarantool pour d'autres t\u00e2ches, et permettez-moi de dire qu'en pratique, nous avons rencontr\u00e9 plus de probl\u00e8mes avec eux.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"specifika-ispolzovaniya\">Sp\u00e9cificit\u00e9s de l'utilisation<\/h1>\n<p><\/p>\n<p>Regardons les t\u00e2ches que nous avons historiquement r\u00e9solues avec Redis et quelles fonctionnalit\u00e9s nous avons utilis\u00e9es :<\/p>\n<p><\/p>\n<ul>\n<li>Mise en cache avant les requ\u00eates vers des services externes tels que 2GIS | Golang<br \/>\n<blockquote><p>OBTENIR DEFINIR OBTENIR MULTIPLE &quot;SELECTIONNER DB&quot;\n<\/p><\/blockquote>\n<\/li>\n<li>Mise en cache avant MYSQL | PHP<br \/>\n<blockquote><p>OBTENIR DEFINIR OBTENIR MULTIPLE SCANNER &quot;CLE PAR MODELE&quot; &quot;SELECTIONNER DB&quot;\n<\/p><\/blockquote>\n<\/li>\n<li>Magasin principal pour le service de gestion des sessions et des coordonn\u00e9es des conducteurs | Golang<br \/>\n<blockquote><p>OBTENIR DEFINIR OBTENIR MULTIPLE &quot;SELECTIONNER DB&quot; &quot;AJOUTER CLE GEO&quot; &quot;OBTENIR CLE GEO&quot; SCANNER\n<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Comme vous pouvez le voir, il n'y a pas de math\u00e9matiques avanc\u00e9es. Quelle est donc la complexit\u00e9 ? Analysons chaque m\u00e9thode s\u00e9par\u00e9ment.<\/p>\n<p><\/p>\n<p>M\u00e9thode<br \/>\nDescription<br \/>\nCaract\u00e9ristiques de Redis-cluster<br \/>\nSolution<\/p>\n<p>GET SET<br \/>\n\u00c9crire \/ lire une cl\u00e9<\/p>\n<p>MGET MSET<br \/>\n\u00c9crire \/ lire plusieurs cl\u00e9s<br \/>\nLes cl\u00e9s seront stock\u00e9es sur diff\u00e9rents n\u0153uds. Les biblioth\u00e8ques pr\u00eates \u00e0 l'emploi sont capables d'ex\u00e9cuter des op\u00e9rations multiples uniquement au sein d'un m\u00eame n\u0153ud.<br \/>\nRemplacer MGET par un pipeline de N op\u00e9rations GET<\/p>\n<p>SELECT DB<br \/>\nS\u00e9lectionner la base de donn\u00e9es avec laquelle nous travaillerons<br \/>\nNe prend pas en charge plusieurs bases de donn\u00e9es<br \/>\nTout stocker dans une seule base. Ajouter des pr\u00e9fixes aux cl\u00e9s.<\/p>\n<p>SCAN<br \/>\nParcourir toutes les cl\u00e9s dans la base<br \/>\nPuisque nous avons une seule base, parcourir toutes les cl\u00e9s dans le cluster est trop co\u00fbteux.<br \/>\nMaintenir un invariant au sein d'une seule cl\u00e9 et effectuer un HSCAN sur cette cl\u00e9. Ou abandonner compl\u00e8tement.<\/p>\n<p>GEO<br \/>\nOp\u00e9rations avec la cl\u00e9 g\u00e9ographique<br \/>\nLa cl\u00e9 g\u00e9ographique n'est pas shard\u00e9e.<\/p>\n<p>KEY BY PATTERN<br \/>\nRecherche de cl\u00e9 par motif<br \/>\nPuisque nous avons une seule base, nous allons chercher parmi toutes les cl\u00e9s dans le cluster. Cela est trop co\u00fbteux.<br \/>\nAbandonner ou maintenir l'invariant, comme dans le cas de SCAN.<\/p>\n<p><\/p>\n<h1 id=\"redis-vs-redis-cluster\">Redis vs Redis-cluster<\/h1>\n<p><\/p>\n<p>Qu'est-ce que nous perdons et qu'est-ce que nous gagnons en passant au cluster ?<\/p>\n<p><\/p>\n<ul>\n<li>Inconv\u00e9nients : nous perdons la fonctionnalit\u00e9 de plusieurs bases. \n<ul>\n<li>Si nous voulons stocker des donn\u00e9es logiquement non li\u00e9es dans un m\u00eame cluster, nous devrons cr\u00e9er des solutions de contournement comme des pr\u00e9fixes. <\/li>\n<li>Nous perdons toutes les op\u00e9rations \"par base\", telles que SCAN, DBSIZE, CLEAR DB, etc.<\/li>\n<li>Les op\u00e9rations multiples sont devenues beaucoup plus compliqu\u00e9es \u00e0 impl\u00e9menter, car il peut \u00eatre n\u00e9cessaire d'acc\u00e9der \u00e0 plusieurs n\u0153uds.<\/li>\n<\/ul>\n<\/li>\n<li>Avantages : \n<ul>\n<li>Tol\u00e9rance aux pannes gr\u00e2ce au basculement automatique du ma\u00eetre.<\/li>\n<li>Sharding du c\u00f4t\u00e9 de Redis.<\/li>\n<li>Transfert des donn\u00e9es entre les n\u0153uds de mani\u00e8re atomique et sans arr\u00eats.<\/li>\n<li>Ajout et redistribution des ressources et des charges sans temps d'arr\u00eat.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><em>Je conclurais que si vous n'avez pas besoin d'assurer un niveau \u00e9lev\u00e9 de tol\u00e9rance aux pannes, alors migrer vers un cluster n'en vaut pas la peine, car cela peut \u00eatre une t\u00e2che non triviale. Mais si l'option entre une version autonome et un cluster est envisageable, il est pr\u00e9f\u00e9rable de choisir le cluster, car il n'est pas moins performant et vous soulagera d'une partie des tracas.<\/em><\/p>\n<p><\/p>\n<h1 id=\"podgotovka-k-pereezdu\">Pr\u00e9paration \u00e0 la migration<\/h1>\n<p><\/p>\n<p>Commen\u00e7ons par les exigences de la migration :<\/p>\n<p><\/p>\n<ul>\n<li>Elle doit \u00eatre transparente. Un arr\u00eat complet du service pendant 5 minutes ne nous convient pas.<\/li>\n<li>Elle doit \u00eatre aussi s\u00e9curis\u00e9e que progressive. Nous souhaitons avoir un certain contr\u00f4le sur la situation. Nous ne souhaitons pas tout basculer d'un coup et prier pour ne pas avoir \u00e0 utiliser le bouton de retour.<\/li>\n<li>Minimisation des pertes de donn\u00e9es lors de la migration. Nous comprenons qu'il sera tr\u00e8s difficile d'effectuer une migration atomique, c'est pourquoi nous tol\u00e9rons une certaine d\u00e9synchronisation entre les donn\u00e9es sur Redis normal et cluster.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"obsluzhivanie-klastera\">Maintenance du cluster<\/h1>\n<p><\/p>\n<p>Avant la migration proprement dite, il convient de se demander si nous pouvons maintenir le cluster :<\/p>\n<p><\/p>\n<ul>\n<li>Graphiques. Nous utilisons Prometheus et Grafana pour les graphiques de charge des processeurs, de m\u00e9moire utilis\u00e9e, du nombre de clients, du nombre d'op\u00e9rations GET, SET, AUTH, etc.<\/li>\n<li>Expertise. Imaginez que demain vous aurez la responsabilit\u00e9 d'un \u00e9norme cluster. Si cela tombe en panne, personne d'autre que vous ne pourra le r\u00e9parer. Si cela commence \u00e0 \u00eatre lent, tout le monde viendra vers vous. Si des ressources doivent \u00eatre ajout\u00e9es ou si la charge doit \u00eatre redistribu\u00e9e, encore vers vous. Pour ne pas blanchir en un jour, il est souhaitable de pr\u00e9voir ces cas et de tester \u00e0 l'avance comment la technologie se comportera lors de ces actions. Nous en parlerons plus en d\u00e9tail dans la section \u00ab Expertise \u00bb.<\/li>\n<li>Surveillance et alertes. Lorsque le cluster tombe en panne, nous voulons en \u00eatre inform\u00e9s en premier. Pour cela, nous nous sommes limit\u00e9s \u00e0 une alerte indiquant que tous les n\u0153uds renvoient la m\u00eame information sur l'\u00e9tat du cluster (oui, il arrive que ce soit diff\u00e9rent). Les autres probl\u00e8mes sont plus facilement remarqu\u00e9s gr\u00e2ce aux alertes des services clients Redis.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"pereezd\">Migration<\/h1>\n<p><\/p>\n<p>Comment allons-nous migrer :<\/p>\n<p><\/p>\n<ul>\n<li>Tout d'abord, il est n\u00e9cessaire de pr\u00e9parer la biblioth\u00e8que pour travailler avec le cluster. Pour la version en Go, nous avons pris go-redis et l'avons l\u00e9g\u00e8rement modifi\u00e9e pour nos besoins. Nous avons impl\u00e9ment\u00e9 des m\u00e9thodes Multi via des pipelines, et ajust\u00e9 les r\u00e8gles de r\u00e9p\u00e9tition des requ\u00eates. La version PHP a pos\u00e9 plus de probl\u00e8mes, mais finalement, nous nous sommes arr\u00eat\u00e9s sur php-redis. R\u00e9cemment, ils ont introduit le support des clusters, et \u00e0 notre avis, cela semble bon.<\/li>\n<li>Ensuite, il faut d\u00e9ployer le cluster lui-m\u00eame. Cela se fait litt\u00e9ralement en deux commandes sur la base d'un fichier de configuration. Nous discuterons plus en d\u00e9tail des r\u00e9glages ci-dessous.<\/li>\n<li>Pour une migration progressive, nous utilisons le mode dry. Comme nous avons deux versions de la biblioth\u00e8que avec la m\u00eame interface (une pour la version standard, l'autre pour le cluster), il est simple de cr\u00e9er un wrapper qui fonctionnera avec la version s\u00e9par\u00e9e tout en dupliquant toutes les requ\u00eates dans le cluster, comparant les r\u00e9ponses et enregistrant les \u00e9carts dans des logs (dans notre cas, dans NewRelic). Ainsi, m\u00eame si la version du cluster \u00e9choue lors du d\u00e9ploiement, notre production ne sera pas affect\u00e9e. <\/li>\n<li>En d\u00e9ployant le cluster en mode dry, nous pouvons tranquillement observer le graphique des \u00e9carts de r\u00e9ponses. Si la part d'erreurs tend lentement mais s\u00fbrement vers une petite constante, cela signifie que tout va bien. Pourquoi y a-t-il quand m\u00eame des \u00e9carts ? Parce que l'enregistrement dans la version s\u00e9par\u00e9e se produit un peu plus t\u00f4t que dans le cluster, et \u00e0 cause du micro-d\u00e9lai, les donn\u00e9es peuvent diverger. Il suffit maintenant de v\u00e9rifier les logs des \u00e9carts, et si tous sont explicables par la non-atomicit\u00e9 de l'enregistrement, nous pouvons aller de l'avant.<\/li>\n<li>Nous pouvons maintenant inverser le mode dry. Nous allons \u00e9crire et lire depuis le cluster, tout en dupliquant dans la version s\u00e9par\u00e9e. Pourquoi ? Au cours de la prochaine semaine, nous souhaitons observer le fonctionnement du cluster. Si jamais on constate qu'il y a des probl\u00e8mes en p\u00e9riode de charge, ou si nous avons omis quelque chose, nous avons toujours la possibilit\u00e9 de revenir \u00e0 l'ancien code et aux donn\u00e9es actuelles gr\u00e2ce au mode dry.<\/li>\n<li>Il ne reste plus qu'\u00e0 d\u00e9sactiver le mode dry et \u00e0 d\u00e9monter la version s\u00e9par\u00e9e. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"ekspertiza\">Expertise<\/h1>\n<p><\/p>\n<p>Commen\u00e7ons par un aper\u00e7u du fonctionnement du cluster.<\/p>\n<p><\/p>\n<p>Tout d'abord, Redis est un magasin de donn\u00e9es cl\u00e9-valeur. Les cl\u00e9s sont des cha\u00eenes de caract\u00e8res arbitraires. Les valeurs peuvent \u00eatre des nombres, des cha\u00eenes de caract\u00e8res, et des structures enti\u00e8res. Il existe une multitude de ces derni\u00e8res, mais pour comprendre le fonctionnement g\u00e9n\u00e9ral, cela n'est pas essentiel.<br \/>\nLe niveau d'abstraction suivant apr\u00e8s les cl\u00e9s est celui des slots (SLOTS). Chaque cl\u00e9 appartient \u00e0 l'un des 16 383 slots. \u00c0 l'int\u00e9rieur de chaque slot, il peut y avoir autant de cl\u00e9s que n\u00e9cessaire. Ainsi, toutes les cl\u00e9s se d\u00e9composent en 16 383 ensembles non chevauchants.<br \/>\n<img decoding=\"async\" alt=\"Migration de Redis vers Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/a5e4be23381b42287f693e01d5d59a99.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De plus, il doit y avoir N n\u0153uds ma\u00eetres dans le cluster. Chaque n\u0153ud peut \u00eatre repr\u00e9sent\u00e9 comme une instance Redis distincte, qui conna\u00eet tout sur les autres n\u0153uds \u00e0 l'int\u00e9rieur du cluster. Chaque n\u0153ud ma\u00eetre contient un certain nombre de slots. Chaque slot appartient uniquement \u00e0 un n\u0153ud ma\u00eetre. Tous les slots doivent \u00eatre r\u00e9partis entre les n\u0153uds. Si certains slots ne sont pas r\u00e9partis, les cl\u00e9s qui y sont stock\u00e9es ne seront pas accessibles. Chaque n\u0153ud ma\u00eetre a int\u00e9r\u00eat \u00e0 \u00eatre ex\u00e9cut\u00e9 sur une machine logique ou physique distincte. Il convient \u00e9galement de noter que chaque n\u0153ud fonctionne uniquement sur un c\u0153ur, et si vous souhaitez faire fonctionner plusieurs instances Redis sur une m\u00eame machine logique, assurez-vous qu'elles fonctionneront sur des c\u0153urs diff\u00e9rents (nous n'avons pas essay\u00e9 cela, mais th\u00e9oriquement, tout devrait fonctionner). En essence, les n\u0153uds ma\u00eetres assurent un sharding classique, et un plus grand nombre de n\u0153uds ma\u00eetres permet de mettre \u00e0 l'\u00e9chelle les requ\u00eates de lecture et d'\u00e9criture.<\/p>\n<p><\/p>\n<p>Apr\u00e8s avoir distribu\u00e9 toutes les cl\u00e9s sur les slots et que les slots sont r\u00e9partis entre les n\u0153uds ma\u00eetres, vous pouvez ajouter un nombre arbitraire de n\u0153uds esclaves \u00e0 chaque n\u0153ud ma\u00eetre. \u00c0 l'int\u00e9rieur de chaque paire \u00ab ma\u00eetre-esclave \u00bb, une r\u00e9plication normale sera mise en \u0153uvre. Les esclaves sont n\u00e9cessaires pour mettre \u00e0 l'\u00e9chelle les requ\u00eates de lecture et pour la commutation de secours en cas de d\u00e9faillance du ma\u00eetre.<br \/>\n<img decoding=\"async\" alt=\"Migration de Redis vers Redis-cluster\" src=\"\/wp-content\/uploads\/2020\/08\/90feb7ef9dacb858d5f21edc214df14d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Maintenant, parlons des op\u00e9rations que nous devrions \u00eatre capables d'effectuer.<\/p>\n<p><\/p>\n<p>Nous allons interagir avec le syst\u00e8me via Redis-CLI. \u00c9tant donn\u00e9 qu'il n'y a pas de point d'entr\u00e9e unique dans Redis, les op\u00e9rations suivantes peuvent \u00eatre ex\u00e9cut\u00e9es sur n'importe quel n\u0153ud. Je souligne s\u00e9par\u00e9ment dans chaque point la possibilit\u00e9 d'ex\u00e9cuter l'op\u00e9ration sous charge.<\/p>\n<p><\/p>\n<ul>\n<li>La premi\u00e8re et la plus importante chose dont nous aurons besoin : l'op\u00e9ration cluster nodes. Elle retourne l'\u00e9tat du cluster, montre la liste des n\u0153uds, leurs r\u00f4les, la r\u00e9partition des slots, etc. Des informations suppl\u00e9mentaires peuvent \u00eatre obtenues avec cluster info et cluster slots.<\/li>\n<li>Il serait bon de pouvoir ajouter et supprimer des n\u0153uds. Pour cela, il existe les op\u00e9rations cluster meet et cluster forget. Notez que cluster forget doit \u00eatre appliqu\u00e9 \u00e0 CHAQUE n\u0153ud, tant pour les ma\u00eetres que pour les r\u00e9plicas. En revanche, cluster meet doit simplement \u00eatre appel\u00e9 sur un seul n\u0153ud. Cette diff\u00e9rence peut \u00eatre d\u00e9concertante, donc il vaut mieux en \u00eatre conscient avant de mettre le cluster en production. L'ajout d'un n\u0153ud peut \u00eatre r\u00e9alis\u00e9 en toute s\u00e9curit\u00e9 en cours d'ex\u00e9cution et n'affecte en rien le fonctionnement du cluster (ce qui est logique). En revanche, si vous pr\u00e9voyez de supprimer un n\u0153ud du cluster, assurez-vous qu'il ne reste plus de slots dessus, sinon vous risquez de perdre l'acc\u00e8s \u00e0 toutes les cl\u00e9s sur ce n\u0153ud. Ne supprimez pas un ma\u00eetre qui a des esclaves, sinon un vote inutile pour un nouveau ma\u00eetre sera effectu\u00e9. S'il n'y a d\u00e9j\u00e0 plus de slots sur les n\u0153uds, ce n'est pas un gros probl\u00e8me, mais pourquoi ajouter une complexit\u00e9 suppl\u00e9mentaire si l'on peut d'abord supprimer les esclaves.<\/li>\n<li>Si vous devez forcer l'\u00e9change de ma\u00eetre et d'esclave, la commande cluster failover convient. Lorsque vous l'appelez en cours d'ex\u00e9cution, il faut comprendre qu'au cours de l'op\u00e9ration, le ma\u00eetre sera inaccessible. En g\u00e9n\u00e9ral, le basculement se produit en moins d'une seconde, mais ce n'est pas atomique. Attendez-vous \u00e0 ce qu'une partie des requ\u00eates au ma\u00eetre \u00e9choue pendant ce temps.<\/li>\n<li>Avant de supprimer un n\u0153ud du cluster, il ne doit rester aucun slot. Il est pr\u00e9f\u00e9rable de les redistribuer \u00e0 l'aide de la commande cluster reshard. Les slots seront transf\u00e9r\u00e9s d'un ma\u00eetre \u00e0 un autre. Toute l'op\u00e9ration peut prendre plusieurs minutes, cela d\u00e9pend du volume des donn\u00e9es transf\u00e9r\u00e9es, mais le processus de transfert est s\u00e9curis\u00e9 et n'affecte pas le fonctionnement du cluster. Ainsi, toutes les donn\u00e9es peuvent \u00eatre transf\u00e9r\u00e9es d'un n\u0153ud \u00e0 un autre sous charge, sans se soucier de leur disponibilit\u00e9. Cependant, il y a des subtilit\u00e9s. Premi\u00e8rement, le transfert de donn\u00e9es entra\u00eene une certaine charge sur le n\u0153ud r\u00e9cepteur et l'exp\u00e9diteur. Si le n\u0153ud r\u00e9cepteur est d\u00e9j\u00e0 fortement charg\u00e9 en CPU, il ne faut pas le surcharger en acceptant de nouvelles donn\u00e9es. Deuxi\u00e8mement, d\u00e8s qu'il ne reste plus aucun slot sur le ma\u00eetre exp\u00e9diteur, tous ses esclaves iront imm\u00e9diatement vers le ma\u00eetre vers lequel ces slots ont \u00e9t\u00e9 transf\u00e9r\u00e9s. Et le probl\u00e8me, c'est que tous ces esclaves souhaiteront se synchroniser en m\u00eame temps. Et vous aurez de la chance si c'est une synchronisation partielle et non compl\u00e8te. Prenez cela en compte, et combinez les op\u00e9rations de transfert de slots et de d\u00e9connexion\/transfert des esclaves. Ou esp\u00e9rez simplement que vous disposez d'une r\u00e9serve de r\u00e9sistance suffisante.<\/li>\n<li>Que faire si lors du transfert, vous constatez que vous avez perdu des slots quelque part ? J'esp\u00e8re que vous ne rencontrerez pas ce probl\u00e8me, mais si c'est le cas, il existe l'op\u00e9ration cluster fix. Elle r\u00e9partira tant bien que mal les slots entre les n\u0153uds de mani\u00e8re al\u00e9atoire. Je recommande de v\u00e9rifier son fonctionnement apr\u00e8s avoir retir\u00e9 du cluster un n\u0153ud avec des slots r\u00e9partis. Puisque les donn\u00e9es dans les slots non r\u00e9partis ne sont de toute fa\u00e7on pas accessibles, il est trop tard pour s'inqui\u00e9ter des probl\u00e8mes de disponibilit\u00e9 de ces slots. En revanche, l'op\u00e9ration n'affectera pas les slots r\u00e9partis.<\/li>\n<li>Une autre op\u00e9ration utile est monitor. Elle permet de voir en temps r\u00e9el toute la liste des requ\u00eates envoy\u00e9es au n\u0153ud. De plus, vous pouvez effectuer un grep sur cette liste pour savoir s'il y a du trafic pertinent.<\/li>\n<\/ul>\n<p><\/p>\n<p>Il convient \u00e9galement de mentionner la proc\u00e9dure de basculement d'un ma\u00eetre. Pour faire court, elle existe et, de mon point de vue, fonctionne tr\u00e8s bien. Cependant, ne pensez pas que d\u00e9brancher la machine sur le n\u0153ud ma\u00eetre entra\u00eenera imm\u00e9diatement un basculement de Redis sans que les clients ne remarquent de perte. D'apr\u00e8s mon exp\u00e9rience, le basculement prend plusieurs secondes. Pendant ce temps, certaines donn\u00e9es seront inaccessibles : l'indisponibilit\u00e9 du ma\u00eetre est d\u00e9tect\u00e9e, les n\u0153uds votent pour un nouveau, les esclaves se basculent, et les donn\u00e9es se synchronisent. Le meilleur moyen de vous assurer que le sch\u00e9ma fonctionne est de mener des exercices locaux. Configurez un cluster sur votre ordinateur portable, appliquez une charge minimale, simulez une d\u00e9faillance (par exemple, en bloquant les ports), et \u00e9valuez la vitesse de basculement. \u00c0 mon avis, seuls quelques jours d'exp\u00e9rimentation de cette mani\u00e8re peuvent garantir que la technologie fonctionne. Ou, esp\u00e9rons simplement que le logiciel utilis\u00e9 par la moiti\u00e9 d'Internet fonctionne certainement.<\/p>\n<p><\/p>\n<h1 id=\"konfiguraciya\">Configuration<\/h1>\n<p><\/p>\n<p>Souvent, la configuration est la premi\u00e8re chose n\u00e9cessaire pour commencer \u00e0 travailler avec l'outil. Et une fois que tout est en marche, on n'a pas envie de toucher \u00e0 la configuration. Il faut des efforts pour se forcer \u00e0 revenir aux param\u00e8tres et les examiner soigneusement. D'apr\u00e8s mes souvenirs, nous avons eu au moins deux \u00e9checs s\u00e9rieux \u00e0 cause d'un manque d'attention \u00e0 la configuration. Portez une attention particuli\u00e8re aux points suivants :<\/p>\n<p><\/p>\n<ul>\n<li>timeout 0<br \/>\n<em>Le temps apr\u00e8s lequel les connexions inactives sont ferm\u00e9es (en secondes). 0 \u2014 ne sont pas ferm\u00e9es<\/em><br \/>\nPas toutes nos biblioth\u00e8ques savaient fermer correctement les connexions. En d\u00e9sactivant ce param\u00e8tre, nous risquons d'atteindre la limite du nombre de clients. D'autre part, si ce probl\u00e8me existe, la coupure automatique des connexions perdues va le masquer et nous pourrions ne pas le remarquer. De plus, il ne faut pas activer ce param\u00e8tre lors de l'utilisation de connexions persistantes.<\/li>\n<li>Save x y &amp; appendonly yes<br \/>\n<em>Sauvegarde d'un instantan\u00e9 RDB.<\/em><br \/>\nNous discuterons des probl\u00e8mes RDB\/AOF en d\u00e9tail ci-dessous.<\/li>\n<li>stop-writes-on-bgsave-error no &amp; slave-serve-stale-data yes<br \/>\n<em>Si activ\u00e9, en cas de d\u00e9faillance de l'instantan\u00e9 RDB, le ma\u00eetre cessera d'accepter les requ\u00eates de modification. Si la connexion avec le ma\u00eetre est perdue, l'esclave peut continuer \u00e0 r\u00e9pondre aux requ\u00eates (oui). Ou arr\u00eater de r\u00e9pondre (non).<\/em><br \/>\nNous ne voulons pas que Redis se transforme en citrouille.<\/li>\n<li>repl-ping-slave-period 5<br \/>\n<em>Apr\u00e8s cette p\u00e9riode, nous commencerons \u00e0 nous inqui\u00e9ter du fait que le ma\u00eetre est en panne et qu'il est temps d'effectuer la proc\u00e9dure de basculement.<\/em><br \/>\nIl faudra trouver manuellement un \u00e9quilibre entre les fausses alertes et le d\u00e9clenchement du basculement. Dans notre exp\u00e9rience, cela prend 5 secondes.<\/li>\n<li>repl-backlog-size 1024mb &amp; epl-backlog-ttl 0<br \/>\n<em>C'est la quantit\u00e9 de donn\u00e9es que nous pouvons stocker dans le tampon pour une r\u00e9plique qui a \u00e9chou\u00e9. Si le tampon est \u00e9puis\u00e9, il faudra se synchroniser compl\u00e8tement.<\/em><br \/>\nL'exp\u00e9rience montre qu'il vaut mieux mettre une valeur plus \u00e9lev\u00e9e. Les raisons pour lesquelles une r\u00e9plique peut commencer \u00e0 avoir du retard sont nombreuses. Si elle a du retard, c'est probablement que votre ma\u00eetre a d\u00e9j\u00e0 du mal \u00e0 suivre, et la synchronisation compl\u00e8te sera la goutte d'eau.<\/li>\n<li>maxclients 10000<br \/>\n<em>Le nombre maximum de clients simultan\u00e9s.<\/em><br \/>\nD'apr\u00e8s notre exp\u00e9rience, il est pr\u00e9f\u00e9rable de mettre une valeur plus \u00e9lev\u00e9e. Redis g\u00e8re tr\u00e8s bien 10 000 connexions. Assurez-vous juste qu'il y a suffisamment de sockets dans le syst\u00e8me. <\/li>\n<li>maxmemory-policy volatile-ttl<br \/>\n<em>La r\u00e8gle selon laquelle les cl\u00e9s sont supprim\u00e9es lorsqu'une limite de m\u00e9moire disponible est atteinte.<\/em><br \/>\nIci, il est important non pas la r\u00e8gle elle-m\u00eame, mais la compr\u00e9hension de la mani\u00e8re dont cela se d\u00e9roulera. Redis m\u00e9rite des \u00e9loges pour sa capacit\u00e9 \u00e0 fonctionner normalement lorsqu'il atteint la limite de m\u00e9moire. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"problemy-rdb-i-aof\">Probl\u00e8mes RDB et AOF<\/h1>\n<p><\/p>\n<p>Bien que Redis conserve toutes les informations en m\u00e9moire vive, il existe aussi un m\u00e9canisme de sauvegarde des donn\u00e9es sur disque. Plus pr\u00e9cis\u00e9ment, trois m\u00e9canismes :<\/p>\n<p><\/p>\n<ul>\n<li>RDB-snapshot \u2014 un instantan\u00e9 complet de toutes les donn\u00e9es. Se configure avec l'instruction SAVE X Y et se lit comme \u00ab Sauvegarder un instantan\u00e9 complet de toutes les donn\u00e9es toutes les X secondes, si au moins Y cl\u00e9s ont \u00e9t\u00e9 modifi\u00e9es \u00bb.<\/li>\n<li>Fichier append-only \u2014 liste des op\u00e9rations dans l'ordre de leur ex\u00e9cution. Ajoute les nouvelles op\u00e9rations dans le fichier toutes les X secondes ou toutes les Y op\u00e9rations.<\/li>\n<li>RDB et AOF \u2014 combinaison des deux pr\u00e9c\u00e9dents.<\/li>\n<\/ul>\n<p><\/p>\n<p>Chaque m\u00e9thode a ses avantages et ses inconv\u00e9nients. Je ne vais pas tous les \u00e9num\u00e9rer, mais je voudrais souligner certains points qui ne sont pas \u00e9vidents, \u00e0 mon avis.<\/p>\n<p><\/p>\n<p>Tout d'abord, pour enregistrer un instantan\u00e9 RDB, il est n\u00e9cessaire d'appeler FORK. Si les donn\u00e9es sont nombreuses, cela peut suspendre tout Redis pendant une p\u00e9riode allant de quelques millisecondes \u00e0 une seconde. De plus, le syst\u00e8me a besoin de m\u00e9moire pour cet instantan\u00e9, ce qui signifie qu'il faut maintenir sur la machine logique un double apport de m\u00e9moire vive : si 8 Go sont allou\u00e9s \u00e0 Redis, il doit y avoir 16 Go disponibles sur la machine virtuelle.<\/p>\n<p><\/p>\n<p>Deuxi\u00e8mement, il y a des probl\u00e8mes de synchronisation partielle. En mode AOF, lors de la reconnexion d'un esclave, une synchronisation compl\u00e8te peut se produire au lieu d'une synchronisation partielle. Je n'ai pas r\u00e9ussi \u00e0 comprendre pourquoi cela se produit. Mais il est important de s'en souvenir.<\/p>\n<p><\/p>\n<p>Ces deux points am\u00e8nent d\u00e9j\u00e0 \u00e0 r\u00e9fl\u00e9chir \u00e0 la n\u00e9cessit\u00e9 de conserver ces donn\u00e9es sur disque, si tout est d\u00e9j\u00e0 dupliqu\u00e9 par les esclaves. La perte de donn\u00e9es ne peut survenir qu'en cas de d\u00e9faillance de tous les esclaves, et c'est un probl\u00e8me de niveau \u00ab incendie dans le centre de donn\u00e9es \u00bb. Comme compromis, on peut envisager de conserver les donn\u00e9es uniquement sur les esclaves, mais dans ce cas, il faut s'assurer que ces esclaves ne deviennent jamais ma\u00eetres lors d'une r\u00e9cup\u00e9ration d'urgence (il existe un param\u00e8tre de priorit\u00e9 des esclaves dans leur configuration). Pour nous, dans chaque cas particulier, nous r\u00e9fl\u00e9chissons \u00e0 la n\u00e9cessit\u00e9 de conserver les donn\u00e9es sur disque, et la plupart du temps, nous r\u00e9pondons \u00ab non \u00bb.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Conclusion<\/h1>\n<p><\/p>\n<p>En conclusion, j'esp\u00e8re avoir pu donner une vue d'ensemble du fonctionnement de redis-cluster \u00e0 ceux qui n'en ont jamais entendu parler, et \u00e9galement attirer l'attention sur certains points peu \u00e9vidents pour ceux qui l'utilisent depuis longtemps.<br \/>\nMerci pour votre temps, et comme d'habitude, les commentaires sur le sujet sont les bienvenus.<\/p>\n<p>Source : <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 - 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\/fr\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Sur la migration de Redis \u00e0 Redis-cluster | ProHoster","description":"En entrant dans un produit qui \u00e9volue davantage.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/91846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=91846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/91846\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/91847"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=91846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=91846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=91846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}