Redis (クラスターモードが有効) ElastiCache クラスターでマルチキー操作を実行しているときに、「リクエストされた 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"

両方のセットが同じハッシュスロットにハッシュされたので、マルチキー操作を実行できます。


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

改善できることはありますか?


さらにサポートが必要な場合