Note:

Migrar cluster de Redis a Oracle Cloud Infrastructure Cache

Introducción

En este tutorial se proporciona un proceso paso a paso para migrar la caché de cluster de Redis con particiones horizontales mediante la herramienta pyredis-dump. pyredis-dump es una herramienta basada en Python diseñada para simplificar el volcado y la restauración de datos de Redis. El procedimiento se aplica a cualquiera de los siguientes escenarios de migración:

Aunque este tutorial se centra principalmente en la migración de un cluster de Redis local a OCI sin una arquitectura maestro-esclavo, el mismo enfoque también se puede aplicar a entornos que utilizan una configuración maestro-esclavo de Redis.

¿Qué es Redis?

¿Qué es Redis Cluster?

El cluster de Redis proporciona alta disponibilidad y escalado horizontal. Divide los datos en particiones horizontales, distribuidas en varios nodos. Cada partición horizontal tiene un nodo principal y réplicas para tolerancia a fallos. Esto permite al cluster de Redis manejar juegos de datos más grandes y un mayor rendimiento de escritura.

En la siguiente imagen se muestra un cluster de 3 nodos que contiene 3 nodos como principales (M1, M2 y M3) con cada nodo como esclavo (S1, S2 y S3). La configuración de esclavos es opcional para proporcionar más alta disponibilidad.

image

Redis Cluster no utiliza hash consistente, sino una forma diferente de fragmentación donde cada clave es conceptualmente parte de lo que llamamos una ranura hash. Hay 16384 ranuras hash en el cluster de Redis. Cada nodo de un cluster de Redis es responsable de un subjuego de ranuras hash, por lo que, por ejemplo, puede tener un cluster con 3 nodos, donde:

¿Qué es OCI Cache?

image

Objetivos

Requisitos

