Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Einführung in Redis Cluster Sharding – Vorteile, Einschränkungen, Bereitstellung und Clientverbindungen

Redis Cluster ist die in Redis verfügbare native Sharding-Implementierung, mit der Sie Ihre Daten automatisch auf mehrere Knoten verteilen können, ohne sich auf externe Tools und Dienstprogramme verlassen zu müssen. Bei ScaleGrid haben wir kürzlich Unterstützung für Redis™*-Cluster auf unserer vollständig verwalteten Plattform durch unsere Hosting für Redis™-Pläne hinzugefügt. In diesem Beitrag stellen wir Ihnen die erweiterten Sharding-Möglichkeiten von Redis-Clustern vor, erörtern ihre Vor- und Nachteile, wann Sie sie bereitstellen sollten und wie Sie eine Verbindung zu Ihrem Redis-Cluster herstellen.

Sharding mit Redis-Cluster

Der gesamte Schlüsselraum in Redis-Clustern ist in 16384 Slots (Hash-Slots genannt) unterteilt, und diese Slots sind mehreren Redis-Knoten zugewiesen. Ein bestimmter Schlüssel wird einem dieser Slots zugeordnet, und der Hash-Slot für einen Schlüssel wird wie folgt berechnet:

HASH_SLOT =CRC16(Schlüssel) mod 16384

Multi-Key-Operationen werden auf Redis-Clustern unterstützt, solange alle Schlüssel, die an einer einzelnen Befehlsausführung beteiligt sind, zum selben Hash-Slot gehören. Dies kann durch das Konzept der Hashtags sichergestellt werden.

Die Redis-Cluster-Spezifikation ist der endgültige Leitfaden zum Verständnis der Interna der Technologie, während das Redis-Cluster-Tutorial Bereitstellungs- und Verwaltungsrichtlinien bereitstellt.

Vorteile

Sehen Sie sich die wichtigsten Vorteile von Redis-Clustern an, um zu sehen, wie Ihre Bereitstellungen davon profitieren können:

  • Hochleistung

    Redis Cluster verspricht das gleiche Leistungsniveau wie eigenständige Redis-Bereitstellungen.

  • Hohe Verfügbarkeit

    Redis-Cluster unterstützt die standardmäßige Redis-Master-Replikat-Konfiguration, um eine hohe Verfügbarkeit und Dauerhaftigkeit sicherzustellen. Es implementiert auch einen Raft-ähnlichen Konsensansatz, um die Verfügbarkeit des gesamten Clusters sicherzustellen.

  • Horizontale und vertikale Skalierbarkeit

    Das Hinzufügen oder Entfernen neuer Redis-Knoten aus dem Cluster kann transparent und ohne Ausfallzeit erfolgen. Dies macht das Hinzufügen und Entfernen von Shards, das Zurückziehen oder Skalieren einzelner Knoten einfach.

  • Native Lösung

    Für die Bereitstellung von Redis-Clustern sind keine externen Proxys oder Tools erforderlich, sodass Sie keine neuen Tools erlernen oder sich um sie kümmern müssen. Es bietet auch nahezu vollständige Kompatibilität mit eigenständigen Redis-Bereitstellungen.

Einschränkungen

Beachten Sie auch die Einschränkungen, um sicherzustellen, dass es für Ihre Bereitstellung geeignet ist:

  • Kundenunterstützung erforderlich

    Clients müssen Änderungen vornehmen, um Redis-Cluster zu unterstützen. Obwohl es Redis-Cluster schon seit vielen Jahren gibt, gibt es immer noch Clients, die es nicht unterstützen. Sehen Sie in der Redis-Clientdokumentation nach, um sicherzustellen, dass der von Ihnen verwendete Client unterstützt wird, bevor Sie sich für die Bereitstellung von Redis-Clustern entscheiden.

  • Eingeschränkte Unterstützung für Mehrtastenbedienung

    Wie im vorherigen Abschnitt erwähnt, werden Mehrtastenoperationen nur unterstützt, wenn alle Tasten in einer einzigen Operation zum selben Steckplatz gehören. Darauf sollten Sie beim Entwerfen Ihrer Datenstrukturen achten.

  • Unterstützt nur eine Datenbank

    Im Gegensatz zu eigenständigen Datenbanken unterstützen Redis-Cluster nur eine Datenbank (Datenbank 0), und der SELECT-Befehl ist nicht zulässig. Da die meisten Menschen nicht mehrere Datenbanken verwenden, stellt dies auch keine große Einschränkung dar.

Wann sollten Sie einen Redis-Cluster bereitstellen?

Die Redis-Cluster-Lösung kann gut zu Ihnen passen, wenn Sie eine Redis-Shard-Lösung benötigen. Redis Cluster ist eine native Lösung, die einfach ist und eine hervorragende Leistung bietet.

In der Regel beginnen Benutzer mit dem Sharding ihrer Redis-Bereitstellungen, wenn sie damit begonnen haben, einen eigenständigen Redis-Knoten mit Schreibvorgängen zu sättigen, und Schreibvorgänge auf mehrere Knoten verteilen möchten. Obwohl Redis in erster Linie Single-Threading ist, wird E/A in der Regel netzwerk- oder speichergebunden auf einem eigenständigen Gerät, bevor es die CPU sättigen kann. Speicherbeschränkungen können bis zu einem gewissen Grad überwunden werden, indem man einem Standalone-System mehr Speicher hinzufügt, aber ab einem bestimmten Punkt wird es in Bezug auf Kosten, Sicherung, Neustart, Aufwärmzeiten usw. unerschwinglich.

Wenn Sie andererseits Ihren Lesevorgang nur auf mehrere Knoten verteilen möchten, ist es viel einfacher, nur Lesereplikate zum Standalone hinzuzufügen.

Im Vergleich zu anderen Sharding-Lösungen für Redis ist die Shard-Neuverteilung in Redis-Clustern für Anwendungen transparent. Dies macht es sehr einfach, Shards hinzuzufügen oder zu entfernen, ohne die Anwendung zu beeinträchtigen.

Einführung in #Redis Cluster Sharding – Vorteile, Einschränkungen, Zeitpunkt der Bereitstellung und ClientverbindungenClick To Tweet

Verbindung zu einem Redis-Cluster herstellen

Wenn Sie sich für die Bereitstellung eines Redis™-Clusters mit ScaleGrid entscheiden, erhalten Sie eine Redis-Cluster-Bereitstellung mit vollem Funktionsumfang, die vollständig mit der Standardversion kompatibel ist.

Wenn Sie gerade erst anfangen, melden Sie sich für eine kostenlose 30-tägige Testversion in der ScaleGrid-Konsole an und sehen Sie sich diese Dokumentation zum Erstellen Ihrer ersten ScaleGrid for Redis™-Bereitstellung an.

Sie benötigen Folgendes, um sich mit dem Redis™-Cluster bei ScaleGrid zu verbinden:

  • Liste der Knotennamen
  • Anschlüsse
  • Authentifizierungszeichenfolge

Die Registerkarte "Übersicht" Ihrer Redis™-Bereitstellungsdetailseite enthält die Liste der Master jedes Shards zusammen mit Portnummern und Authentifizierungsinformationen:

Alternativ ist die Liste aller Knoten des Clusters auf der Registerkarte Maschinen verfügbar:

Wie Sie vielleicht bemerkt haben, sind nicht viele Beispiele verfügbar, die Ihnen zeigen, wie Sie eine Verbindung zu einem authentifizierungsfähigen Redis™-Cluster herstellen, der online verfügbar ist. Hier sind einige Beispiele, die einige davon verwenden die beliebten Kunden.

Verbindung mit Java

Unter den beliebten Redis-Java-Clients unterstützen Jedis und Lettuce Redis™-Cluster. Wir nehmen Jedis für unser Beispiel.

Jedis

Redis™ Cluster-Verbindungen werden vom JedisCluster abstrahiert Klasse. Die besten Beispiele für die Verwendung dieser Klasse zum Herstellen einer Verbindung mit Redis™-Clustern finden Sie in den Jedis-Tests, Jedis-Quellcode. Leider ist zu diesem Zeitpunkt, wenn die Authentifizierung angegeben ist, der JedisCluster Konstruktor ist nicht sehr sauber. Hier ist ein Beispiel, das 100 Schlüssel in den Redis™-Cluster schreibt. Beachten Sie, dass die Schlüssel, da sie nicht getaggt sind, in verschiedenen Slots auf verschiedenen Knoten landen:

...
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
...

public class RedisClusterModeTest {
    public static final int    DEFAULT_TIMEOUT      = 5000;
    public static final int    DEFAULT_REDIRECTIONS = 5;

