Bonnes pratiques pour Memorystore for Redis Cluster

Cette page fournit des conseils pour utiliser Memorystore for Redis Cluster de manière optimale. Elle met également en évidence les problèmes potentiels à éviter.

Bonnes pratiques pour la gestion de la mémoire

Cette section décrit les stratégies de gestion de la mémoire pour les clusters afin que Memorystore for Redis Cluster fonctionne efficacement pour vos applications clientes.

Concepts de gestion de la mémoire

  • Charge d'écriture : volume et vitesse auxquels vous ajoutez ou mettez à jour des clés dans votre cluster Redis. Votre charge d'écriture peut être normale à très élevée en fonction de votre cas d'utilisation de Redis et des modèles d'utilisation de votre application.

  • Règle d'éviction : Memorystore for Redis Cluster utilise la volatile-lru règle d'éviction. Vous pouvez utiliser des commandes telles que la commande EXPIRE pour définir des évictions pour les clés.

Surveiller un cluster avec une charge d'écriture normale

Affichez la métrique /cluster/memory/maximum_utilization. Si /cluster/memory/maximum_utilization est égale ou inférieure à 100 %, votre cluster Redis fonctionne correctement lorsque vous utilisez une charge d'écriture normale.

Toutefois, si votre utilisation de mémoire approche les 100% et que vous prévoyez une augmentation de la consommation des données, vous devez augmenter la capacité de votre cluster pour faire de la place pour les nouvelles données.

Surveiller un cluster avec une charge d'écriture élevée

Affichez la métrique /cluster/memory/maximum_utilization. En fonction de la gravité de votre charge d'écriture élevée, votre cluster peut rencontrer des problèmes de performances aux seuils suivants :

  • Les charges d'écriture très élevées peuvent rencontrer des problèmes si /cluster/memory/maximum_utilization atteint 65% ou plus.

  • Les charges d'écriture modérément élevées peuvent rencontrer des problèmes si /cluster/memory/maximum_utilization atteint 85% ou plus.

Dans ces scénarios, vous devez augmenter la taille de votre cluster pour améliorer les performances.

Si vous rencontrez des problèmes ou si vous craignez que votre cluster ait une charge d'écriture élevée, contactez Google Cloud l'assistance.

Effectuer le scaling des segments

Lorsque vous effectuez le scaling du nombre de segments dans un cluster, vous devez le faire pendant les périodes de faible écriture. Le scaling pendant les périodes de forte charge d'écriture peut exercer une pression sur la mémoire de votre cluster en raison de la surcharge de mémoire causée par la réplication ou la migration des emplacements.

Si votre cas d'utilisation de Redis utilise des évictions de clés, le scaling vers une taille de cluster plus petite peut réduire votre taux d'accès au cache. Dans ce cas, vous n'avez pas à vous soucier de la perte de données, car l'éviction de clés est attendue.

Pour les cas d'utilisation de Redis où vous ne souhaitez pas perdre de clés, vous ne devez effectuer le scaling à la baisse que vers un cluster plus petit qui dispose encore de suffisamment d'espace pour vos données. Votre nouveau nombre cible de segments doit permettre d'allouer au moins 1,5 fois la mémoire utilisée par les données. En d'autres termes, vous devez provisionner suffisamment de segments pour 1,5 fois la quantité de données de votre cluster. Vous pouvez utiliser la métrique /cluster/memory/total_used_memory pour voir la quantité de données stockées dans votre cluster.

Bonnes pratiques concernant l'utilisation du processeur

