Hinweis:

Redis-Cluster zu Oracle Cloud Infrastructure Cache migrieren

Einführung

Dieses Tutorial enthält einen schrittweisen Prozess zum Migrieren des in Shards unterteilten Redis-Clustercaches mit dem Tool pyredis-dump. pyredis-dump ist ein Python-basiertes Tool, das das Dumping und die Wiederherstellung von Redis-Daten vereinfacht. Das Verfahren gilt für eines der folgenden Migrationsszenarios:

Während sich dieses Tutorial hauptsächlich auf die Migration eines On-Premises-Redis-Clusters zu OCI ohne Master-Slave-Architektur konzentriert, kann derselbe Ansatz auch auf Umgebungen angewendet werden, die ein Redis-Master-Slave-Setup verwenden.

Was ist Redis?

Redis-Cluster - Definition

Redis Cluster bietet High Availability und horizontale Skalierung. Es teilt die Daten in Shards auf, die auf mehrere Knoten verteilt sind. Jedes Shard verfügt über einen primären Knoten und Replikate zur Fehlertoleranz. Dadurch kann Redis Cluster größere Datasets und einen höheren Schreibdurchsatz verarbeiten.

Die folgende Abbildung zeigt ein Cluster mit 3 Knoten, das 3 Knoten als primär enthält (M1, M2 und M3), wobei jeder Knoten einen Slave als (S1, S2 und S3) aufweist. Die Slave-Konfiguration ist optional, um eine höhere Verfügbarkeit bereitzustellen.

image

Redis Cluster verwendet kein konsistentes Hashing, sondern eine andere Form des Shardings, bei der jeder Schlüssel konzeptionell Teil von dem ist, was wir einen Hash-Slot nennen. Es gibt 16384 Hash-Slots in Redis Cluster. Jeder Knoten in einem Redis-Cluster ist für eine Teilmenge der Hash Slots verantwortlich. Beispiel: Sie haben ein Cluster mit 3 Knoten, wobei:

Was ist OCI Cache?

image

Ziele

Voraussetzungen

