KeyDB comme remplacement [potentiel] de Redis

Il n'y a eu aucun avis sur une "alternative plus rapide à Redis" sur Habré - Base de données de clés. Ayant acquis une expérience assez récente dans son utilisation, je souhaite combler cette lacune.

KeyDB comme remplacement [potentiel] de Redis

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 transfĂ©rĂ© 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

New Relic a clairement identifiĂ© le problĂšme :

KeyDB comme remplacement [potentiel] de Redis

Voici les statistiques de l'opĂ©ration : get dans Redis :

KeyDB comme remplacement [potentiel] de Redis

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 application appelée KeyDB. Il s'agit d'un fork Redis développé par entreprise canadienne 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 article d'introduction sur Medium, 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 Mise Ă  jour continue 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 phpredis, 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 : le plus courant d'entre eux 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

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

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

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

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

Achetez un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Achetez un hĂ©bergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster