Direkt zum Inhalt

Wie behebe ich den CROSSSLOT-Fehler, den ich erhalte, wenn ich Mehrschlüsseloperationen auf einem selbst gestalteten ElastiCache(Redis OSS)-Cluster verwende?

Lesedauer: 3 Minute
0

Ich möchte Mehrschlüsseloperationen auf einem selbst entworfenen Cluster von Amazon ElastiCache (Redis OSS) mit aktiviertem Cluster-Modus verwenden. Aber ich erhalte den Fehler „CROSSSLOT Keys in request don't hash to the same slot“.

Kurzbeschreibung

Du erhältst den folgenden Fehler, wenn sich die Schlüssel nicht im selben Hash-Slot befinden, obwohl sie im selben Knoten gespeichert sind:

„CROSSSLOT Keys in request don't hash to the same slot“

Um Mehrschlüsseloperationen in einem mit Shards gefüllten ElastiCache (Redis OSS)-Cluster mit aktiviertem Cluster-Modus zu implementieren, hashe die Schlüssel auf denselben Hash-Slot.

In den folgenden Beispielsätzen befinden sich "myset2" und "myset" in demselben Knoten:

172.31.62.135:6379> scan 0
1) "0"
2)  1) "myset"
    2) "myset2"

Eine Mehrschlüsseloperation wird jedoch nicht unterstützt:

172.31.62.135:6379> SUNION myset myset2(error) CROSSSLOT Keys in request don't hash to the same slot

Dieser Vorgang wird nicht unterstützt, da sich die Schlüssel nicht im selben Hash-Slot befinden. Die beiden Sets befinden sich in zwei verschiedenen Slots, 560 und 7967:

172.31.62.135:6379> CLUSTER KEYSLOT myset(integer) 560
172.31.62.135:6379> CLUSTER KEYSLOT myset2(integer) 7967

Lösung

Methode 1

Du kannst eine Redis-Clientbibliothek verwenden, die Unterstützung für Redis-Cluster mit aktiviertem Cluster-Modus bietet. Weitere Informationen findest du unter Redis-Cluster-Spezifikation auf der Redis-Website.

Das folgende Beispiel verwendet redis-cli, um Schlüssel von Slots abzurufen, die sich in verschiedenen Shards befinden. Dies führt zu einem CROSSSLOT-Fehler:

redis-cli -c -h RedisclusterCfgEndpointRedisclusterCfgEndpoint:6379> mget key1 key2
(error) CROSSSLOT Keys in request don't hash to the same slot

Wenn du den redis-py-cluster verwendest, um Schlüssel von Slots abzurufen, die sich in verschiedenen Shards befinden, erhältst du die richtige Ausgabe:

>>> from rediscluster import RedisCluster>>> startup_nodes = [{"host": "RedisclusterCfgEndpoint", "port": "6379"}]
>>> rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True,skip_full_coverage_check=True)
>>> print(rc.mget("key1","key2"))

Methode 2

Wenn du Schlüssel für Mehrschlüsseloperationen auf einem Cluster erstellst, bei dem der Cluster-Modus aktiviert ist, zwinge die Schlüssel in den gleichen Hash-Slot. Du kannst Hashtags verwenden, um die Schlüssel in den gleichen Hash-Slot zu zwingen. Wenn der Schlüssel das {...} enthält, nur die Teilzeichenfolge zwischen den geschweiften Klammern, {und}, wird gehasht, um den Hash-Slot zu berechnen.

Das Folgende ist ein Beispiel für mehrere Sätze, die auf denselben Hash-Slot gehasht werden. Die Schlüssel {user1}:myset und {user1}:myset2 werden auf denselben Hash-Slot gehasht. Nur user1 wird verwendet, um den Hash-Slot zu berechnen.

172.31.62.135:6379> CLUSTER KEYSLOT {user1}:myset(integer) 8106
172.31.62.135:6379> CLUSTER KEYSLOT {user1}:myset2
(integer) 8106

172.31.62.135:6379> SUNION {user1}:myset {user1}:myset2
1) "some data for myset"
2) "some data for myset2"

Nachdem du beide Sätze auf denselben Hash-Slot gehasht hast, kannst du eine Mehrschlüsseloperation ausführen.

AWS OFFICIALAktualisiert vor einem Jahr