Aufgabe 1: Quell-Redis-Cluster in einem On-Premise-Setup einrichten

  1. Konfigurieren Sie On-Premise-Hosts. Erstellen Sie mit RHEL8 drei On-Premise-VMs (VMs) oder einen physischen Host.

    • Redis_Node1: 10.0.0.151
    • Redis_Node2: 10.0.0.164
    • Redis_Node3: 10.0.0.205
  2. Öffnen Sie den Port auf allen Knoten.

    Für jeden Redis-Clusterknoten müssen je nach Konfiguration 1 bis 3 TCP-Verbindungen geöffnet sein. Der normale Redis-TCP-Port, mit dem Clients bedient werden, z.B. 6379, sowie der Port, der durch Hinzufügen von 10000 zum Datenport erhalten wird, also 16379 für Cluster und 26379 für Sentinel. Stellen Sie sicher, dass Sie alle Ports in Ihrer Firewall öffnen. Andernfalls können Redis-Clusterknoten nicht kommunizieren. Führen Sie die folgenden Befehle aus.

    $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. Installieren Sie die Redis-Software auf allen Knoten. Führen Sie den folgenden Befehl aus, um die neueste Redis Community Edition 7.4 für RHEL8 herunterzuladen. Installieren Sie die Redis-Software auf allen drei Knoten mit dem Root-Benutzer.

    $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. Bereiten Sie die Redis-Konfigurationsdatei auf allen Knoten vor.

    Es wird empfohlen, ein Redis-Cluster mit drei Knoten mit mindestens einem Replikat (Slave) pro Master und Sentinel für High Availability einzurichten. In diesem Beispiel haben wir drei Knotencluster ohne Replikate erstellt. Um ein Redis-Cluster zu konfigurieren, müssen wir die Clusterkonfigurationsdatei redis.conf auf allen drei Knoten unter dem Ordner /redis vorbereiten.

    $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. Starten Sie den Redis-Server auf allen Knoten. Führen Sie den folgenden Befehl aus, um den Redis-Server auf allen drei Knoten zu starten.

    [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
    

    Startet den Redis-Server mit einer bestimmten Konfigurationsdatei und führt sie im Hintergrund aus.

    $redis-server /redis/redis.conf &
    
  6. Redis-Cluster erstellen. Um ein Redis-Cluster aus allen drei oben gestarteten Redis-Servern zu erstellen, führen Sie den folgenden Befehl von Node1 aus.

    # 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.
    

    Der Shard-Schlüssel für Knoten wird angezeigt:

    • Node-1 (10.0.0.151) 0-5460
    • Node-2 (10.0.0.164) 5461-10922
    • Node-3 (10.0.0.205) 10923-16383
  7. Stellen Sie mit dem Redis-Clientutility eine Verbindung zum Redis-Cluster her, und validieren Sie die Clusterknoten.

    Die Redis-Befehlszeilenschnittstelle (auch als redis-cli bezeichnet) ist ein Terminalprogramm, das Befehle an den Redis-Server sendet und Antworten vom Redis-Server liest. Redis-cli wird im Rahmen der Redis-Installation automatisch installiert.

    • Führen Sie den Befehl $redis-cli -a pass123 -p 6379 -c aus, um eine Verbindung zum lokalen Host herzustellen.

    • Führen Sie den Befehl $redis-cli -a pass123 -p 6379 -h 10.0.0.151 -c aus, um eine Remoteverbindung herzustellen.

    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. Data Manipulation Language-(DML-)Operation im Cluster ausführen

    In einer Redis Cluster-Umgebung werden Daten (Lese-/Schreibvorgang) basierend auf dem aus dem Shard-Schlüssel abgeleiteten Hash-Slot automatisch an den entsprechenden Knoten umgeleitet.

    $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
    

    Speichern Sie, um die Datenpersistenz in einem Redis-Cluster unter /redis/dump.rdb sicherzustellen, können Sie entweder Redis-Datenbank-(RDB-)Snapshots oder Nur-Anhangsdateien (AOF) verwenden. RDB erstellt Snapshots der In-Memory-Datenbank in bestimmten Intervallen, während AOF alle Schreibvorgänge aufzeichnet, sodass die Datenbank bei einem Fehler rekonstruiert werden kann.

Aufgabe 2: Ziel-Redis-Cluster in OCI-Cache einrichten

  1. Melden Sie sich bei der OCI-Konsole an, navigieren Sie zu Datenbank, OCI-Cache, und klicken Sie auf Cluster.

    image

  2. Wählen Sie das entsprechende Compartment aus, und klicken Sie auf Cluster erstellen.

  3. Wählen Sie Name des Clusters, Erstellen in Compartment und OCI-Cache-Engine-Version aus.

    image

  4. Wählen Sie Clustermodus, Shard-Anzahl, Knoten pro Shard und Speicher pro Knoten aus.

    image

  5. Wählen Sie VCN und Subnetz aus.

    image

  6. Prüfen Sie das Cluster, und klicken Sie auf Cluster erstellen.

    image

    Sobald das OCI-Cluster-Provisioning abgeschlossen ist, sollte es wie das folgende Image aussehen. Es werden drei Clusterknoten und ein privater Endpunkt angezeigt.

    image

Aufgabe 3: Verbindung zum OCI-Cachecluster erstellen

OCI-Cache ist SaaS. Es gibt keinen direkten Zugriff auf den Redis-Host. Um eine Verbindung zu OCI Cache herzustellen, müssen Sie eine Jump-Instanz oder einen OCI-Bastion-Host im öffentlichen Subnetz erstellen, um sicheren Zugriff auf Cluster innerhalb desselben VCN und Subnetzes zu erhalten.

image

Bastion/Jump in OCI bereitstellen

  1. Gehen Sie zur OCI-Konsole, navigieren Sie zu Identität und Sicherheit, und klicken Sie auf Bastionen.

  2. Wählen Sie Compartment, VCN, Subnetz und CIDR-Blockausnahmeliste aus, und klicken Sie auf Bastion erstellen.

    image

  3. Führen Sie den folgenden Befehl aus, um Redis auf dem Jump-Host zu installieren.

    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. Stellen Sie vom Jump-Host aus eine Verbindung zu einem der Clusterknoten her, und validieren Sie Knoten.

    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
    

    Der Shard-Schlüssel wird angezeigt:

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

Aufgabe 4: Daten mit dem Utility Pyredis-dump von On Premise zu OCI-Cluster migrieren

  1. Installieren Sie das Dienstprogramm pyredis-dump auf dem 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. Prüfen Sie die Verbindung zum On-Premise-Redis-Cluster vom 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. Exportieren Sie den Dump aus dem Quellcluster. Stellen Sie eine Verbindung zu jedem Redis-Masterknoten vom Jump-Host her, und erstellen Sie einen Remote-Dump. Dump wird auf dem Jump-Host am angegebenen Ort erstellt.

    1. Nehmen Sie den Dump von Master 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. Nehmen Sie den Dump von Master 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. Nehmen Sie den Dump von Master 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. Bereinigen Sie vor dem Importieren von Daten das Zielcluster in OCI Cache, und stellen Sie sicher, dass sich auf keinem der Clusterknoten Daten befinden.

    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. Dump in Zielcluster in OCI-Cache importieren. Stellen Sie eine Verbindung zu jedem OCI-Cluster her, und importieren Sie den Dump basierend auf dem Shard-Schlüssel von Quelle und Ziel in das jeweilige Cluster. Exportdump von Master Node1 mit shard key 0-5460 muss in Master node1 des Zielclusters importiert werden.

    Wir müssen den Dump in den folgenden Schritten importieren, sonst schlägt er fehl.

    1. Importieren Sie den Dump von Node1 in 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. Importieren Sie den Dump von Node2 in 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. Importieren Sie den Dump von Node3 in 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. Daten in OCI validieren. Nachdem die Daten erfolgreich auf jedem Clusterknoten importiert wurden, stellen Sie eine Verbindung zu einem beliebigen OCI-Clusterknoten her, und prüfen Sie die Daten.

    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>
    

Danksagungen

Weitere Lernressourcen

Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie im Oracle Learning YouTube-Channel auf weitere kostenlose Lerninhalte zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.

Die Produktdokumentation finden Sie im Oracle Help Center.