    public static void main(String[] args) {
        Set jedisClusterNodes = new HashSet();
        jedisClusterNodes.add(new HostAndPort("SG-example-1.servers.scalegrid.io, 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-2.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-3.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-4.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-5.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-6.servers.scalegrid.io", 6379));

        JedisCluster jedis = new JedisCluster(jedisClusterNodes, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_REDIRECTIONS, <auth>, new JedisPoolConfig());
        for (int i = 0; i < 100; i++) {
            jedis.set("key" + i, "value" + i);
        }
        jedis.close();
    }
}

Die Argumente für den Konstruktor sind in der Jedis-API-Dokumentation dokumentiert. Wir empfehlen, dass Sie alle Knoten des Clusters während der Clustererstellung mit Jedis angeben.

Verbindung mit Ruby

Der beliebteste Redis-Client in Ruby ist redis-rb. Es unterstützt auch Redis™-Cluster, daher verwenden wir es in unserem Beispiel.

Redis-rb

redis-rb-Versionen 4.1.0 und höher unterstützen Redis™-Cluster. Der 'Cluster' Die Option muss während der Verbindungsinitialisierung angegeben werden, und Sie können sich auf diese Dokumentation für die genaue Semantik beziehen. Hier ist das gleiche Programm wie im obigen Java-Beispiel in Ruby:

require 'redis'
require 'pp'

NODES = ["redis://SG-example-1.servers.scalegrid.io:6379",
         "redis://SG-example-2.servers.scalegrid.io:6379",
         "redis://SG-example-3.servers.scalegrid.io:6379",
         "redis://SG-example-4.servers.scalegrid.io:6379",
         "redis://SG-example-5.servers.scalegrid.io:6379",
         "redis://SG-example-6.servers.scalegrid.io:6379"]
begin
    pp "Attempting connection..."
    redis = Redis.new(cluster: NODES, password: <auth>)
    100.times { |i| redis.set("key#{i}", "value#{i}") }
    pp "Done..."
    redis.close
rescue StandardError => e
    puts e.message
end

Verbindung mit Node.js

Node_redis ist der beliebteste Redis-Client in Node.js. Redis™-Cluster werden jedoch noch nicht offiziell unterstützt. ioredis ist ein weiterer beliebter Redis-Client, der Redis™-Cluster unterstützt, also verwenden wir dies für unser Node.js-Beispiel.

ioredis

Die ioredis-Dokumentation beschreibt die Details der zusätzlichen Parameter, die für die Verbindung mit Redis™-Clustern übergeben werden müssen, und ein einfaches Beispiel ist auch in der README-Datei enthalten. Hier ist ein Beispielprogramm, das den Benutzer zur Eingabe eines Schlüssels auffordert und seinen Wert aus dem Redis™-Cluster liest:

const readline = require('readline');
const Redis = require('ioredis');

var cluster = new Redis.Cluster([{
    port: 6379,
    host: 'SG-example-1.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-2.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-3.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-4.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-5.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-6.servers.scalegrid.io'
}
], { redisOptions: { password: '<auth>' } });

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: 'enter key> '
});

console.log('Welcome to the Redis Cluster reader. Enter the key which you want to read [Ctrl D to Exit]');
rl.prompt();
rl.on('line', (line) => {
    if (line.trim()) {
        cluster.get(line, function (err, result) {
            if (err) {
                console.error(err);
            } else {
                console.log("value: " + result);
            }
            rl.prompt();
        });
    } else {
        console.error("No input received");
        rl.prompt();
    }
}).on('close', () => {
    console.log('\nterminating');
    cluster.quit();
    process.exit(0);
});

Sie sollten in der Lage sein, jedes dieser Beispiele auszuführen, nachdem Sie die neuesten Versionen der Redis-Treiber auf Ihren Client-Rechnern installiert haben.

Wenn Sie bereit sind, Ihre Redis-Bereitstellungen auf die vollständig verwaltete Plattform von ScaleGrid zum Hosten für Redis™ zu migrieren, sehen Sie sich die erstaunlichen Funktionen an, die auf der ScaleGrid-Konsole verfügbar sind durch eine kostenlose 30-Tage-Testversion. Unsere AWS Hosting for Redis™-Pläne sind in 14 verschiedenen Rechenzentren weltweit verfügbar und wir sind der einzige Service für Redis™, mit dem Sie Ihre Bereitstellungen in Ihrem eigenen Cloud-Konto verwalten können.