Il n'y a eu aucun avis sur une "alternative plus rapide à Redis" sur Habré - . Ayant acquis une expérience assez récente dans son utilisation, je souhaite combler cette lacune.
![KeyDB comme remplacement [potentiel] de Redis](/wp-content/uploads/2020/02/9642ef3dc712ad2e6304104facb464b7.jpeg)
Le contexte est assez banal : un jour, avec un afflux important de trafic, une dĂ©gradation importante des performances des applications (Ă savoir le temps de rĂ©ponse) a Ă©tĂ© enregistrĂ©e. Malheureusement, Ă cette Ă©poque, il n'Ă©tait pas possible d'effectuer un diagnostic normal de ce qui se passait, c'est pourquoi une sĂ©rie de tests de charge a ensuite Ă©tĂ© planifiĂ©e. AprĂšs les avoir rĂ©alisĂ©s, nous avons pu dĂ©couvrir un goulot d'Ă©tranglement, Ă savoir le cache de la base de donnĂ©es dans Redis. Comme cela arrive souvent, le problĂšme n'a pas pu ĂȘtre rĂ©solu immĂ©diatement et de la bonne maniĂšre - par les dĂ©veloppeurs (en changeant la logique de travail). Par consĂ©quent, la curiositĂ© et le dĂ©sir de surmonter la situation de maniĂšre dĂ©tournĂ©e se sont rĂ©veillĂ©s. Câest ainsi quâest apparu cet article.
ProblĂšmes
à propos de Redis en général
Comme beaucoup de gens le savent, Redis est une base de donnĂ©es monothread. Pour ĂȘtre plus prĂ©cis, c'est le cas dans le contexte du travail avec les donnĂ©es utilisateur. AprĂšs tout, depuis la quatriĂšme version, service, opĂ©rations internes de Redis pour une exĂ©cution parallĂšle. Cependant, ce changement nâa affectĂ© quâune petite partie de la charge de travail, puisque lâessentiel du travail est effectuĂ© sur les donnĂ©es des utilisateurs.
D'innombrables copies ont Ă©tĂ© brisĂ©es sur ce sujet, mais les dĂ©veloppeurs Redis refusent obstinĂ©ment d'implĂ©menter un parallĂ©lisme complet, mentionnant Ă quel point cela compliquerait l'application et augmenterait les frais gĂ©nĂ©raux, ainsi qu'ajouterait davantage de bogues. Leur position est la suivante : si vous ĂȘtes confrontĂ© Ă un problĂšme monocĆur, vous avez des problĂšmes avec l'architecture de l'application et quelque chose doit y ĂȘtre modifiĂ©. Parmi les utilisateurs, cependant, il existe Ă©galement « un autre camp » : ceux qui sont coincĂ©s sur un seul noyau et prĂ©tendent que Redis se crĂ©e un goulot d'Ă©tranglement. Dans le cas de charges trĂšs importantes - tĂŽt ou tard - il est inĂ©vitable de rencontrer ce problĂšme, qui impose des restrictions importantes sur l'architecture et/ou des complications forcĂ©es.
Je n'évaluerai pas telle ou telle opinion. Au lieu de cela, je partagerai notre cas spécifique et comment nous l'avons résolu.
Notre cas
Dans l'un des projets, nous avons constatĂ© que l'Ă©quipe de dĂ©veloppement avait configurĂ© une mise en cache extrĂȘmement agressive des donnĂ©es de la base de donnĂ©es (PostgreSQL) via Redis. C'Ă©tait le seul moyen qui, lors d'afflux soudains de trafic, sauvait PostgreSQL lui-mĂȘme et, par consĂ©quent, l'application de la mort.
AprĂšs une sĂ©rie de tests de charge, nous avons analysĂ© la situation et constatĂ© que Redis Ă©tait limitĂ© Ă un seul cĆur (ce qu'on appelle une « Ă©tagĂšre »), suivi d'une dĂ©gradation assez rapide de l'application. Lâ« Ă©touffement » a Ă©tĂ© exponentiel : dĂšs que la limite de performances de Redis Ă©tait atteinte, tout cessait de fonctionner.
Cela ressemblait Ă quelque chose comme ceci:
![KeyDB comme remplacement [potentiel] de Redis](/wp-content/uploads/2020/02/c0f55ca1d9f28f8c305bb74cdc77a84a.jpeg)
New Relic a clairement identifié le problÚme :
![KeyDB comme remplacement [potentiel] de Redis](/wp-content/uploads/2020/02/ce72e290f84560d143f2d6c128358477.jpeg)
Voici les statistiques de l'opération : get dans Redis :
![KeyDB comme remplacement [potentiel] de Redis](/wp-content/uploads/2020/02/31d98a6bb2985cfbe391976e24b8a8a6.jpeg)
AprĂšs que le problĂšme ait Ă©tĂ© signalĂ© en dĂ©tail Ă lâĂ©quipe de dĂ©veloppement, il sâest avĂ©rĂ© que « le problĂšme ne peut pas ĂȘtre rĂ©solu pour le moment ». C'est ainsi qu'a commencĂ© la recherche d'une solution du cĂŽtĂ© des opĂ©rations, et la KeyDB dĂ©jĂ mentionnĂ©e Ă©tait la rĂ©ponse.
Cependant, avant de commencer notre examen, il convient de mentionner que le projet utilise Redis autonome, car la solution de cluster basĂ©e sur Sentinel est bien infĂ©rieure en termes de latence. Une solution Ă©vidente Ă©tait de crĂ©er plusieurs rĂ©pliques du cache : et de laisser l'application aller partout avec Ă©quilibrage ! Cependant, aprĂšs avoir consultĂ© les dĂ©veloppeurs, nous avons Ă©tĂ© contraints d'abandonner cette option en raison du mĂ©canisme d'invalidation du cache actif et complexe de l'application. Le mĂȘme problĂšme sâest Ă©tendu au partage du cache.
Un aperçu rapide de KeyDB
En cherchant une solution possible au problÚme, nous avons découvert . Il s'agit d'un fork Redis développé par et distribué sous la licence gratuite BSD. Le projet est trÚs jeune : il existe depuis début 2019. Son histoire est que les auteurs ont également rencontré les limites de Redis... et ont décidé de créer leur propre fork. De plus, il a non seulement résolu des problÚmes connus, mais a également reçu des fonctionnalités supplémentaires qui ne sont disponibles que dans la version entreprise de Redis.
Pour ceux qui souhaitent se familiariser plus en détail avec KeyDB, il existe un bon , qui présente le SGBD et de brefs benchmarks le comparant à son « parent » - Redis.
Tout d'abord, nous avons Ă©tĂ© attirĂ©s par KeyDB par la solution potentielle Ă nos problĂšmes, et en mĂȘme temps nous Ă©tions intĂ©ressĂ©s par quelques fonctionnalitĂ©s supplĂ©mentaires. L'utilisation de KeyDB promettait les avantages suivants :
- obtenir un multithreading complet ;
- compatibilité totale et absolue avec Redis (c'était particuliÚrement important pour nous, car il n'était pas possible d'apporter de modifications cÎté application), ce qui promettait également une migration sans problÚme ;
- mécanisme de sauvegarde intégré dans le stockage S3 ;
- rĂ©plication active facile Ă mettre en Ćuvre ;
- clustering et partitionnement simples sans Sentinel et autres logiciels de support.
Plus de 3 XNUMX étoiles et de nombreux contributeurs sur GitHub semblaient également encourageants. L'application est développée et prise en charge de maniÚre assez active, ce qui est clairement visible dans les commits, la communication dans les problÚmes, ainsi que dans les PR fermés (acceptés). La réponse du responsable principal sur tous les fronts est toujours amicale et rapide. En général, les arguments étaient nombreux.
Migration et résultats
MĂȘme si le projet de migration Ă©tait un peu un pari (en raison de la nouveautĂ© de KeyDB), il n'y avait pas grand chose Ă perdre. AprĂšs tout, annuler les modifications est assez rapide et simple - heureusement, toute l'infrastructure est dĂ©ployĂ©e dans Kubernetes et les mĂ©canismes intĂ©grĂ©s Ils rĂ©solvent trĂšs bien ces problĂšmes.
En général, nous avons préparé des modÚles Helm, basculé l'application dans l'environnement de test vers une nouvelle base de données et tout déployé, en le confiant au service d'assurance qualité du client.
Les tests ont commencĂ©, qui ont durĂ© environ une semaine et dont nous n'avons pas approfondi les dĂ©tails. Nous savons seulement que le client a testĂ© les fonctions standards de travail avec Redis Ă l'aide d'un pilote PHP , et a Ă©galement effectuĂ© des tests d'assurance qualitĂ© de l'interface utilisateur. AprĂšs cela, nous avons reçu le feu vert : aucun effet secondaire nâa Ă©tĂ© constatĂ© lors de lâutilisation du nouveau logiciel. C'est Du point de vue applicatif, rien n'a changĂ© du tout.
A noter que nous n'avons rien changĂ© dans la config : littĂ©ralement, nous avons simplement remplacĂ© l'image utilisĂ©e. Il en va de mĂȘme pour la surveillance et lâexportation des mĂ©triques vers Prometheus : fonctionne parfaitement avec KeyDB et sans aucune modification. Ainsi, nous pouvons affirmer avec certitude que dâun point de vue opĂ©rationnel, il sâagit tout simplement dâune dĂ©cision idĂ©ale.
GrĂące Ă tout cela, aprĂšs avoir basculĂ© l'application vers un nouveau SGBD, vous ne pouvez rien changer, mais comme « mesure de stabilisation », vous pouvez la laisser sous cette forme pour travailler au combat pendant un certain temps. Cependant, si vous souhaitez voir une augmentation des performances (ou un quelconque changement), vous ne devez pas oublier que par dĂ©faut ParamĂštre KeyDB responsable du multithreading (server-threads), est Ă©gal Ă un, c'est-Ă -dire Le SGBD fonctionne exactement de la mĂȘme maniĂšre que Redis.
AprĂšs le basculement, les tests et un certain temps de vie sur la nouvelle application (avec KeyDB), nous avons dĂ©cidĂ© de rĂ©pĂ©ter les tests de charge avec les mĂȘmes paramĂštres que ceux utilisĂ©s pour Redis. Quels ont Ă©tĂ© ses rĂ©sultats ?..
Selon le graphique de consommation du processeur, l'Ă©limination des problĂšmes de « plafond » d'un cĆur est immĂ©diatement devenue perceptible : le processus a commencĂ© Ă utiliser les ressources disponibles :
![KeyDB comme remplacement [potentiel] de Redis](/wp-content/uploads/2020/02/8a3a168507ef75a8e1cdf69e1d30d996.jpeg)
Et plus tard, j'ai essayĂ© de « torturer » l'application assez fortement et j'ai constatĂ© une consommation allant jusqu'Ă trois cĆurs...
Selon New Relic, l'application Web dans son ensemble, ayant la mĂȘme charge, a commencĂ© Ă se comporter de maniĂšre nettement plus adĂ©quate. Une certaine dĂ©gradation des performances a encore Ă©tĂ© observĂ©e, cependant, par rapport au graphique similaire ci-dessus, vous pouvez Ă©valuer par vous-mĂȘme les progrĂšs significatifs :
![KeyDB comme remplacement [potentiel] de Redis](/wp-content/uploads/2020/02/f46bf41bd6b8d190f5117d049ed2dce5.jpeg)
La latence de la nouvelle base de données (KeyDB) s'est également aggravée, mais est restée dans des valeurs acceptables :
![KeyDB comme remplacement [potentiel] de Redis](/wp-content/uploads/2020/02/b9e0a3103a51707628a9f500dfdd53ad.jpeg)
Le graphique suivant montre clairement que le nombre de requĂȘtes adressĂ©es Ă KeyDB lui-mĂȘme est similaire :
![KeyDB comme remplacement [potentiel] de Redis](/wp-content/uploads/2020/02/0a067239194adb39eb3c3738fa73860e.jpeg)
Pour rĂ©sumer ces tests synthĂ©tiques, nous pouvons dire que Redis et KeyDB montrent tous deux une dĂ©gradation significative des performances en termes de latence (40 ms+) avec une augmentation significative du nombre de connexions parallĂšles (1000+). Dans notre cas, l'application Web a pu « gaspiller » la latence de Redis mĂȘme avec un nombre de connexions infĂ©rieur (400+), bien que pour KeyDB, une telle charge reste acceptable.
résultats
Cet exemple montre bien la force de la communautĂ© Open Source dans le dĂ©veloppement des projets qui l'intĂ©ressent. Je suis tombĂ© sur une excellente dĂ©claration sur Internet, dont le sens gĂ©nĂ©ral se rĂ©sumait Ă ceci : « Une grande entreprise crĂ©e un produit intĂ©ressant, rend certaines de ses fonctions ouvertes, mais laisse la partie la plus importante payĂ©e. La communautĂ© lâutilise et lâutilise, puis quelquâun abandonne et crĂ©e un fork, y implĂ©mentant les mĂȘmes fonctionnalitĂ©s payantes et les ouvrant Ă tout le monde. Ici, KeyDB est le mĂȘme cas.
Parlant de la migration elle-mĂȘme, qui Ă©tait Ă©tonnamment simple, nous n'avons pas reçu si une augmentation significative des performances, Ă laquelle on peut s'attendre en regardant les graphiques des auteurs de KeyDB... Cependant, ce n'est que notre cas particulier, dans lequel il peut y avoir de nombreux Ă©carts, y compris l'architecture notoire de l'application (par exemple , un grand nombre de commandes get dans Redis au lieu de l'option plus performante des requĂȘtes agrĂ©gĂ©es mget...). NĂ©anmoins, nous avons rĂ©ussi Ă obtenir des rĂ©sultats positifs et avec eux de nombreuses fonctions utiles que nous mettrons en Ćuvre dans un avenir proche.
En gĂ©nĂ©ral, KeyDB semble prometteur : au fur et Ă mesure que nous acquerrons une expĂ©rience pratique avec ce SGBD (et nous devons encore l'acquĂ©rir !) et dĂ©velopperons le projet lui-mĂȘme, nous envisagerons la possibilitĂ© de l'utiliser dans d'autres situations.
Cependant, cet article ne doit pas ĂȘtre considĂ©rĂ© comme un guide (et encore moins un appel) Ă lâaction pour lâabandon gĂ©nĂ©ralisĂ© de Redis au profit de KeyDB. MalgrĂ© notre expĂ©rience positive, il est clair que ce nâest pas une solution miracle. Le cas Ă©tait trĂšs concret : prĂ©cisĂ©ment pour rĂ©soudre un problĂšme momentanĂ© dans une situation oĂč il fallait le faire rapidement et Ă moindre coĂ»t, cette solution Ă©tait justifiĂ©e. KeyDB sera-t-il utile dans votre cas ? Au moins maintenant, vous savez que cette possibilitĂ© potentielle existe.
PS
A lire aussi sur notre blog :
- «";
- «";
- «";
- «».
Source: habr.com
