Observação:

Migrar o Redis Cluster para o Oracle Cloud Infrastructure Cache

Introdução

Este tutorial fornece um processo passo a passo para migrar o cache do Cluster Redis com sharding usando a ferramenta pyredis-dump. pyredis-dump é uma ferramenta baseada em Python projetada para simplificar o dumping e a restauração de dados do Redis. O procedimento se aplica a um dos seguintes cenários de migração:

Embora este tutorial se concentre principalmente na migração de um Cluster Redis on-premises para a OCI sem uma arquitetura master-slave, a mesma abordagem também pode ser aplicada a ambientes que usam uma configuração master-slave Redis.

O que é o Redis?

O que é o Cluster Redis?

O Redis Cluster oferece alta disponibilidade e dimensionamento horizontal. Ele divide os dados em shards, distribuídos entre vários nós. Cada shard tem um nó primário e réplicas para tolerância a falhas. Isso permite que o Redis Cluster lide com conjuntos de dados maiores e maior throughput de gravação.

A imagem a seguir mostra um cluster de 3 nós contendo 3 nós como principal (M1, M2 e M3), com cada nó tendo subordinado como (S1, S2 e S3). A configuração do subordinado é opcional para fornecer mais alta disponibilidade.

image

O Redis Cluster não usa hashing consistente, mas uma forma diferente de sharding, onde cada chave é conceitualmente parte do que chamamos de slot de hash. Existem 16384 slots de hash no Redis Cluster. Cada nó em um Cluster Redis é responsável por um subconjunto dos slots de hash; portanto, por exemplo, você pode ter um cluster com 3 nós, em que:

O que é o OCI Cache?

image

Objetivos

Pré-requisitos

