できますが、それは些細なことではありません。まず、Redisはキーに中括弧を使用してそのシャーディング部分を決定するため、キーを変更して任意のシャードに送信することができます。
ここで、2つのものが必要です。
-
どのシャードまたはスロット範囲がどのredisインスタンスに存在するかのマップ。
-
どの文字列がどのスロットにマップされているかを知る方法。キーに「シャーディング文字列」を強制して、特定のシャードにルーティングできます。
最初のものは簡単です-CLUSTER SLOTS
そのマップが表示されます。解析するだけです。
2つ目はもっとトリッキーですが、幸いなことに、私はすでにこの作業を行っています。 Redisクラスターの16384スロットのそれぞれにマッピングする最短の英数字の文字列のテーブルを作成しました。私はCにいますが、簡単に何にでも変換できます。 https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
したがって、キーと目的のノードが与えられると、アルゴリズムは次のようになります。
-
スロットマップを見て、そのノードにあるスロット範囲を取得します。
-
そのノードの範囲内のスロットを選択します。
-
シャーディングテーブルでそのスロットのエントリを探します。
-
キーに中かっこを付けてその文字列を叩きます。例えば
foo
を変換しますfoo{e4x}
へ 。
以上です!このキーを使用するコマンドはすべて、そのシャードにルーティングされます。
疑似Pythonバージョン:
# Build this table from CLUSTER SLOTS or CLUSTER NODES
slots = {
'127.0.0.1:7000': [(0, 1045),(2000,2100)]
...
}
# Build this table from the C example:
sharding_table = ["06S", "Qi", "5L5", "4Iu", "4gY", ....]
def retarget_key(key, node):
ranges = slots[node]
sharding_key = shading_table[ranges[0][0]]
return '%s{%s}' % (key, sharding_key)