Béjean Développement

Installer et configurer Redis pour Magento 2

Objectif

Installer et configurer Redis et paramétrer Magento 2 pour activer les 3 caches avec Redis.

À quoi sert Redis ?

Redis est un logiciel de base de données NoSQL. Il fonctionne sur une base clé-valeur. Redis va être utile pour gérer le stockage des sessions, le cache des pages de Magento.

Par défaut, Redis utilise la RAM pour stocker de la donnée mais il est possible de persister les données sur le disque :

  • RDB (Redis Database Backup)
  • AOF (Append Only File)

La première méthode RDB, Redis va créer un snapshot complet de la base de données dans un fichier. Cela est réalisé à intervalle régulier.

Avec AOF, chaque opération sera écrite dans un fichier. En cas de redémarrage du serveur, Redis lira ce fichier pour restaurer les données.

Il est possible, et préférable, d'activer les 2 méthodes en même temps.

Installation

Il est possible de créer une instance Redis sous Docker très facilement, lien vers la page Docker.

Pour cet article, nous allons installer Redis au sein d'un conteneur LXC sous Debian Buster en lançant la commande : apt-get install redis-server.

Une fois installé, je vous invite à vérifier le statut du service en lançant la commande : systemctl status redis-server.service

Si le service n'est pas actif, il faut exécuter la commande systemctl start redis-server.service.

Vous pouvez tester le fonctionnement du service en lançant la commande : redis-cli ping, le résultat doit être PONG.

Configuration de Redis

Avant de configurer Magento 2 pour le faire fonctionner avec Redis, il faut modifier quelques paramètres au sein de Redis.

Tout d'abord, il faut modifier le fichier :/etc/redis/redis.conf.

Dans le cas où Redis n'est pas installé sur le même environnement que Magento 2, il faut modifier le bind en précisant une ou plusieurs adresses IP.

Magento recommande, pour optimiser les performances, de modifier la valeur no des 4 paramètres : lazyfree-lazy-eviction, lazyfree-lazy-expire, lazyfree-lazy-server-del, replica-lazy-flush par la valeur yes :

lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
replica-lazy-flush yes

Après quelques recherches, voici des informations très sommaires pour expliquer la recommandation par Magento. Le paramètre lazyfree-lazy-eviction effectue une suppression asynchrone des évictions dans le but d'éviter une surutilisation de la mémoire Redis. Pour lazyfree-lazy-expire ce paramètre effectue une suppression asynchrone des clés expirées et lazyfree-lazy-server-del effectue une suppression asynchrone des commandes qui mettent à jour les valeurs.

Quant à replica-lazy-flush, ce paramètre effectue une synchronisation asynchrone flushDB pendant la synchronisation du réplica dans le but de réduire le temps total de synchronisation.

Configurer la persistance

Par défaut, Redis réalise un instantané des données de la mémoire suivant 3 critères :

save 900 1
save 300 10
save 60 10000

Les données sont sauvegardées toutes les 900 secondes, soit 150 minutes, si au moins un changement a eu lieu. Toutes les 5 minutes, 300 secondes, si 10 changements ont eu lieu ou toutes les minutes, si 10000 changements ont eu lieu.

Pour information, le fichier de l'instantané se situe dans le dossier /var/lib/redis/dump.rdb.

Pour activer AOF, il faut remplacer la valeur no du paramètre appendonly dans le fichier de configuration.

Une fois la modification réalisée, il faut relancer le service Redis, puis vous pouvez vérifier en lançant la commande : redis-cli info Persistence. Dans le retour, vous devriez avoir aof_enabled:1.

Si vous souhaitez plus d'informations sur le paramétrage de la persistance des données, je vous conseille de lire la documentation officielle de Redis.

Configuration de Magento 2

Pour activer Redis dans Magento, 3 commandes doivent être exécutées :

bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-server=url-serveur-redis --cache-backend-redis-db=0

Cette commande permet de configurer la mise en cache par défaut de Redis. Cette action correspond au contenu suivant dans le fichier app/etc/env.php :

