Remarques :

Migration de Redis Cluster vers Oracle Cloud Infrastructure Cache

Introduction

Ce tutoriel fournit un processus étape par étape pour migrer le cache de cluster Redis distribué à l'aide de l'outil pyredis-dump. pyredis-dump est un outil basé sur Python conçu pour simplifier le vidage et la restauration des données Redis. La procédure s'applique à l'un des scénarios de migration suivants :

Bien que ce tutoriel se concentre principalement sur la migration d'un cluster Redis sur site vers OCI sans architecture maître-esclave, la même approche peut également être appliquée aux environnements qui utilisent une configuration maître-esclave Redis.

Qu'est-ce que Redis ?

Qu'est-ce que Redis Cluster ?

Redis Cluster offre une haute disponibilité et une mise à l'échelle horizontale. Il divise les données en shards, répartis sur plusieurs noeuds. Chaque shard possède un noeud principal et des répliques pour la tolérance aux pannes. Cela permet à Redis Cluster de gérer des ensembles de données plus volumineux et un débit d'écriture plus élevé.

L'image suivante présente un cluster à 3 noeuds contenant 3 noeuds en tant que noeud principal (M1, M2 et M3) avec chaque noeud esclave en tant que noeud (S1, S2 et S3). La configuration d'esclave est facultative pour offrir une plus grande disponibilité.

image

Redis Cluster n'utilise pas de hachage cohérent, mais une forme de sharding différente où chaque clé fait partie conceptuellement de ce que nous appelons un emplacement de hachage. Il existe 16384 emplacements de hachage dans Redis Cluster. Chaque noeud d'un cluster Redis est responsable d'un sous-ensemble d'emplacements de hachage. Par exemple, vous pouvez avoir un cluster avec 3 noeuds, où :

Qu'est-ce qu'OCI Cache ?

image

Objectifs

Prérequis