Tarea 1: Configuración del cluster de Redis de origen en una configuración local

  1. Configurar hosts locales. Cree tres máquinas virtuales (VM) locales o un host físico mediante RHEL8.

    • Redis_Node1: 10.0.0.151
    • Redis_Node2: 10.0.0.164
    • Redis_Node3: 10.0.0.205
  2. Abra el puerto en todos los nodos.

    Cada nodo de Redis Cluster requiere de 1 a 3 conexiones TCP abiertas según la configuración. Puerto TCP Redis normal utilizado para servir a los clientes, por ejemplo 6379, más el puerto obtenido agregando 10000 al puerto de datos, por lo que 16379 para el cluster y 26379 para Sentinel. Asegúrese de abrir todos los puertos del firewall; de lo contrario, los nodos del cluster de Redis no podrán comunicarse. Ejecute los siguientes comandos.

    $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. Instale el software Redis en todos los nodos. Ejecute el siguiente comando para descargar la última versión de Redis Community Edition 7.4 para RHEL8. Instale el software Redis en los tres nodos mediante el usuario 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. Prepare el archivo de configuración de Redis en todos los nodos.

    Se recomienda configurar un cluster de Redis de tres nodos con al menos una réplica (esclavo) por maestro y Sentinel para una alta disponibilidad. En este ejemplo, hemos creado tres clusters de nodos sin réplicas. Para configurar un cluster de Redis, tenemos que preparar el archivo de configuración de cluster denominado redis.conf en los tres nodos de la carpeta /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. Inicie el servidor Redis en todos los nodos. Ejecute el siguiente comando para iniciar el servidor Redis en los tres nodos.

    [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
    

    Inicia el servidor de Redis con un archivo de configuración específico y lo ejecuta en segundo plano.

    $redis-server /redis/redis.conf &
    
  6. Crear cluster de Redis. Para crear un cluster de Redis a partir de los tres servidores de Redis iniciados anteriormente, ejecute el siguiente comando desde 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.
    

    Podemos ver la clave de partición horizontal para los nodos:

    • Nodo 1 (10.0.0.151) 0-5460
    • Nodo 2 (10.0.0.164) 5461-10922
    • Nodo 3 (10.0.0.205) 10923-16383
  7. Conéctese al cluster de Redis mediante la utilidad de cliente de Redis y valide los nodos del cluster.

    La interfaz de línea de comandos Redis (también conocida como redes-cli) es un programa de terminal que envía comandos y lee respuestas desde el servidor Redis. Redis-cli se instala automáticamente como parte de la instalación de Redis.

    • Ejecute el comando $redis-cli -a pass123 -p 6379 -c para conectarse al host local.

    • Ejecute el comando $redis-cli -a pass123 -p 6379 -h 10.0.0.151 -c para conectarse desde remoto.

    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. Realice la operación de lenguaje de manipulación de datos (DML) en el cluster.

    En un entorno de Redis Cluster, los datos (operación de lectura/escritura) se redirigen automáticamente al nodo adecuado según la ranura hash derivada de la clave de partición horizontal.

    $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
    

    Guarde para garantizar la persistencia de los datos en un cluster de Redis en /redis/dump.rdb. Puede utilizar instantáneas de Redis Database (RDB) o archivos de solo adición (AOF). RDB crea instantáneas de la base de datos en memoria en intervalos especificados, mientras que AOF registra todas las operaciones de escritura, lo que permite la reconstrucción de la base de datos en caso de fallo.

Tarea 2: Configuración del cluster de Redis de destino en la caché de OCI

  1. Conéctese a la consola de OCI, vaya a Base de datos, Caché de OCI y haga clic en Clusters.

    image

  2. Seleccione el compartimento correspondiente y haga clic en Crear cluster.

  3. Seleccione Nombre, Crear en compartimento y Versión de motor de caché de OCI del cluster.

    image

  4. Seleccione Modo de cluster, Recuento de particiones horizontales, Nodo por partición horizontal y Memoria por nodo.

    image

  5. Seleccione VCN y Subred.

    image

  6. Revise y haga clic en Crear cluster.

    image

    Una vez completado el aprovisionamiento del cluster de OCI, debería parecerse a la siguiente imagen. Podemos ver tres nodos de cluster y punto final privado.

    image

Tarea 3: Crear conexión al cluster de caché de OCI

OCI Cache es SaaS, no habrá acceso directo al host Redis. Para conectarse a la caché de OCI, necesitamos crear una instancia de salto o un host de OCI Bastion en la subred pública para un acceso seguro a los clusters dentro de la misma VCN y subred.

image

Aprovisionar bastión/salto en OCI

  1. Vaya a la consola de OCI, vaya a Identity & Security y haga clic en Bastions.

  2. Seleccione el compartimento, la VCN, la subred, la lista de permitidos de bloques de CIDR y haga clic en Crear bastión.

    image

  3. Ejecute el siguiente comando para instalar Redis en el host de salto.

    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. Conéctese a cualquiera de los nodos del cluster desde el host de salto y valide los nodos.

    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
    

    Puede ver la clave de partición horizontal:

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

Tarea 4: Migración de datos del entorno local al cluster de OCI mediante la utilidad de volcado de pirés

  1. Instale la utilidad pyredis-dump en el host de salto/bastión.

    $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. Compruebe la conexión al cluster de Redis local desde el host de salto o bastión.

    [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. Exporte el volcado del cluster de origen. Conéctese a cada nodo maestro de Redis desde el host de salto y cree un volcado remoto. El volcado se creará en el host de salto en la ubicación especificada.

    1. Realice el volcado del maestro 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. Realice el volcado del maestro 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. Realice el volcado del maestro 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. Antes de importar datos, limpie el cluster de destino en OCI Cache y asegúrese de que no haya datos en ninguno de los nodos de 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. Importe el volcado al cluster de destino en OCI Cache. Conéctese a cada cluster de OCI e importe el volcado en el cluster correspondiente según la clave de partición horizontal del origen y el destino. El volcado de exportación del maestro Node1 que tiene shard key 0-5460 se debe importar al maestro node1 del cluster de destino, respectivamente.

    Necesitamos importar el volcado en los siguientes pasos; de lo contrario, fallará.

    1. Importe el volcado de Node1 a 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. Importe el volcado de Node2 a 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. Importe el volcado de Node3 a 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. Valida los datos en OCI. Una vez que los datos se hayan importado correctamente en cada nodo de cluster, conéctese a cualquier nodo de cluster de OCI y compruebe los datos.

    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>
    

Agradecimientos

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de formación gratuita en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de Oracle Learning.

Para obtener documentación sobre el producto, visite Oracle Help Center.