...,
'cache' => [
    'frontend' => [
        'default' => [
            'id_prefix' => 'cc4_',
            'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
            'backend_options' => [
                'server' => 'url-serveur-redis',
                'database' => '0',
                'port' => '6379',
                'password' => '',
                'compress_data' => '1',
                'compression_lib' => ''
            ]
        ],
bin/magento setup:config:set --page-cache=redis --page-cache-redis-server=url-serveur-redis --page-cache-redis-db=1

Cette commande permet de configurer la mise en cache des pages dans Redis. Cette action correspond au contenu suivant dans le fichier app/etc/env.php :

...,
'cache' => [
    'frontend' => [
        'page_cache' => [
            'id_prefix' => 'cc4_',
            'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
            'backend_options' => [
                'server' => 'url-serveur-redis',
                'database' => '1',
                'port' => '6379',
                'password' => '',
                'compress_data' => '0',
                'compression_lib' => ''
            ]
        ]

La valeur id_prefix est définie par Magento lors de l'exécution des commandes, vous n'aurez pas la même valeur pour ce paramètre.

Magento stocke beaucoup de données de configuration dans le cache Redis, il est recommandé de précharger certaines données. Pour cela, il faut ajouter le tableau suivant dans la configuration du cache présent dans le fichier app/etc/env.php :

'preload_keys' => [
    'cc4_EAV_ENTITY_TYPES',
    'cc4_GLOBAL_PLUGIN_LIST',
    'cc4_DB_IS_UP_TO_DATE',
    'cc4_SYSTEM_DEFAULT',
],

Si vous utilisez le cache L2, il faut ajouter le suffixe :hash pour chaque clé. Si vous souhaitez plus d'informations à ce sujet, voici le lien vers la documentation.

Pour cette première partie, votre fichier app/etc/env.php doit contenir un tableau cache avec les données ci-dessous :

'cache' => [
    'frontend' => [
        'default' => [
            'id_prefix' => 'cc4_',
            'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
            'backend_options' => [
                'server' => 'url-serveur-redis',
                'database' => '0',
                'port' => '6379',
                'password' => '',
                'compress_data' => '1',
                'compression_lib' => '',
                'preload_keys' => [
                    'cc4_EAV_ENTITY_TYPES',
                    'cc4_GLOBAL_PLUGIN_LIST',
                    'cc4_DB_IS_UP_TO_DATE',
                    'cc4_SYSTEM_DEFAULT',
                ]
            ]
        ],
        'page_cache' => [
            'id_prefix' => 'cc4_',
            'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
            'backend_options' => [
                'server' => 'url-serveur-redis',
                'database' => '1',
                'port' => '6379',
                'password' => '',
                'compress_data' => '0',
                'compression_lib' => ''
            ]
        ]
    ],
    'allow_parallel_generation' => false
],

Depuis Magento 2.4, une nouvelle option a été introduite allow_parallel_generation. Voici ce qui est indiqué dans la documentation officielle :

Starting with the 2.4.0 release, we introduced the allow_parallel_generation option for the users that want to eliminate waitings for locks. It is disabled by default, and we recommend keeping it disabled until you have excessive configurations and/or blocks.

La 3ᵉ et dernière commande consiste à activer le cache des sessions en exécutant cette commande :

bin/magento setup:config:set --session-save=redis --session-save-redis-host=url-serveur-redis --session-save-redis-log-level=4 --session-save-redis-db=2

Cette commande va remplacer, dans le fichier app/etc/env.php, le tableau session par :

...,
'session' => [
    'save' => 'redis',
    'redis' => [
        'host' => 'url-serveur-redis',
        'port' => '6379',
        'password' => '',
        'timeout' => '2.5',
        'persistent_identifier' => '',
        'database' => '2',
        'compression_threshold' => '2048',
        'compression_library' => 'gzip',
        'log_level' => '4',
        'max_concurrency' => '6',
        'break_after_frontend' => '5',
        'break_after_adminhtml' => '30',
        'first_lifetime' => '600',
        'bot_first_lifetime' => '60',
        'bot_lifetime' => '7200',
        'disable_locking' => '0',
        'min_lifetime' => '60',
        'max_lifetime' => '2592000',
        'sentinel_master' => '',
        'sentinel_servers' => '',
        'sentinel_connect_retries' => '5',
        'sentinel_verify_master' => '0'
    ]
],
...

Cette commande comporte plusieurs paramètres que vous pouvez retrouver dans la documentation officielle.

Avant de clore cette partie, je tiens à vous indiquer que pour chacune des commandes ci-dessus, la valeur *-db est différente car nous activons 3 types de cache dans Redis. Il faut donc stocker les différentes données dans 3 bases de données séparées.

Au sein de Redis, vous pouvez obtenir la liste des bases de données en lançant la commande : redis-cli INFO keyspace.

Avant d'exécuter les 3 commandes ci-dessus, veillez à bien modifier la valeur url-serveur-redis par l'URL de votre serveur Redis.

Lancer la commande bin/magento setup:upgrade avant de passer à l'étape suivante.

Résultat

Pour contrôler que la liaison est opérationnelle, vous avez la possibilité de lancer, sur le serveur Redis, la commande : redis-cli monitor. Cependant, vous allez avoir beaucoup de données et la lecture n'est pas facile.

Pour voir ce qu'il se passe dans le cache des sessions, par exemple, vous pouvez lancer la commande suivante : redis-cli monitor | grep sess_. Vous apercevrez alors toutes les données transmises par Magento à Redis lors d'une navigation sur le frontoffice.