Cette page fournit des conseils pour utiliser Memorystore pour Valkey de manière optimale. Elle souligne également 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 des instances afin que Memorystore pour Valkey fonctionne efficacement pour votre application.
Concepts de gestion de la mémoire
Utilisation de la mémoire : quantité de mémoire utilisée par votre instance. Vous disposez d'une capacité de mémoire fixe. Vous pouvez utiliser des métriques pour surveiller la quantité de mémoire que vous utilisez.
Règle d'éviction : Memorystore for Valkey utilise la règle d'éviction
volatile-lru. Vous pouvez utiliser des commandes Valkey telles queEXPIREpour définir des expulsions pour les clés.
Surveiller l'utilisation de la mémoire pour une instance
Pour surveiller l'utilisation de la mémoire d'une instance Memorystore pour Valkey, nous vous recommandons d'afficher la métrique /instance/memory/maximum_utilization. Si l'utilisation de la mémoire de l'instance approche les 80% et que vous prévoyez une augmentation de la consommation des données, augmentez la taille de l'instance pour faire de la place pour les nouvelles données.
Si l'utilisation de la mémoire de l'instance est élevée, procédez comme suit pour améliorer les performances :
- Augmentez la taille de l'instance.
- Diminuez le paramètre de configuration
maxmemory.
Si vous rencontrez des problèmes, contactez le service clientGoogle Cloud .
Scaler les partitions en mode Cluster activé
Lorsque vous mettez à l'échelle le nombre de partitions dans une instance, nous vous recommandons de le faire pendant les périodes de faible charge en écriture. Le scaling pendant les périodes de forte utilisation peut mettre de la pression sur votre instance en raison d'une surcharge de mémoire due à la réplication ou à la migration de slots.
Si votre cas d'utilisation Valkey utilise des évictions de clés, le scaling à une taille d'instance plus petite peut réduire votre taux d'accès au cache. Dans ce cas, vous n'avez pas à vous inquiéter de perdre des données, car l'éviction de clés est prévue.
Pour les cas d'utilisation de Valkey où vous ne souhaitez pas perdre de clés, vous ne devez réduire la taille de l'instance que si elle dispose encore de suffisamment d'espace pour vos données. Votre nouveau nombre cible de partitions 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 partitions pour 1,5 fois la quantité de données de votre instance. Vous pouvez utiliser la métrique /instance/memory/total_used_memory pour connaître la quantité de données stockées dans votre instance.
Bonnes pratiques concernant l'utilisation du processeur
En cas de panne de zone inattendue, les ressources de processeur de votre instance sont réduites en raison de la perte de capacité des nœuds de la zone indisponible. Nous vous recommandons d'utiliser des instances à haute disponibilité. L'utilisation de plusieurs répliques par segment (par opposition à une réplique par segment) fournit des ressources de processeur supplémentaires en cas de panne. Vous pouvez avoir jusqu'à cinq répliques par partition.
Nous vous recommandons également de gérer l'utilisation du processeur des nœuds afin qu'ils disposent d'une marge suffisante pour gérer le trafic supplémentaire provenant de la capacité perdue en cas d'indisponibilité zonale inattendue. Vous devez surveiller l'utilisation du processeur pour les nœuds principaux et les répliques à l'aide de la métrique Secondes d'utilisation du processeur du thread principal /instance/cpu/maximum_utilization.
En fonction du nombre de répliques que vous provisionnez par nœud, nous vous recommandons les cibles d'utilisation du processeur /instance/cpu/maximum_utilization suivantes :
- Pour les instances avec un réplica par nœud, visez une valeur
/instance/cpu/maximum_utilizationde 0,5 seconde pour le primaire et de 0,5 seconde pour le réplica. - Pour les instances comportant au moins deux répliques par nœud, visez une valeur
/instance/cpu/maximum_utilizationde 0,9 seconde pour la réplique principale et de 0,5 seconde pour chaque réplique.
Si les valeurs de la métrique dépassent ces recommandations, nous vous conseillons d'augmenter le nombre de partitions dans votre instance. Si votre instance comporte moins de cinq instances répliquées, vous pouvez également augmenter leur nombre jusqu'à un maximum de cinq.
Si votre instance 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), elle peut se comporter de manière anormale et des métriques externes peuvent manquer.
Commandes Valkey gourmandes en ressources
Nous vous recommandons vivement d'éviter d'utiliser des commandes Valkey gourmandes en ressources. L'utilisation de ces commandes peut entraîner les problèmes de performances suivants :
- Latence élevée et délais avant expiration des clients
- 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 Valkey est bloqué
- Vérifications d'état, observabilité et réplication affamées
Le tableau suivant liste des exemples de commandes Valkey gourmandes en ressources et propose des alternatives plus efficaces.
| Catégorie | Commande gourmande en ressources | Alternative économe en ressources |
|---|---|---|
| Exécuter pour l'ensemble de l'espace de clés | KEYS |
SCAN |
| Exécuter pour une collection 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 | DELETE |
UNLINK |
| Publier et s'abonner | PUBLISH |
SPUBLISH |
SUBSCRIBE |
SSUBSCRIBE |
Bonnes pratiques pour ajuster les seuils
Les scénarios de seuil de scaling se répartissent dans les catégories suivantes :
- Mise à l'échelle pour l'utilisation de la mémoire
- Scaling pour l'utilisation du processeur
- Scaling pour atténuer les zones à problèmes
Si votre charge de travail repose sur l'éviction de clés, Google ne recommande pas de faire de scaling à la baisse pour l'utilisation du processeur ou de la mémoire. Dans ces charges de travail, l'utilisation de la mémoire atteint fréquemment sa capacité maximale avant que les expulsions ne se produisent automatiquement. Les pics de mémoire qui en résultent bloquent les opérations de réduction.
Les sections suivantes détaillent les scénarios courants et les seuils de métriques qui peuvent justifier une mise à l'échelle.
Scaling de l'utilisation de la mémoire
Pour déterminer quand effectuer un scaling en fonction de l'utilisation de la mémoire, surveillez les métriques /instance/memory/average_utilization et /instance/memory/maximum_utilization. Pour en savoir plus sur ces métriques, consultez Métriques de surveillance compatibles.
Si votre instance remplit l'une des conditions suivantes, envisagez de déclencher une opération de scale-out :
- L'utilisation moyenne de la mémoire de votre instance dépasse le seuil suggéré de 70%.
- L'utilisation maximale de la mémoire dépasse 80% et l'utilisation moyenne de la mémoire dépasse 50%.
Si votre instance remplit l'une des conditions suivantes, envisagez de déclencher une opération de réduction de capacité :
- L'utilisation moyenne de la mémoire de votre instance est inférieure au seuil suggéré de 50%.
- L'utilisation maximale de la mémoire passe en dessous de 60% et l'utilisation moyenne de la mémoire passe en dessous de 40%.
Scaling de l'utilisation du processeur
Pour déterminer quand effectuer un scaling en fonction de l'utilisation du processeur, surveillez les métriques /instance/cpu/average_utilization et /instance/cpu/maximum_utilization.
Si votre instance remplit l'une des conditions suivantes, envisagez de déclencher une opération de scale-out :
- L'utilisation moyenne du processeur de votre instance dépasse le seuil suggéré de 70%.
- L'utilisation maximale du processeur dépasse 80% et l'utilisation moyenne du processeur dépasse 50%.
Si votre instance remplit l'une des conditions suivantes, envisagez de déclencher une opération de réduction de capacité :
- L'utilisation moyenne du processeur de votre instance est inférieure au seuil suggéré de 50%.
- L'utilisation maximale du processeur est inférieure à 60% et l'utilisation moyenne du processeur est inférieure à 40%.
Scaling pour atténuer les points chauds
Memorystore for Valkey fournit des variations moyennes et maximales de la même métrique, que vous pouvez utiliser pour identifier les points chauds de cette famille de métriques. La valeur maximale représente le nœud d'instance le plus chargé, tandis que la valeur moyenne représente la charge pour l'ensemble de l'instance. Si la valeur maximale est nettement supérieure à la valeur moyenne, cela indique qu'un nœud spécifique est chargé de manière disproportionnée (point chaud). Pour résoudre ce problème, nous vous recommandons d'effectuer un scaling horizontal de votre instance. Pour en savoir plus, consultez Faire évoluer la capacité d'une instance.
Lorsque vous constatez une divergence significative entre les variations moyennes et maximales, vous pouvez exécuter les commandes INFO memory et INFO cpu sur les nœuds d'instance pour collecter des données en temps réel directement à partir de l'instance. Pour en savoir plus sur l'utilisation de ces commandes, consultez INFO dans la documentation Valkey.
Bonnes pratiques concernant le client Valkey
Éviter la surcharge de connexion sur Valkey
Pour limiter l'impact causé par un afflux soudain de connexions, nous vous recommandons de procéder comme suit :
Déterminez la taille du pool de connexions client qui vous convient le mieux. Une bonne taille de départ pour chaque client est d'une connexion par nœud Valkey. Vous pouvez ensuite effectuer un benchmark pour voir si l'ajout de connexions est utile sans saturer le nombre maximal de connexions autorisées.
Lorsque le client se déconnecte du serveur en raison d'un délai d'attente du serveur, réessayez avec un intervalle exponentiel entre les tentatives et une gigue. Cela permet d'éviter que plusieurs clients ne surchargent le serveur simultanément.
Détecter et gérer les connexions qui ne répondent pas
Nous vous recommandons vivement de configurer votre application cliente pour qu'elle détecte les connexions non réactives à Memorystore for Valkey. Lorsqu'une connexion qui ne répond pas est détectée, le client doit la réinitialiser. Pour créer une application résiliente, nous vous recommandons les configurations client suivantes :
- Configurez les paramètres de message keep-alive TCP : définissez les paramètres
TCP keepalive time,TCP keepalive intervaletTCP keepalive probesafin que les clients détectent et abandonnent de manière proactive les connexions qui ne répondent pas, même lorsqu'elles sont inactives. Par exemple, si vous définissez le paramètreTCP keepalive timesur 30 secondes,TCP keepalive intervalsur 10 secondes etTCP keepalive probessur 3, les clients réinitialisent les connexions inactives non réactives en une minute. - Configurer les délais d'expiration TCP de l'utilisateur : définissez ce délai d'expiration dans vos clients pour réinitialiser les connexions qui ont des requêtes en attente et qui ne répondent plus. Par exemple, si vous définissez le délai avant expiration sur 15 secondes, les clients réinitialisent les connexions non réactives qui ont des requêtes en attente au bout de 15 secondes.
Pour les instances avec le mode cluster activé
Votre application doit utiliser un client Valkey compatible avec les clusters lorsqu'elle se connecte à une instance Memorystore pour Valkey en mode cluster activé. Pour obtenir des exemples de clients compatibles avec les clusters et des exemples de configurations, consultez Exemples de code de la bibliothèque cliente. Votre client doit tenir à jour une carte des emplacements de hachage vers les nœuds correspondants de l'instance pour envoyer les requêtes aux bons nœuds. Cela évite la surcharge de performances causée par les redirections.
Mappage des clients
Les clients doivent obtenir une liste complète des emplacements et des nœuds mappés dans les situations suivantes :
Lorsque le client est initialisé, il doit remplir le mappage initial entre les emplacements et les nœuds.
Lorsqu'une redirection
MOVEDest reçue du serveur, par exemple en cas de basculement lorsque tous les emplacements desservis par l'ancien nœud principal sont repris par la réplique, ou de re-partitionnement lorsque des emplacements sont déplacés du nœud principal source vers le nœud principal cible.Lorsqu'une erreur
CLUSTERDOWNest reçue du serveur ou que les connexions à un serveur particulier expirent de manière persistante.Lorsqu'une erreur
READONLYest reçue du serveur. Cela peut se produire lorsqu'un primaire est rétrogradé en réplica.De plus, les clients doivent actualiser régulièrement la topologie pour que les clients soient prêts à faire face à tout changement et pour en savoir plus sur les modifications qui peuvent ne pas entraîner de redirections ni d'erreurs du serveur, par exemple lorsque de nouveaux nœuds de réplique sont ajoutés. Notez que toutes les connexions obsolètes doivent également être fermées lors 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 de la commande.
Découverte du client
La découverte du client se fait généralement en envoyant une commande SLOTS, NODES ou CLUSTER SHARDS au serveur Valkey. Nous vous recommandons d'utiliser la commande CLUSTER SHARDS. CLUSTER SHARDS remplace la commande SLOTS (obsolète) en fournissant une représentation plus efficace et extensible de l'instance.
La taille de la réponse aux commandes de découverte du client peut varier en fonction de la taille et de la topologie de l'instance. Les instances plus grandes avec plus de nœuds génèrent une réponse plus importante. Il est donc important de s'assurer que le nombre de clients effectuant la découverte de la topologie des nœuds ne croît pas de manière illimitée.
Ces actualisations de la topologie des nœuds sont coûteuses sur le serveur Valkey, mais 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 de nœuds, une erreur courante consiste à ce que l'application cliente effectue plusieurs demandes de reconnexion et de découverte sans ajouter d'intervalle exponentiel entre les tentatives. Cela peut rendre le serveur Valkey non réactif pendant une longue période, ce qui entraîne une utilisation très élevée du processeur.
Utiliser un point de terminaison de découverte pour la découverte de nœuds
Utilisez le point de terminaison de découverte Memorystore for Valkey pour effectuer la découverte de nœuds. Le point de terminaison de découverte est disponibilité élevée et l'équilibrage de charge est effectué sur tous les nœuds de l'instance. De plus, le point de terminaison de découverte tente de router les requêtes de découverte de nœuds vers les nœuds dont la vue de la topologie est la plus à jour.
Pour les instances avec le mode cluster désactivé
Lorsque vous vous connectez à une instance en mode cluster désactivé, votre application doit se connecter au point de terminaison principal pour écrire dans l'instance et récupérer les dernières écritures. Votre application peut également se connecter au point de terminaison du lecteur pour lire les répliques et isoler le trafic du nœud principal.
Si vous utilisez la stratégie create-before-destroy lorsque vous effectuez une maintenance sur votre instance, vous pouvez recevoir le message d'erreur suivant :
READONLY You can't write against a read only replica.
Pour résoudre ce problème, arrêtez la connexion à votre instance. Recréez ensuite la connexion.
Bonnes pratiques de 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 instance avec des instantanés RDB ou de l'ajout de réplicas à votre instance, 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 sur écriture pour prendre un instantané des données de nœud. En fonction du modèle d'écritures dans les nœuds, la mémoire utilisée par les nœuds augmente à mesure que les pages concerné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 aux frais généraux. Cette surcharge de mémoire, en plus des instantanés de surveillance, vous aide à gérer votre charge de travail pour que les instantanés soient créés avec succès. De plus, lorsque vous ajoutez des réplicas, réduisez le trafic en écriture autant que possible. Pour en savoir plus, consultez Surveiller l'utilisation de la mémoire pour une instance.
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, comme un changement de schéma. Si vous craignez de devoir effectuer une récupération à partir d'un instantané obsolète, vous pouvez désactiver la fonctionnalité de persistance RDB. Une fois la persistance réactivée, 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 snapshots RDB peuvent avoir un impact sur les performances de l'instance et augmenter la latence de vos applications. Vous pouvez minimiser l'impact des instantanés RDB sur les performances en planifiant leur exécution pendant les périodes de faible trafic d'instance, si vous acceptez de prendre des instantanés moins fréquemment.
Par exemple, si votre instance enregistre un trafic faible de 1h à 4h du matin, vous pouvez définir l'heure de début sur 3h du matin et l'intervalle sur 24 heures.
Si votre système a une charge constante et nécessite des instantanés fréquents, nous vous recommandons d'évaluer attentivement l'impact sur les performances et de peser les avantages de l'utilisation d'instantanés RDB pour la charge de travail.
Ajouter une réplique
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 une instance à zone unique
Si vous configurez une instance pour qu'elle n'utilise pas de réplicas, nous vous recommandons d'utiliser une instance à 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 une instance à zone unique.
Réduire l'impact d'une indisponibilité
Lorsque vous choisissez une instance à zone unique, les pannes de zone sont moins susceptibles d'avoir un impact sur votre instance. En plaçant tous les nœuds dans une seule zone, la probabilité qu'une panne de zone affecte votre serveur passe de 100% à 33%. Il y a 33% de chances que la zone dans laquelle se trouve votre instance soit hors service, 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 une instance à zone unique, Memorystore pour Valkey simplifie la récupération de vos données. Vous pouvez provisionner rapidement une nouvelle instance dans une zone fonctionnelle et rediriger votre application pour que les opérations soient interrompues le moins possible.
Activer le protocole TLS (Transport Layer Security)
Cette section explique les avantages en termes de sécurité et les implications en termes de 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 Identity and Access Management (IAM) : TLS utilise ce type d'authentification pour se protéger contre les attaques par usurpation d'identité du serveur, telles que les attaques de type "man-in-the-middle".
- Chiffrement en transit : le chiffrement intégré àGoogle Cloudprotège le trafic au sein du réseau Google au niveau de l'infrastructure. Toutefois, cela implique de faire confiance aux piles d'hôte et de 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 d'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 ayant établi une session TLS peuvent la reprendre 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 nécessite beaucoup de ressources. Pour les connexions nouvelles et existantes, de nombreuses connexions entre le client et le serveur peuvent entraîner des délais d'expiration de la connexion. Cela peut entraîner un effet boule de neige, car Memorystore pour Valkey tente de rétablir les connexions expirées, ce qui augmente les ressources qu'il utilise pour établir les connexions.
Chiffrer et déchiffrer des données : les opérations de chiffrement et de déchiffrement des données nécessitent une utilisation intensive du processeur, ce qui a un impact à la fois sur le client et sur le serveur. Cela peut réduire la capacité de votre instance et augmenter sa latence.
Recommandations
Lorsque vous envisagez d'activer TLS, nous vous recommandons d'évaluer vos règles de sécurité en tenant compte des avantages et des inconvénients de TLS. Si vous choisissez d'activer TLS, tenez compte des points suivants :
- L'activation de la reprise TLS permet d'atténuer 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 de l'instance du client peut entraîner une brève interruption causée par la première handshake complète de chaque nouvel hôte client.
- Bien que certaines bibliothèques clientes n'offrent pas de contrôles intégrés pour activer TLS, vous pouvez utiliser du code personnalisé pour intégrer cette fonctionnalité à vos instances.