Récemment, nous avons découvert un problème intéressant dans le cluster Redis. Après avoir passé beaucoup de temps au débogage et aux tests, nous avons pu réduire l'utilisation de la mémoire Redis de 25 % dans certains clusters en modifiant l'expiration des clés.
Twitter exécute plusieurs services de mise en cache en interne. L'un d'eux est implémenté par Redis. Notre cluster Redis stocke certaines données importantes sur les cas d'utilisation de Twitter, telles que les données d'impression et d'engagement, le nombre de dépenses publicitaires et les messages directs.
L'historique du problème (Apprentissage recommandé : Tutoriel vidéo Redis )
Dès 2016, l'équipe Cache de Twitter a réalisé le architecture du cluster Redis Beaucoup de mises à jour. Quelques modifications ont été apportées à Redis, notamment une mise à jour de Redis version 2.4 vers la version 3.2. Après cette mise à jour, plusieurs problèmes sont apparus, tels que le fait que les utilisateurs ont commencé à constater une utilisation de la mémoire incompatible avec ce qu'ils attendaient ou s'apprêtaient à utiliser, une latence accrue et des problèmes d'effacement des clés. L'autorisation de clé est un gros problème, qui peut entraîner la suppression des données qui doivent être conservées, ou la demande peut être envoyée au stockage d'origine des données.Enquête préliminaire
L'équipe concernée et l'équipe de la cache ont entamé une enquête préliminaire. Nous constatons une latence accrue liée à l'effacement des clés en cours. Lorsque Redis reçoit une demande d'écriture mais ne dispose pas de la mémoire nécessaire pour conserver l'écriture, il arrête ce qu'il fait, efface la clé puis enregistre la nouvelle clé. Cependant, nous devons encore découvrir la cause de ces augmentations de l'utilisation de la mémoire nouvellement effacée. Nous soupçonnons que la mémoire est pleine de clés expirées mais pas encore supprimées. Certaines personnes suggèrent d'utiliser la numérisation. La méthode de numérisation lira toutes les clés et supprimera les clés expirées.Dans Redis, les clés ont deux méthodes d'expiration, l'expiration active et l'expiration passive. L'analyse déclenchera l'expiration passive de la clé Lorsque la clé est lue, le TTL sera vérifié. Si le TTL a expiré, le TTL sera supprimé et rien ne sera renvoyé.
L'expiration active des clés dans la version 3.2 est décrite dans la documentation Redis. L'expiration active d'une clé commence par une fonction appelée activeExpireCycle. Il s'exécute plusieurs fois par seconde sur une minuterie interne appelée cron. Ce que fait la fonction activeExpireCycle, c'est parcourir chaque espace clé, rechercher un kry aléatoire avec un ensemble TTL, et si le seuil de pourcentage de kry expiré est atteint, répétez ce processus jusqu'à ce que le délai soit respecté. Cette méthode d'analyse de tous les krys est efficace, et lorsque l'analyse est terminée, l'utilisation de la mémoire diminue également. Il semble que Redis n'expire plus efficacement les clés. Cependant, la solution à cette époque était d'augmenter la taille du cluster et plus de matériel, afin que les clés soient davantage distribuées et qu'il y ait plus de mémoire disponible. C'est décevant car le projet de mise à niveau de Redis mentionné précédemment réduit la taille et le coût d'exploitation de ces clusters en les rendant plus efficaces. Pour plus d'articles techniques liés à Redis, veuillez visiter la colonneIntroduction au didacticiel d'utilisation de la base de données Redis pour apprendre !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!