Tarefa 1: Configurar Cluster Redis de Origem em uma Configuração Local

  1. Configure hosts locais. Crie três máquinas virtuais (VMs) locais ou host físico usando RHEL8.

    • Redis_Node1: 10.0.0.151
    • Redis_Node2: 10.0.0.164
    • Redis_Node3: 10.0.0.205
  2. Abra a porta em todos os nós.

    Cada nó do Cluster Redis requer de 1 a 3 conexões TCP abertas com base na configuração. A porta TCP Redis normal usada para atender clientes, por exemplo, 6379, mais a porta obtida pela adição de 10000 à porta de dados, portanto, 16379 para cluster e 26379 para Sentinel. Certifique-se de abrir todas as portas em seu firewall; caso contrário, os nós do cluster Redis não poderão se comunicar. Execute os comandos a seguir.

    $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 o software Redis em todos os nós. Execute o comando a seguir para fazer download do Redis Community Edition 7.4 mais recente para RHEL8. Instale o software Redis em todos os três nós usando o usuário 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 o arquivo de configuração Redis em todos os nós.

    Recomenda-se configurar um Cluster Redis de três nós com pelo menos uma réplica (subordinada) por mestre e Sentinel para alta disponibilidade. Neste exemplo, criamos três clusters de nós sem réplicas. Para configurar um Cluster Redis, temos que preparar o arquivo de configuração do cluster chamado redis.conf em todos os três nós na pasta /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 o servidor Redis em todos os nós. Execute o comando a seguir para iniciar o servidor Redis em todos os três nós.

    [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 o servidor Redis usando um arquivo de configuração específico e o executa em segundo plano.

    $redis-server /redis/redis.conf &
    
  6. Criar Cluster Redis. Para criar um Cluster Redis de todos os três servidores Redis iniciados acima, execute o comando a seguir em 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 a Chave de Compartilhamento para nós:

    • Nó-1 (10.0.0.151) 0-5460
    • Nó-2 (10.0.0.164) 5461-10922
    • Nó-3 (10.0.0.205) 10923-16383
  7. Conecte-se ao Cluster Redis usando o utilitário cliente Redis e valide os nós do cluster.

    A interface de linha de comando Redis (também conhecida como redis-cli) é um programa de terminal que envia comandos e lê respostas do servidor Redis. O Redis-cli é instalado automaticamente como parte da instalação do Redis.

    • Execute o comando $redis-cli -a pass123 -p 6379 -c para estabelecer conexão com o host local.

    • Execute o comando $redis-cli -a pass123 -p 6379 -h 10.0.0.151 -c para estabelecer conexão do controle 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. Execute a operação Data Manipulation Language (DML) no cluster.

    Em um ambiente de Cluster Redis, os dados (operação de leitura/gravação) são redirecionados automaticamente para o nó apropriado com base no slot de hash derivado da chave 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
    

    Salve para garantir a persistência de dados em um Cluster Redis em /redis/dump.rdb, você pode usar snapshots do Banco de Dados Redis (RDB) ou AOF (Anexar Arquivos Somente). O RDB cria snapshots do banco de dados na memória em intervalos especificados, enquanto o AOF registra todas as operações de gravação, permitindo a reconstrução do banco de dados em caso de falha.

Tarefa 2: Configurar o Cluster Redis de Destino no Cache do OCI

  1. Faça log-in na Console do OCI, navegue até Database, OCI Cache e clique em Clusters.

    image

  2. Selecione o respectivo compartimento e clique em Criar Cluster.

  3. Selecione o Nome do cluster, Criar no compartimento e a versão do mecanismo de Cache do OCI.

    image

  4. Selecione Modo de cluster, Contagem de shards, Nó por Shard e Memória por nó.

    image

  5. Selecione VCN e Sub-rede.

    image

  6. Verifique e clique em Criar cluster.

    image

    Depois que o provisionamento do cluster do OCI for concluído, ele deverá se parecer com a imagem a seguir. Podemos ver três nós de cluster e Ponto final privado.

    image

Tarefa 3: Criar Conexão com o Cluster de Cache do OCI

O OCI Cache é SaaS; não haverá acesso direto ao host Redis. Para estabelecer conexão com o OCI Cache, precisamos criar uma instância de salto ou um host do OCI Bastion na sub-rede pública para acesso seguro a clusters dentro da mesma VCN e sub-rede.

image

Provisionar Bastion/Jump no OCI

  1. Vá para a Console do OCI, navegue até Identidade e Segurança e clique em Bastions.

  2. Selecione compartimento, VCN, sub-rede, lista de permissões de blocos CIDR e clique em Criar bastion.

    image

  3. Execute o comando a seguir para instalar o Redis no jump host.

    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. Conecte-se a um dos nós de cluster do jump host e valide os nós.

    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
    

    Podemos ver a Chave de Compartilhamento:

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

Tarefa 4: Migrar Dados do On-Premises para o cluster do OCI usando o Utilitário Pyredis-dump

  1. Instale o utilitário pyredis-dump no host jump/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. Verifique a conexão com o cluster Redis local do jump/bastion host.

    [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. Exportar dump do cluster de origem. Conecte-se a cada nó mestre Redis do jump host e crie um dump remoto. O dump será criado no jump host no local especificado.

    1. Faça dump do mestre 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. Faça dump do mestre 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. Faça dump do mestre 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 dados, limpe o cluster de destino no OCI Cache e certifique-se de que não haja dados em nenhum dos nós do 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. Importar dump para o cluster de destino no OCI Cache. Conecte-se a cada cluster do OCI e importe o dump para o respectivo cluster com base na Chave de shard da origem e do destino. O dump de exportação do mestre Node1 que tem shard key 0-5460 deve ser importado para o mestre node1 do cluster de destino, respectivamente.

    Precisamos importar o dump nas etapas a seguir; caso contrário, ele falhará.

    1. Importar dump de Node1 para o 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. Importar dump de Node2 para o 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. Importar dump de Node3 para o 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. Validar dados no OCI. Depois que os dados forem importados com sucesso em cada nó do cluster, conecte-se a qualquer nó do cluster do OCI e verifique os dados.

    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>
    

Confirmações

Mais Recursos de Aprendizagem

Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.

Para obter a documentação do produto, visite o Oracle Help Center.