Il n'y a pas eu de critiques sur Habr concernant « une alternative plus rapide Ă Redis » â . Ayant acquis une expĂ©rience suffisamment rĂ©cente dans son utilisation, je souhaite combler cette lacune.
![KeyDB comme [potentielle] alternative Ă Redis](/wp-content/uploads/2020/02/9642ef3dc712ad2e6304104facb464b7.jpeg)
L'histoire est suffisamment banale : un jour, avec une grande afflux de trafic, une dĂ©gradation significative des performances de l'application (Ă savoir â le temps de rĂ©ponse) a Ă©tĂ© constatĂ©e. Ă ce moment-lĂ , malheureusement, il n'a pas Ă©tĂ© possible de mener un diagnostic normal de la situation, c'est pourquoi par la suite, une sĂ©rie de tests de charge a Ă©tĂ© planifiĂ©e. AprĂšs leur rĂ©alisation, il a Ă©tĂ© possible de dĂ©tecter le goulet d'Ă©tranglement, Ă savoir le cache de la base de donnĂ©es dans Redis. Comme câest souvent le cas, le problĂšme ne pouvait pas ĂȘtre rĂ©solu immĂ©diatement et de maniĂšre correcte â par les dĂ©veloppeurs (en changeant la logique de fonctionnement). Ainsi, la curiositĂ© et le dĂ©sir de rĂ©soudre la situation par un autre moyen se sont manifestĂ©s. Câest ainsi que cet article est nĂ©.
Problématique
Sur Redis en général
Comme beaucoup le savent, Redis est une base de donnĂ©es monoprocĂ©durale. Pour ĂȘtre plus prĂ©cis, c'est le cas dans le contexte du traitement des donnĂ©es utilisateur. En effet, Ă partir de la quatriĂšme version, les opĂ©rations internes et de service de Redis transfĂ©rĂ©es Ă une exĂ©cution parallĂšle. Cependant, ce changement nâa touchĂ© quâune petite partie de la charge, car la majeure partie du travail concerne les donnĂ©es utilisateur.
De ce sujet, d'innombrables dĂ©bats ont eu lieu, mais les dĂ©veloppeurs de Redis refusent obstinĂ©ment dâimplĂ©menter une vraie parallĂ©lisation, mentionnant combien cela compliquerait l'application et augmenterait les frais gĂ©nĂ©raux, tout en ajoutant des bogues. Leur position est la suivante : si vous ĂȘtes confrontĂ© au problĂšme de la monocore â vous avez des problĂšmes d'architecture d'application et il faut changer quelque chose Ă ce sujet. Cependant, il existe parmi les utilisateurs un « autre camp » â celui qui est bloquĂ© sur un seul cĆur et affirme que Redis crĂ©e eux-mĂȘmes un goulot d'Ă©tranglement. En cas de charges rĂ©ellement importantes â tĂŽt ou tard â on est inĂ©vitablement confrontĂ© Ă ce problĂšme, ce qui impose des restrictions significatives sur l'architecture et/ou des complications forcĂ©es au sein de celle-ci.
Je ne vais pas évaluer l'un ou l'autre avis. à la place, je vais partager notre cas spécifique et comment nous l'avons résolu.
Notre cas
Dans l'un de nos projets, nous avons rencontrĂ© un problĂšme oĂč l'Ă©quipe de dĂ©veloppement avait mis en place un cache des donnĂ©es de la base de donnĂ©es (PostgreSQL) via Redis de maniĂšre extrĂȘmement agressive. C'Ă©tait le seul moyen qui, lors des pics soudains de trafic, sauvait la PostgreSQL de la dĂ©faillance, et par consĂ©quent, l'application.
AprĂšs une sĂ©rie de tests de charge, nous avons analysĂ© la situation et dĂ©couvert que Redis Ă©tait limitĂ© Ă un seul cĆur (ce qu'on appelle « au point mort »), aprĂšs quoi il y avait une dĂ©gradation assez rapide de l'application. Le « ralentissement » avait une progression gĂ©omĂ©trique : dĂšs que la limite de performance Ă©tait atteinte pour Redis, tout cessait de fonctionner.
Cela ressemblait Ă peu prĂšs Ă ceci :
![KeyDB comme [potentielle] alternative Ă Redis](/wp-content/uploads/2020/02/c0f55ca1d9f28f8c305bb74cdc77a84a.jpeg)
Du cÎté de New Relic, le problÚme était clairement identifié :
![KeyDB comme [potentielle] alternative Ă Redis](/wp-content/uploads/2020/02/ce72e290f84560d143f2d6c128358477.jpeg)
Voici les statistiques de l'opération obtenir dans Redis :
![KeyDB comme [potentielle] alternative Ă Redis](/wp-content/uploads/2020/02/31d98a6bb2985cfbe391976e24b8a8a6.jpeg)
AprĂšs que le problĂšme ait Ă©tĂ© expliquĂ© en dĂ©tail Ă l'Ă©quipe de dĂ©veloppement, il s'est avĂ©rĂ© que « le problĂšme ne pouvait pas ĂȘtre rĂ©solu immĂ©diatement ». Ainsi commencĂšrent les recherches de solutions du cĂŽtĂ© des opĂ©rations, et la rĂ©ponse fut l'utilisation de KeyDB dĂ©jĂ mentionnĂ©e.
Cependant, avant de commencer son examen, il convient de mentionner que le projet utilise Redis en mode autonome, car la solution en cluster basĂ©e sur Sentinel est trĂšs infĂ©rieure en termes de latence. L'une des solutions Ă©videntes aurait Ă©tĂ© de crĂ©er plusieurs rĂ©pliques du cache : et faire en sorte que l'application s'y connecte avec un Ă©quilibrage de charge ! Cependant, aprĂšs discussion avec les dĂ©veloppeurs, nous avons Ă©tĂ© contraints d'Ă©carter cette option en raison du mĂ©canisme complexe et actif d'invalidation du cache de l'application. Le mĂȘme problĂšme s'appliquait Ă©galement au sharding du cache.
Aperçu rapide de KeyDB
En quĂȘte d'une solution possible au problĂšme, nous avons dĂ©couvert . C'est un fork de Redis, dĂ©veloppĂ© et diffusĂ© sous la licence libre BSD. Le projet est assez jeune : il existe depuis dĂ©but 2019. Son histoire est telle que ses auteurs ont Ă©galement Ă©tĂ© confrontĂ©s Ă des limitations de Redis un jour⊠et ont dĂ©cidĂ© de crĂ©er leur propre fork. De plus, il ne s'est pas seulement attaquĂ© aux problĂšmes connus, mais a Ă©galement ajoutĂ© des fonctionnalitĂ©s 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 des benchmarks comparant son « pĂšre » â Redis.
Tout d'abord, ce qui nous a attirés vers KeyDB était la solution potentielle à nos problÚmes, et certaines fonctionnalités supplémentaires étaient également intéressantes. L'utilisation de KeyDB promettait les avantages suivants :
- une véritable multi-threading ;
- une compatibilité complÚte et absolue avec Redis (ce qui était particuliÚrement important pour nous, car il n'était pas possible d'apporter des modifications au niveau de l'application), ce qui annonçait également une migration sans problÚme ;
- un mécanisme de sauvegarde intégré dans un stockage S3 ;
- une rĂ©plication active facile Ă mettre en Ćuvre ;
- une clustering et sharding simples sans Sentinel ni autres logiciels auxiliaires.
Plus de 3000 étoiles et de nombreux contributeurs sur GitHub semblaient également prometteurs. L'application est activement développée et maintenue, ce qui est bien visible dans les commits, les échanges dans les issues, ainsi que dans les PR fermées (acceptées). La réponse de l'un des principaux mainteneurs est toujours bienveillante et rapide. En somme, il y avait suffisamment d'arguments.
Migration et résultats
MĂȘme si le projet de migration Ă©tait une sorte d'aventure (en raison de la nouveautĂ© de KeyDB), nous n'avions pas grand-chose Ă perdre. En effet, il est assez rapide et facile de revenir en arriĂšre â d'autant plus que toute l'infrastructure est dĂ©ployĂ©e sur Kubernetes, et les mĂ©canismes intĂ©grĂ©s rĂ©solvent parfaitement ce genre de tĂąches.
En gros, nous avons préparé des modÚles Helm, avons basculé l'application dans l'environnement de test vers la nouvelle base de données et avons déployé le tout, le confiant au département QA du client.
Les tests ont commencé, et cela a duré environ une semaine, dont nous ne sommes pas allés dans les détails. Nous savons seulement que le client a vérifié les fonctions standards de travail avec Redis à l'aide du driver PHP , et a également réalisé des tests QA de l'interface utilisateur. AprÚs cela, nous avons obtenu le feu vert : aucun effet secondaire dans l'utilisation du nouveau logiciel n'a été détecté. Autrement dit, du point de vue de l'application, rien n'a vraiment changé..
Il convient de noter qu'il n'y a eu aucun changement dans la configuration non plus : littĂ©ralement â nous avons simplement remplacĂ© l'image utilisĂ©e. Il en va de mĂȘme pour le monitoring et l'exportation des mĂ©triques vers Prometheus : fonctionne parfaitement avec KeyDB et sans aucune modification. Ainsi, on peut dire sans hĂ©sitation que du point de vue de l'exploitation, c'est tout simplement un dĂ©mĂ©nagement idĂ©al.
GrĂące Ă tout cela, aprĂšs le passage de l'application Ă la nouvelle SGBD, il n'est pas nĂ©cessaire de changer quoi que ce soit, et en tant que « mesure de stabilisation », il peut rester dans cet Ă©tat et fonctionner en production pendant un certain temps. Cependant, si vous souhaitez voir un gain de performance (ou mĂȘme quelques modifications), n'oubliez pas que par dĂ©faut le paramĂštre KeyDB, responsable du multitĂąche (server-threads), est Ă©gal Ă un, c'est-Ă -dire que la SGBD fonctionne exactement comme Redis..
AprĂšs le passage, le test et un certain temps de fonctionnement avec la nouvelle application (avec KeyDB), nous avons dĂ©cidĂ© de rĂ©pĂ©ter le test de charge avec les mĂȘmes paramĂštres utilisĂ©s pour Redis. Quels en ont Ă©tĂ© les rĂ©sultats ?..
Sur le graphique de consommation CPU, il est immĂ©diatement apparu qu'il n'y avait plus de problĂšme de « plafond » sur un seul cĆur : le processus a commencĂ© Ă utiliser les ressources disponibles :
![KeyDB comme [potentielle] alternative Ă Redis](/wp-content/uploads/2020/02/8a3a168507ef75a8e1cdf69e1d30d996.jpeg)
Plus tard, j'ai essayĂ© de « stresser » considĂ©rablement l'application et j'ai observĂ© une consommation allant jusqu'Ă trois cĆursâŠ
D'aprĂšs New Relic, l'application web, ayant la mĂȘme charge, s'est comportĂ©e de maniĂšre sensiblement plus adĂ©quate. Une certaine dĂ©gradation des performances a toutefois Ă©tĂ© observĂ©e, mais en comparant avec le graphique similaire ci-dessus, vous pouvez Ă©valuer le progrĂšs significatif :
![KeyDB comme [potentielle] alternative Ă Redis](/wp-content/uploads/2020/02/f46bf41bd6b8d190f5117d049ed2dce5.jpeg)
Le temps de latence de la nouvelle base de données (KeyDB) a également empiré, mais est resté dans des limites acceptables :
![KeyDB comme [potentielle] alternative Ă Redis](/wp-content/uploads/2020/02/b9e0a3103a51707628a9f500dfdd53ad.jpeg)
Le graphique suivant montre clairement que le nombre de requĂȘtes Ă KeyDB est similaire :
![KeyDB comme [potentielle] alternative Ă Redis](/wp-content/uploads/2020/02/0a067239194adb39eb3c3738fa73860e.jpeg)
Pour conclure ces tests synthĂ©tiques, on peut dire que tant Redis que KeyDB montrent une dĂ©gradation significative des performances en latence (40 ms+) avec une augmentation substantielle du nombre de connexions simultanĂ©es (1000+). Dans notre cas, l'application web a rĂ©ussi à « faire chuter » la latence de Redis mĂȘme avec un nombre de connexions plus faible (400+), bien que pour KeyDB, cette charge restait acceptable.
Conclusions
Cet exemple illustre magnifiquement la puissance de la communautĂ© Open Source en matiĂšre de dĂ©veloppement de projets qui l'intĂ©ressent. Sur Internet, j'ai rencontrĂ© une excellente citation dont le sens gĂ©nĂ©ral peut se rĂ©sumer ainsi : « Une grande entreprise crĂ©e un produit intĂ©ressant, rend une partie de ses fonctionnalitĂ©s ouvertes, mais laisse la partie la plus importante payante. La communautĂ© en profite, puis quelqu'un finit par lever la main et faire un fork, intĂ©grant ces fonctionnalitĂ©s payantes et les rendant accessibles Ă tous ». Voici KeyDB â c'est ce cas particulier.
En parlant de la migration elle-mĂȘme, qui s'est Ă©tonnamment bien dĂ©roulĂ©e, nous n'avons pas reçu autant d'augmentation significative des performances que l'on pourrait attendre en regardant les graphiques des auteurs de KeyDB⊠Cependant, c'est juste notre cas particulier, qui peut prĂ©senter de nombreuses variations, notamment en ce qui concerne l'architecture de l'application (par exemple, un grand nombre de commandes obtenir dans Redis au lieu d'options plus performantes de requĂȘtes agrĂ©gĂ©es mgetâŠ). NĂ©anmoins, des rĂ©sultats positifs ont Ă©tĂ© obtenus, accompagnĂ©s de nombreuses fonctionnalitĂ©s utiles que nous allons encore implĂ©menter dans un avenir proche.
Dans l'ensemble, KeyDB semble prometteur : au fur et Ă mesure de l'expĂ©rience pratique avec cette SGBD (qui doit encore ĂȘtre acquise !) et du dĂ©veloppement du projet lui-mĂȘme, nous envisagerons son utilisation dans d'autres situations.
Cependant, il ne faut pas considĂ©rer cet article comme un guide (et encore moins comme un appel) Ă un abandon gĂ©nĂ©ralisĂ© de Redis au profit de KeyDB. MalgrĂ© notre expĂ©rience positive, il est Ă©vident que ce n'est pas une solution miracle. Le cas Ă©tait trĂšs spĂ©cifique : particuliĂšrement pour rĂ©soudre un problĂšme urgent dans une situation oĂč cela devait ĂȘtre fait rapidement et Ă moindre coĂ»t, cette solution s'est rĂ©vĂ©lĂ©e justifiĂ©e. KeyDB sera-t-il utile dans votre cas ? Au moins, vous savez maintenant qu'une telle possibilitĂ© existe.
P.S.
Lisez aussi dans notre blog :
- «»;
- «»;
- «»;
- «».
Source : habr.com
