Redis (クラスターモードが有効) の ElastiCache クラスターでマルチキーオペレーションを行うときに、すべてのキーが同じノードに保存されているのに、「CROSSSLOT Keys in request don't hash to the same slot (リクエストされた CROSSSLOT キーが同じスロットにハッシュされません)」というエラーが発生するのは、なぜですか?

最終更新日: 2020 年 2 月 13 日

Amazon ElastiCache for Redis (クラスターモードが有効) クラスターでマルチキー操作を実行しているときに、キーが同じノードに格納されているにもかかわらず、「リクエストされた CROSSSLOT キーが同じスロットにハッシュされません」というエラーが発生するのはなぜですか?

簡単な説明

このエラーが発生するのは、複数のキーが同じノード内だけでなく、同じハッシュスロット内に存在する必要があるためです。シャード化された Redis (クラスターモード対応) ElastiCache クラスターでマルチキー操作を実装するには、キーを同じハッシュスロットにハッシュする必要があります。ハッシュタグを使用して、キーを同じハッシュスロットに入れることができます。

この例では、「myset2」と「myset」というセットが同じノードにあります。

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

ただし、マルチキー操作はサポートされていません。

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

これは、キーが同じハッシュスロットにないためです。この例では、2 つのセットは 2 つの異なるスロット 560 と 7967 にあります。

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

解決方法

方法 1

Redis (クラスターモードに対応) クラスターをサポートする Redis クライアントライブラリを使用できます。Redis クラスターの詳細については、 redis-py-cluster ウェブサイトを参照してください。

たとえば、異なるシャードにあるスロットからキーを取得するために redis-cli を使用すると、CROSSSLOT エラーが返されます。

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

redis-py-cluster を使用して異なるシャードにあるスロットからキーを取得すると、正しい出力が返されます。

>>> 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"))

方法 2

クラスターモードに対応しているクラスターでマルチキー操作に使用されるキーを作成するときは、ハッシュタグを使用してキーを同じハッシュスロットに強制します。キーに「{...}」パターンが含まれている場合は、括弧「{」と「}」の間の部分文字列のみがハッシュされてハッシュスロットを取得します。

たとえば、{user1}:myset{user1}:myset2 のキーは、同じハッシュスロットにハッシュされます。なぜなら、括弧「{」と「}」の内側の文字列、つまり「user1」だけがハッシュスロットの計算に使用されるからです。

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"

これで両方のセットが同じハッシュスロットにハッシュされるため、マルチキーオペレーションを実行できます。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?