Comment résoudre le message d'erreur « OOM command not allowed » (Commande OOM non autorisée) pour un nœud de cluster ElastiCache for Redis ?

Dernière mise à jour : 01/07/2022

J’ai reçu l'erreur « OOM command not allowed when used memory 'maxmemory' » (Commande OOM non autorisée lorsque la mémoire utilisée est supérieure à ’maxmemory’) lors de l’interrogation du nœud de cluster Amazon ElastiCache for Redis. Comment puis-je résoudre ce problème ?

Brève description

Une erreur OOM se produit lorsqu'un cluster ElastiCache for Redis ne peut pas libérer de mémoire supplémentaire.

ElastiCache for Redis implémente maxmemory-policy qui est défini pour le groupe de paramètres du nœud de cache lorsqu'il ne dispose plus de mémoire. La valeur par défaut (volatile-lru) libère de la mémoire en expulsant les clés ayant un délai d'expiration (valeur TTL). Lorsqu'un nœud de cache n'a pas de clés ayant une valeur de durée de vie (TTL, time-to-live), il renvoie une erreur.

Pour résoudre cette erreur et empêcher les clients de recevoir les messages d'erreur Commande OOM non autorisée, effectuez une combinaison des opérations suivantes :

  • Définissez une valeur TTL pour les clés sur votre nœud.
  • Mettez à jour le groupe de paramètres pour utiliser un paramètre maxmemory-policy différent.
  • Supprimez des clés existantes manuellement pour libérer de la mémoire.
  • Choisissez un type de nœud plus grand.

Remarque : la combinaison exacte des résolutions que vous utilisez dépend de votre cas d'utilisation particulier.

Solution

Définir une valeur de durée de vie (TTL) pour les clés sur votre nœud

Vous pouvez définir une valeur TTL pour les clés sur votre nœud. La stratégie par défaut de gestion de la mémoire volatile-lru expulse alors les clés expirées pour libérer de la mémoire.

Si vous définissez une valeur TTL, vous pouvez également utiliser le paramètre volatile-ttl. Ce paramètre récupère de l'espace en expulsant uniquement les clés ayant un délai d’expiration défini, en commençant par les clés ayant la TTL la plus basse.

Choisir un paramètre maxmemory-policy différent

Affectez à maxmemory-policy l'une des valeurs suivantes pour un groupe de paramètres de nœud de cache :

  • allkeys-lru : récupère de l'espace en expulsant d'abord les clés les moins utilisées récemment.
  • allkeys-random : récupère de l'espace en expulsant les clés aléatoires.
  • volatile-random : récupère de l'espace en expulsant les clés aléatoires ayant une expiration définie.

De plus, Redis 4.0 offre des modes d'expulsion de clés les moins utilisées (LFU, Least Frequently Used) :

  • allkeys-lfu : récupère de l'espace en expulsant la clé ayant fait l'objet du plus petit nombre d'accès.
  • volatils-lfu : récupère de l'espace en expulsant les clés ayant une expiration définie, en commençant par celle ayant fait l'objet du plus petit nombre d'accès.

Supprimer des clés existantes pour libérer de la mémoire

Vous pouvez supprimer des clés existantes afin de libérer de la mémoire à l'aide de la commande DEL. Pour plus d'informations, consultez Suppr clé [clé...] sur le site web redis.io.

Important : la suppression de clés existantes résout temporairement les erreurs OOM. Veillez à également reconsidérer votre stratégie de gestion de la mémoire.

Choisir un type de nœud plus grand

Chaque type de nœud a une quantité différente de mémoire disponible. Vous ne pouvez pas modifier la quantité de mémoire disponible sur un nœud. Cependant, vous pouvez utiliser un type de nœud plus grand avec une plus grande quantité de mémoire.

Important : l'utilisation d'un type de nœud plus grand résout temporairement les erreurs OOM. Veillez à également reconsidérer votre stratégie de gestion de la mémoire.