Tâche 1 : configurer le cluster Redis source dans une configuration sur site

  1. Configurez les hôtes sur site. Créez trois machines virtuelles sur site ou un hôte physique à l'aide de RHEL8.

    • Redis_Node1: 10.0.0.151
    • Redis_Node2: 10.0.0.164
    • Redis_Node3: 10.0.0.205
  2. Ouvrez le port sur tous les noeuds.

    Chaque noeud Redis Cluster requiert 1 à 3 connexions TCP ouvertes en fonction de la configuration. Port TCP Redis normal utilisé pour servir les clients, par exemple 6379, plus le port obtenu en ajoutant 10000 au port de données, donc 16379 pour le cluster et 26379 pour Sentinel. Assurez-vous d'ouvrir tous les ports de votre pare-feu, sinon les noeuds de cluster Redis ne pourront pas communiquer. Exécutez les commandes suivantes .

    $firewall-cmd --permanent --add-port=6379/tcp  ( For master/slave replication and clint connection)
    $firewall-cmd --permanent --add-port=16379/tcp ( For Redis Cluster )
    $firewall-cmd --reload
    
  3. Installez le logiciel Redis sur tous les noeuds. Exécutez la commande suivante pour télécharger la dernière version de Redis Community Edition 7.4 pour RHEL8. Installez le logiciel Redis sur les trois noeuds à l'aide de l'utilisateur root.

    $mkdir /redis
    $wget http://download.redis.io/redis-stable.tar.gz
    $tar xvzf redis-stable.tar.gz
    $cd redis-stable
    $make redis-cli
    $make BUILD_TLS=yes
    $cp src/redis-cli /usr/local/bin/
    $cp redis-server /usr/local/bin/
    $redis-cli -v
    
  4. Préparez le fichier de configuration Redis sur tous les noeuds.

    Il est recommandé de configurer un cluster Redis à trois noeuds avec au moins une réplique (esclave) par maître et Sentinel pour la haute disponibilité. Dans cet exemple, nous avons créé trois clusters de noeuds sans répliques. Pour configurer un cluster Redis, nous devons préparer le fichier de configuration de cluster nommé redis.conf sur les trois noeuds sous le dossier /redis.

    $cd /redis
    
    $vi redis.conf
    port 6379
    timeout 0
    protected-mode no
    tcp-keepalive 300
    pidfile "/redis/redis-server.pid"
    logfile "/redis/redis-server.log"
    requirepass "pass123"
    dbfilename "dump.rdb"
    appendonly no
    masterauth "pass123"
    cluster-enabled yes
    cluster-config-file /redis/nodes.conf
    cluster-node-timeout 5000
    
  5. Démarrez le serveur Redis sur tous les noeuds. Exécutez la commande suivante pour démarrer le serveur Redis sur les trois noeuds.

    [root@instance-20250224-0709 redis]# redis-server
    814355:C 16 Apr 2025 15:30:35.171 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
    814355:C 16 Apr 2025 15:30:35.171 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    814355:C 16 Apr 2025 15:30:35.171 * Redis version=7.4.2, bits=64, commit=00000000, modified=0, pid=814355, just started
    814355:C 16 Apr 2025 15:30:35.171 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
    814355:M 16 Apr 2025 15:30:35.171 * Increased maximum number of open files to 10032 (it was originally set to 1024).
    814355:M 16 Apr 2025 15:30:35.172 * monotonic clock: POSIX clock_gettime
                   _._
             _.-``__ ''-._
          _.-``    `.  `_.  ''-._           Redis Community Edition
    .-`` .-```.  ```\/    _.,_ ''-._     7.4.2 (00000000/0) 64 bit
    (    '      ,       .-`  | `,    )     Running in standalone mode
    |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
    |    `-._   `._    /     _.-'    |     PID: 814355
    `-._    `-._  `-./  _.-'    _.-'
    |`-._`-._    `-.__.-'    _.-'_.-'|
    |    `-._`-._        _.-'_.-'    |           https://redis.io
    `-._    `-._`-.__.-'_.-'    _.-'
    |`-._`-._    `-.__.-'    _.-'_.-'|
    |    `-._`-._        _.-'_.-'    |
    `-._    `-._`-.__.-'_.-'    _.-'
          `-._    `-.__.-'    _.-'
             `-._        _.-'
                `-.__.-'
    
    814355:M 16 Apr 2025 15:30:35.172 * Server initialized
    814355:M 16 Apr 2025 15:30:35.173 * Loading RDB produced by version 7.4.2
    814355:M 16 Apr 2025 15:30:35.173 * RDB age 9 seconds
    814355:M 16 Apr 2025 15:30:35.173 * RDB memory usage when created 2.18 Mb
    814355:M 16 Apr 2025 15:30:35.173 * Done loading RDB, keys loaded: 1, keys expired: 0.
    814355:M 16 Apr 2025 15:30:35.173 * DB loaded from disk: 0.000 seconds
    814355:M 16 Apr 2025 15:30:35.173 * Ready to accept connections tcp
    

    Démarre le serveur Redis à l'aide d'un fichier de configuration spécifique et l'exécute en arrière-plan.

    $redis-server /redis/redis.conf &
    
  6. Créer un cluster Redis. Pour créer un cluster Redis à partir des trois serveurs Redis démarrés ci-dessus, exécutez la commande suivante à partir de Node1.

    # redis-cli --cluster create 10.0.0.151:6379 10.0.0.164:6379 10.0.0.205:6379 -a pass123
    
    output:
    
    >>> Performing hash slots allocation on 3 nodes...
    Master[0] -> Slots 0 - 5460
    Master[1] -> Slots 5461 - 10922
    Master[2] -> Slots 10923 - 16383
    
    M: a89cae61ea55xxxxxxxxxxx8ea31c70b0dc290 10.0.0.151:6379
       slots:[0-5460] (5461 slots) master
    M: b914e2031ceaxxxxxxxxxxxa6d7d5d67fa748 10.0.0.164:6379
       slots:[5461-10922] (5462 slots) master
    M: 9e71454df3f0cbexxxxxxxxxxx6ddc34177f7465 10.0.0.205:6379
       slots:[10923-16383] (5461 slots) master
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    

    Nous pouvons voir la clé de shard pour les noeuds :

    • Noeud 1 (10.0.0.151) 0-5460
    • Noeud 2 (10.0.0.164) 5461-10922
    • Noeud 3 (10.0.0.205) 10923-16383
  7. Connectez-vous au cluster Redis à l'aide de l'utilitaire client Redis et validez les noeuds du cluster.

    L'interface de ligne de commande Redis (également appelée redis-cli) est un programme de terminal qui envoie des commandes au serveur Redis et lit les réponses à partir de celui-ci. Redis-cli est installé automatiquement dans le cadre de l'installation de Redis.

    • Exécutez la commande $redis-cli -a pass123 -p 6379 -c pour vous connecter à l'hôte local.

    • Exécutez la commande $redis-cli -a pass123 -p 6379 -h 10.0.0.151 -c pour vous connecter à partir d'un emplacement distant.

    127.0.0.1:6379> cluster nodes
    
    b914e2031cea8bxxxxxxxxxxxe9a6d7d5d67fa748 10.0.0.164:6379@16379 master - 0 1740409776706 2 connected 5461-10922
    a89cae61ea553420c7xxxxxxxxxxx8ea31c70b0dc290 10.0.0.151:6379@16379 myself,master - 0 1740409775000 1 connected 0-5460
    9e71454df3f0cbvxxxxxxxxxxx46ddc34177f7465 10.0.0.205:6379@16379 master - 0 1740409776000 3 connected 10923-16383
    
    127.0.0.1:6379>
    
  8. Effectuez une opération DML (Data Manipulation Language) dans le cluster.

    Dans un environnement Redis Cluster, les données (opération de lecture/écriture) sont automatiquement redirigées vers le noeud approprié en fonction de l'emplacement de hachage dérivé de la clé de shard.

    $redis-cli -a pass123 -p 6379 -c
    
    127.0.0.1:6379> ping
    PONG
    
    127.0.0.1:6379> set name Dharmesh
    -> Redirected to slot [5798] located at 10.0.0.164:6379
    OK
    
    10.0.0.164:6379> set age 40
    -> Redirected to slot [741] located at 10.0.0.151:6379
    OK
    
    10.0.0.151:6379> set gender M
    -> Redirected to slot [15355] located at 10.0.0.205:6379
    OK
    
    127.0.0.1:6379> KEYS *
    1) "name"
    2) "age"
    3) "gender"
    >SAVE
    10.0.0.205:6379> exit
    

    Enregistrez pour assurer la persistance des données sur un cluster Redis sous /redis/dump.rdb. Vous pouvez utiliser des clichés de base de données Redis (RDB) ou des fichiers d'ajout uniquement (AOF). RDB crée des instantanés de la base de données en mémoire à des intervalles spécifiés, tandis que AOF enregistre toutes les opérations d'écriture, ce qui permet de reconstruire la base de données en cas d'échec.

Tâche 2 : configuration du cluster Redis cible dans le cache OCI

  1. Connectez-vous à la console OCI, accédez à Base de données, à Cache OCI et cliquez sur Clusters.

    image

  2. Sélectionnez le compartiment correspondant et cliquez sur Créer un cluster.

  3. Sélectionnez le nom, le créer dans le compartiment et la version du moteur de cache OCI du cluster.

    image

  4. Sélectionnez Mode de cluster, Nombre de shards, Noeud par shard et Mémoire par noeud.

    image

  5. Sélectionnez VCN et Sous-réseau.

    image

  6. Vérifiez et cliquez sur Créer un cluster.

    image

    Une fois le provisionnement du cluster OCI terminé, il doit ressembler à l'image suivante. Nous pouvons voir trois noeuds de cluster et une adresse privée.

    image

Tâche 3 : création d'une connexion au cluster de cache OCI

Le cache OCI est SaaS. Il n'y aura pas d'accès direct à l'hôte Redis. Pour nous connecter à OCI Cache, nous devons créer une instance Jump ou un hôte OCI Bastion sur le sous-réseau public pour un accès sécurisé aux clusters au sein du même VCN et du même sous-réseau.

image

Provisionner Bastion/Jump dans OCI

  1. Accédez à la console OCI, accédez à Identité et sécurité et cliquez sur Bastions.

  2. Sélectionnez le compartiment, le VCN, le sous-réseau, la liste d'autorisation de bloc CIDR et cliquez sur Créer un bastion.

    image

  3. Exécutez la commande suivante pour installer Redis sur l'hôte Jump.

    sudo su -
    mkdir /redis
    wget http://download.redis.io/redis-stable.tar.gz
    tar xvzf redis-stable.tar.gz
    cd redis-stable
    make redis-cli
    make BUILD_TLS=yes
    cp src/redis-cli /usr/local/bin/
    cp redis-server /usr/local/bin/
    $redis-cli -v
    
  4. Connectez-vous à l'un des noeuds du cluster à partir de l'hôte de saut et validez les noeuds.

    Connect Cluster Node1
    $redis-cli -h aaantxkdlyarjuuzfc5qgic3xdbxxxxxxxxxxxo6aj65pokndqtnwa-1-1.redis.us-ashburn-1.oci.oraclecloud.com --tls -c
    
    Connect Cluster Node2
    $redis-cli -h aaantxkdlyarjuuzfc5qgic3xxxxxxxxxxxxa5vo6aj65pokndqtnwa-2-1.redis.us-ashburn-1.oci.oraclecloud.com --tls -c
    
    Connect Cluster Node3
    $redis-cli -h aaantxkdlyarjuuzfc5qgic3xxxxxxxxxxxfeaa5vo6aj65pokndqtnwa-3-1.redis.us-ashburn-1.oci.oraclecloud.com --tls -c
    
    
    Validate OCI cluster Nodes:
    
    > cluster nodes
    b89bf86956a0ce19e6b4xxxxxxxxxxxcd41d0b78dd 10.0.15.21:6379@16379,aaantxkdlyarjuuzfc5qgicxxxxxxxxxxxvo6aj65pokndqtnwa-2-1.redis.us-ashburn-1.oci.oraclecloud.com master - 0 1740462307292 2 connected 5462-10922
    ba2253bcdb56f2e5227xxxxxxxxxxx9672cb527eab 10.0.5.150:6379@16379,aaantxkdlyarjuuzfc5qgic3xdbxxxxxxxxxxxvo6aj65pokndqtnwa-3-1.redis.us-ashburn-1.oci.oraclecloud.com master - 0 1740462305276 0 connected 10923-16383
    b59af7d22e86c5600xxxxxxxxxxxe17bf34ca5aab 10.0.61.100:6379@16379,aaantxkdlyarjuuzfc5qgicxxxxxxxxxxxa5vo6aj65pokndqtnwa-1-1.redis.us-ashburn-1.oci.oraclecloud.com myself,master - 0 1740462305000 1 connected 0-5461
    

    La clé de shard est visible :

    • Cluster-1 (1-1) 0-5461
    • Cluster-2 (2-1) 5462-10922
    • Cluster-3 (3-1) 5462-10922

Tâche 4 : migration des données d'un environnement sur site vers un cluster OCI à l'aide de l'utilitaire Pyredis-dump

  1. Installez l'utilitaire pyredis-dump sur l'hôte de saut/bastion.

    $cd /redis/
    $yum install git
    $git clone https://github.com/tkote/pyredis-dump.git
    $cd /redis/pyredis-dump
    $python -m pip install redis
    $python3 pyredis-dump.py -h
    
  2. Vérifiez la connexion au cluster Redis sur site à partir de l'hôte jump/bastion.

    [root@jump ~]# redis-cli -a pass123 -p 6379 -h 10.0.0.151 -c
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    10.0.0.151:6379>
    
    [root@jump ~]# redis-cli -a pass123 -p 6379 -h 10.0.0.164 -c
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    10.0.0.164:6379>
    
    [root@jump ~]# redis-cli -a pass123 -p 6379 -h 10.0.0.205 -c
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    10.0.0.205:6379>
    
  3. Exportez le fichier dump à partir du cluster source. Connectez-vous à chaque noeud maître Redis à partir de l'hôte de saut et créez un vidage distant. Le vidage sera créé sur l'hôte de saut à l'emplacement indiqué.

    1. Effectuez un vidage à partir du fichier maître Node1.

      # python3 pyredis-dump.py -H 10.0.0.151 dump -o /redis/dump/rdump1 -w pass123
      dumping to '/redis/dump/rdump1'
      connecting to {'db': 0, 'host': '10.0.0.151', 'port': 6379, 'ssl': None, 'password': 'pass123'}
      1 keys, bulk_size: 1000, watch_keys: False
      dumped 1 records
      elapsed time: 0.399 seconds
      
    2. Effectuez un vidage à partir du fichier maître Node2.

      # python3 pyredis-dump.py -H 10.0.0.164 dump -o /redis/dump/rdump2 -w pass123
      dumping to '/redis/dump/rdump2'
      connecting to {'db': 0, 'host': '10.0.0.164', 'port': 6379, 'ssl': None, 'password': 'pass123'}
      1 keys, bulk_size: 1000, watch_keys: False
      dumped 1 records
      elapsed time: 0.004 seconds
      
    3. Effectuez un vidage à partir du fichier maître Node3.

      # python3 pyredis-dump.py -H 10.0.0.205 dump -o /redis/dump/rdump3 -w pass123
      dumping to '/redis/dump/rdump3'
      connecting to {'db': 0, 'host': '10.0.0.205', 'port': 6379, 'ssl': None, 'password': 'pass123'}
      1 keys, bulk_size: 1000, watch_keys: False
      dumped 1 records
      elapsed time: 0.006 seconds
      
  4. Avant d'importer des données, nettoyez le cluster cible dans OCI Cache et assurez-vous qu'il n'y a aucune donnée dans l'un des noeuds du cluster.

    OCI Cluster Node1
    
    # redis-cli -h aaantxkdlyarjuuzfc5qgic3xdbckjxxxxxxxxxxxaj65pokndqtnwa-1-1.redis.us-ashburn-1.oci.oraclecloud.com --tls
    > flushall
    OK
    
    OCI Cluster Node2
    
    # redis-cli -h aaantxkdlyarjuuzfc5qgic3xdbckjxxxxxxxxxxxj65pokndqtnwa-2-1.redis.us-ashburn-1.oci.oraclecloud.com --tls
    > flushall
    OK
    
    OCI Cluster Node3
    
    # redis-cli -h aaantxkdlyarjuuzfc5qgic3xdbckjkxxxxxxxxxxx6aj65pokndqtnwa-3-1.redis.us-ashburn-1.oci.oraclecloud.com --tls
    > flushall
    OK
    
  5. Importez le fichier dump vers le cluster cible dans OCI Cache. Connectez-vous à chaque cluster OCI et importez le fichier dump vers le cluster respectif en fonction de la clé de shard de la source et de la cible. Le vidage d'export du fichier maître Node1 avec shard key 0-5460 doit être importé dans le fichier maître node1 du cluster cible, respectivement.

    Nous devons importer le fichier dump dans les étapes suivantes, sinon il échouera.

    1. Importez le fichier dump de Node1 vers OCI Cluster1-1.

      # python3 pyredis-dump.py -S -H aaantxkdlyarjuuzfxxxxxxxxxxxk5bfeaa5vo6aj65pokndqtnwa-1-1.redis.us-ashburn-1.oci.oraclecloud.com restore -i /redis/dump/rdump1
      restore from '/redis/dump/rdump1'
      connecting to {'db': 0, 'host': 'aaantxkdlyarjuuzfcxxxxxxxxxxxkjk5bfeaa5vo6aj65pokndqtnwa-1-1.redis.us-ashburn-1.oci.oraclecloud.com', 'port': 6379, 'ssl': True}
      restored 1 records
      elapsed time: 0.023 seconds
      
    2. Importez le fichier dump de Node2 vers OCI Cluster2-1.

      # python3 pyredis-dump.py -S -H aaantxkdlyarjuuzfc5xxxxxxxxxxxfeaa5vo6aj65pokndqtnwa-2-1.redis.us-ashburn-1.oci.oraclecloud.com restore -i /redis/dump/rdump2
      restore from '/redis/dump/rdump2'
      connecting to {'db': 0, 'host': 'aaantxkdlyarjuuzfc5xxxxxxxxxxxk5bfeaa5vo6aj65pokndqtnwa-2-1.redis.us-ashburn-1.oci.oraclecloud.com', 'port': 6379, 'ssl': True}
      restored 1 records
      elapsed time: 0.024 seconds
      
    3. Importez le fichier dump de Node3 vers OCI Cluster3-1.

      # python3 pyredis-dump.py -S -H aaantxkdlyarjuuzfc5qgixxxxxxxxxxxfeaa5vo6aj65pokndqtnwa-3-1.redis.us-ashburn-1.oci.oraclecloud.com restore -i /redis/dump/rdump3
      restore from '/redis/dump/rdump3'
      connecting to {'db': 0, 'host': 'aaantxkdlyarjuuzfc5xxxxxxxxxxx5bfeaa5vo6aj65pokndqtnwa-3-1.redis.us-ashburn-1.oci.oraclecloud.com', 'port': 6379, 'ssl': True}
      restored 1 records
      elapsed time: 0.030 seconds
      [root@instance-20250223-1032 pyredis-dump]#
      
  6. Validez les données dans OCI. Une fois les données importées sur chaque noeud de cluster, connectez-vous à n'importe quel noeud de cluster OCI et vérifiez les données.

    Connect Cluster Node1
    $redis-cli -h aaantxkdlyarjuuzfc5qgic3xdbckjk5bfxxxxxxxxxxx65pokndqtnwa-1-1.redis.us-ashburn-1.oci.oraclecloud.com --tls -c
    
    6379> get name
    -> Redirected to slot [5798] located at aaantxkdlyarjxxxxxxxxxxx3xdbckjk5bfeaa5vo6aj65pokndqtnwa-2-1.redis.us-ashburn-1.oci.oraclecloud.com:6379
    "Dharmesh"
    
    6379> get age
    -> Redirected to slot [741] located at aaantxkdlyarjuuxxxxxxxxxxxbckjk5bfeaa5vo6aj65pokndqtnwa-1-1.redis.us-ashburn-1.oci.oraclecloud.com:6379
    "40"
    
    6379> get gender
    -> Redirected to slot [15355] located at aaantxkdlyarjxxxxxxxxxxxxxdbckjk5bfeaa5vo6aj65pokndqtnwa-3-1.redis.us-ashburn-1.oci.oraclecloud.com:6379
    "M"
    
    6379>
    

Remerciements

Ressources de formation supplémentaires

Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à d'autres contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, visitez le site education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir la documentation produit, consultez le site Oracle Help Center.