En cas de panne zonale inattendue, les ressources de processeur de votre cluster sont réduites en raison de la perte de capacité des nœuds de la zone indisponible. Nous vous recommandons d'utiliser des clusters à haute disponibilité. L'utilisation de plusieurs instances répliquées par segment (au lieu d'une seule) fournit des ressources de processeur supplémentaires en cas de panne. Vous pouvez avoir jusqu'à cinq instances répliquées par segment.

De plus, nous vous recommandons de gérer l'utilisation du processeur des nœuds afin qu'ils disposent d'une surcharge de processeur suffisante pour gérer le trafic supplémentaire en cas de perte de capacité due à une panne zonale inattendue. Vous devez surveiller l'utilisation du processeur pour les nœuds principaux et les instances répliquées à l'aide de la métrique Main Thread CPU Seconds /cluster/cpu/maximum_utilization.

En fonction du nombre d'instances répliquées que vous provisionnez par nœud, nous vous recommandons les objectifs d'utilisation du processeur /cluster/cpu/maximum_utilization suivants :

  • Pour les clusters avec une instance répliquée par nœud, ciblez une valeur /cluster/cpu/maximum_utilization de 0,5 seconde pour le nœud principal et de 0,5 seconde pour l'instance répliquée.
  • Pour les clusters avec deux instances répliquées par nœud ou plus, ciblez une valeur /cluster/cpu/maximum_utilization de 0,9 seconde pour le nœud principal et de 0,5 seconde pour chaque instance répliquée.

Si les valeurs de la métrique dépassent ces recommandations, nous vous recommandons d'augmenter le nombre de segments de votre cluster. Si votre cluster comporte moins de cinq instances répliquées, vous pouvez également augmenter le nombre d'instances répliquées jusqu'à un maximum de cinq.

Si votre cluster connaît une utilisation élevée du processeur ou si ses ressources sont épuisées (par exemple, en raison d'un nombre trop important de connexions), il peut se comporter de manière anormale et les métriques externes peuvent être manquantes.

Commandes Redis gourmandes en ressources

Nous vous recommandons vivement d'éviter d'utiliser des commandes Redis gourmandes en ressources. L'utilisation de ces commandes peut entraîner les problèmes de performances suivants :

  • Latence élevée et délais d'attente du client
  • Pression sur la mémoire causée par des commandes qui augmentent l'utilisation de la mémoire
  • Perte de données lors de la réplication et de la synchronisation des nœuds, car le thread principal de Redis est bloqué
  • Vérifications d'état, observabilité et réplication insuffisantes

Le tableau suivant répertorie des exemples de commandes Redis gourmandes en ressources et vous propose des alternatives efficaces.

Catégorie Commande gourmande en ressources Alternative efficace
Exécuter pour l'ensemble de l'espace de clés KEYS SCAN
Exécuter pour un ensemble de clés de longueur variable LRANGE Limitez la taille de la plage que vous utilisez pour une requête.
ZRANGE Limitez la taille de la plage que vous utilisez pour une requête.
HGETALL HSCAN
SMEMBERS SSCAN
Bloquer l'exécution d'un script EVAL Assurez-vous que votre script ne s'exécute pas indéfiniment.
EVALSHA Assurez-vous que votre script ne s'exécute pas indéfiniment.
Supprimer des fichiers et des liens DEL UNLINK
Publier et s'abonner PUBLISH SPUBLISH
SUBSCRIBE SSUBSCRIBE

Bonnes pratiques concernant les clients Redis

Votre application doit utiliser un client Redis compatible avec les clusters lorsqu'elle se connecte à un cluster. Pour obtenir des exemples de clients compatibles avec les clusters et des exemples de configurations, consultez Exemples de code de bibliothèque cliente. Votre client doit conserver une carte des emplacements de hachage vers les nœuds correspondants du cluster pour envoyer des requêtes aux bons nœuds et éviter la surcharge de performances causée par les redirections de cluster.

Mappage client

Les clients doivent obtenir une liste complète des emplacements et des nœuds mappés dans les situations suivantes :

  • Lors de l'initialisation du client, il doit remplir le mappage initial des emplacements vers les nœuds.

  • Lorsqu'une redirection MOVED est reçue du serveur, par exemple en cas de basculement lorsque tous les emplacements desservis par l'ancien nœud principal sont repris par l'instance répliquée, ou en cas de re-segmentation lorsque les emplacements sont déplacés du nœud principal source vers le nœud principal cible.

  • Lorsqu'une erreur CLUSTERDOWN est reçue du serveur ou que les connexions à un serveur particulier expirent de manière persistante.

  • Lorsqu'une erreur READONLY est reçue du serveur. Cela peut se produire lorsqu'un nœud principal est rétrogradé en instance répliquée.

  • De plus, les clients doivent actualiser périodiquement la topologie pour les préparer à tout changement et en savoir plus sur les modifications qui peuvent ne pas entraîner de redirections ou d'erreurs du serveur, par exemple lorsque de nouveaux nœuds d'instance répliquée sont ajoutés. Notez que toutes les connexions obsolètes doivent également être fermées dans le cadre de l'actualisation de la topologie afin de réduire la nécessité de gérer les connexions ayant échoué lors de l'exécution des commandes.

Découverte du client

La découverte du client s'effectue généralement en émettant une commande CLUSTER SLOT, CLUSTER NODE ou CLUSTER SHARDS sur le serveur Redis. Nous vous recommandons d'utiliser la commande CLUSTER SHARDS. CLUSTER SHARDS remplace la commande CLUSTER SLOTS (obsolète) en fournissant une représentation plus efficace et extensible du cluster.

La taille de la réponse pour les commandes de découverte du client de cluster peut varier en fonction de la taille et de la topologie du cluster. Les clusters plus volumineux avec plus de nœuds génèrent une réponse plus importante. Par conséquent, il est important de s'assurer que le nombre de clients effectuant la découverte de la topologie du cluster ne croît pas de manière illimitée.

Ces actualisations de la topologie sont coûteuses sur le serveur Redis, mais elles sont également importantes pour la disponibilité des applications. Il est donc important de s'assurer que chaque client effectue une seule requête de découverte à un moment donné (et met en cache le résultat en mémoire), et que le nombre de clients effectuant les requêtes reste limité pour éviter de surcharger le serveur.

Par exemple, lorsque l'application cliente démarre ou perd la connexion au serveur et doit effectuer la découverte du cluster, une erreur courante consiste à ce que l'application cliente effectue plusieurs requêtes de reconnexion et de découverte sans ajouter d' intervalle exponentiel entre les tentatives. Cela peut rendre le serveur Redis non réactif pendant une période prolongée, ce qui entraîne une utilisation très élevée du processeur.

Éviter la surcharge de découverte sur Redis

Pour atténuer l'impact causé par un afflux soudain de requêtes de connexion et de découverte, nous vous recommandons de procéder comme suit :

  • Implémentez un pool de connexions client de taille finie et réduite pour limiter le nombre de connexions entrantes simultanées provenant de l'application cliente.

  • Lorsque le client se déconnecte du serveur en raison d'un délai d'attente, réessayez avec un intervalle exponentiel entre les tentatives et une gigue. Cela permet d'éviter que plusieurs clients ne submergent le serveur en même temps.

  • Utilisez le point de terminaison de découverte de Memorystore for Redis Cluster pour effectuer la découverte du cluster. Le point de terminaison de découverte est disponibilité élevée et l'équilibrage de charge est effectué sur tous les nœuds du cluster. De plus, le point de terminaison de découverte tente de router les requêtes de découverte du cluster vers les nœuds dont la vue de la topologie est la plus récente.

Bonnes pratiques concernant la persistance

Cette section explique les bonnes pratiques concernant la persistance.

Persistance RDB et ajout d'instances répliquées

Pour obtenir les meilleurs résultats lors de la sauvegarde de votre cluster avec des instantanés RDB ou de l'ajout d'instances répliquées à votre cluster, suivez les bonnes pratiques suivantes :

Gestion de la mémoire

Les instantanés RDB utilisent un fork de processus et un mécanisme de "copie à l'écriture" pour prendre un instantané des données de nœud. En fonction du modèle d'écriture dans les nœuds, la mémoire utilisée par les nœuds augmente à mesure que les pages touchées par les écritures sont copiées. L'espace mémoire utilisé peut atteindre le double de la taille des données dans le nœud.

Pour vous assurer que les nœuds disposent de suffisamment de mémoire pour effectuer l'instantané, conservez ou définissez maxmemory à 80% de la capacité du nœud afin que 20% soient réservés à la surcharge. Cette surcharge de mémoire, en plus de la surveillance des instantanés, vous aide à gérer votre charge de travail pour que les instantanés soient réussis. De plus, lorsque vous ajoutez des instances répliquées, réduisez le trafic d'écriture autant que possible. Pour en savoir plus, consultez Surveiller un cluster avec une charge d'écriture élevée.

Instantanés obsolètes

La récupération de nœuds à partir d'un instantané obsolète peut entraîner des problèmes de performances pour votre application, car elle tente de réconcilier une quantité importante de clés obsolètes ou d'autres modifications apportées à votre base de données, telles qu'un changement de schéma. Si vous craignez de récupérer à partir d'un instantané obsolète, vous pouvez désactiver la fonctionnalité de persistance RDB. Une fois que vous avez réactivé la persistance, un instantané est pris lors du prochain intervalle d'instantané planifié.

Impact des instantanés RDB sur les performances

En fonction de votre modèle de charge de travail, les instantanés RDB peuvent avoir un impact sur les performances du cluster et augmenter la latence de vos applications. Vous pouvez minimiser l'impact des instantanés RDB sur les performances en les planifiant pour qu'ils s'exécutent pendant les périodes de faible trafic du cluster si vous êtes à l'aise avec des instantanés moins fréquents.

Par exemple, si votre cluster a un faible trafic entre 1h et 4h du matin, vous pouvez définir l'heure de début sur 3h et l'intervalle sur 24 heures.

Si votre système a une charge constante et nécessite des instantanés fréquents, vous devez évaluer soigneusement l'impact sur les performances et peser les avantages de l'utilisation d'instantanés RDB pour la charge de travail.

Ajouter une instance répliquée

L'ajout d'une instance répliquée nécessite un instantané RDB. Pour en savoir plus sur les instantanés RDB, consultez Gestion de la mémoire.

Quand utiliser un cluster à zone unique

Si vous configurez un cluster de sorte qu'il n'utilise pas d'instances répliquées, nous vous recommandons d'utiliser un cluster à zone unique. Voici pourquoi :

Coût et performances

Si votre objectif principal est de minimiser vos coûts et d'obtenir des performances optimales pour vos clients situés dans la même région, nous vous recommandons de choisir un cluster à zone unique.

Minimiser l'impact des pannes

Lorsque vous choisissez un cluster à zone unique, les pannes zonales sont moins susceptibles d'avoir un impact sur votre cluster. En plaçant tous les nœuds dans une seule zone, la probabilité qu'une panne zonale affecte votre serveur passe de 100% à 33%. Il y a 33% de chances que la zone dans laquelle se trouve votre cluster tombe en panne, contre 100% de chances que les nœuds situés dans la zone indisponible soient affectés.

Récupération rapide

En cas de panne zonale pour un cluster à zone unique, Memorystore for Redis Cluster simplifie la récupération de vos données. Vous pouvez provisionner rapidement un nouveau cluster dans une zone fonctionnelle et rediriger votre application pour des opérations peu interrompues.

Bonnes pratiques concernant Lettuce

Cette section décrit les bonnes pratiques à suivre pour utiliser Lettuce afin de vous connecter à un cluster.

Mettre à jour les valeurs des paramètres

Lorsque vous utilisez Lettuce, remplacez le paramètre validateClusterNodeMembership par false. Sinon, lorsque la topologie change, vous risquez d'obtenir des erreurs unknownPartition.

Activer le protocole TLS (Transport Layer Security)

Cette section explique les avantages en termes de sécurité et les implications sur les performances de l'utilisation du protocole TLS (Transport Layer Security), ainsi que des recommandations pour son activation.

Avantages de sécurité

En utilisant TLS, vous bénéficiez des avantages de sécurité suivants :

  • Authentification IAM (Identity and Access Management): TLS utilise ce type d'authentification pour se protéger contre les attaques par usurpation de serveur, telles que les attaques de l'intercepteur.
  • Chiffrement en transit: Google Cloudle chiffrement intégré de protège le trafic au sein du réseau de Google au niveau de l'infrastructure. Toutefois, cela implique de faire confiance à la fois à l'hôte et aux piles réseau de Google. Bien que ce chiffrement soit transparent et activé par défaut, il n'est pas de bout en bout. En revanche, TLS utilise le chiffrement en transit au niveau de la couche application. Ce chiffrement de bout en bout vous offre plus de contrôle sur vos clés et processus de chiffrement.
  • Protection des jetons d'authentification : si vous utilisez l'authentification IAM, l'activation de TLS minimise le risque d'exposition et de fuite de vos jetons d'authentification.

Implications en termes de performance

TLS a un impact sur les performances des manières suivantes :

  • Établir des connexions : un client et un serveur qui ont établi une session TLS peuvent reprendre la session sans répéter le processus gourmand en ressources d'établissement de la connexion entre le client et le serveur. En activant la reprise TLS, vous réduisez la surcharge liée à l'établissement d'une connexion entre le client et le serveur.

    Si vous n'établissez pas de reprise TLS, l'établissement de connexions est gourmand en ressources. Pour les connexions nouvelles et existantes, de nombreuses connexions entre le client et le serveur peuvent entraîner des délais d'attente de connexion. Cela peut provoquer un effet boule de neige, car Memorystore for Redis Cluster tente de rétablir les connexions ayant expiré, ce qui augmente les ressources qu'il utilise pour établir des connexions.

  • Chiffrer et déchiffrer des données: le chiffrement et le déchiffrement des données impliquent des opérations gourmandes en processeur qui ont un impact à la fois sur le client et sur le serveur. Cela peut réduire la capacité de votre cluster et augmenter sa latence.

Recommandations

Lorsque vous envisagez d'activer TLS, nous vous recommandons d'évaluer vos règles de sécurité tout en tenant compte des avantages et des inconvénients de TLS. Si vous choisissez d'activer TLS, gardez à l'esprit les points suivants :

  • L'activation de la reprise TLS réduit la surcharge liée à l'établissement de connexions. Une connexion entre le client et le serveur n'est requise que pour la connexion initiale. Toutefois, une expansion soudaine de la taille du cluster du client peut entraîner une brève interruption causée par la première négociation complète de chaque nouvel hôte client.
  • Bien que certaines bibliothèques clientes ne proposent pas de commandes intégrées pour activer TLS, vous pouvez utiliser du code personnalisé pour intégrer cette fonctionnalité à vos clusters.