有没有办法让一个特定的key在集群模式下定位到一个特定的redis实例上?
Is there a way to make a specific key locate on a specific redis instance in cluster mode?
我想让我的多锁定位在不同的redis实例上。
我发现redission可以指定一个实例来执行命令,但是如果命令是键相关的,指定的实例会将命令传递给另一个实例。
你能给我一些建议吗?
可以,但这不是微不足道的。首先,Redis 在key 中使用花括号来确定它的sharding 部分,所以你可以决定修改一个key 并将它发送到任意一个shard。
现在,您需要两件事:
哪个分片或插槽范围位于哪个 redis 实例中的映射。
一种了解哪个字符串映射到哪个插槽的方法,因此您可以在密钥上强制使用 "sharding string" 将其路由到特定的分片。
第一个很简单 - CLUSTER SLOTS
会给你那张地图,只需解析它。
第二个更棘手 - 但幸运的是我已经完成了这项工作。我创建了一个 table 最短的字母数字字符串映射到 Redis 集群中的 16384 个槽中的每一个。我在 C 中,但您可以轻松地将其转换为任何形式。 https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
所以你的算法将是,给定一个密钥和一个所需的节点:
查看插槽映射并获取驻留在该节点上的插槽范围。
Select 该节点范围内的一个插槽。
在分片 table 中查找该插槽的条目。
用大括号在键上打那个字符串。例如将 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)
我想让我的多锁定位在不同的redis实例上。
我发现redission可以指定一个实例来执行命令,但是如果命令是键相关的,指定的实例会将命令传递给另一个实例。
你能给我一些建议吗?
可以,但这不是微不足道的。首先,Redis 在key 中使用花括号来确定它的sharding 部分,所以你可以决定修改一个key 并将它发送到任意一个shard。
现在,您需要两件事:
哪个分片或插槽范围位于哪个 redis 实例中的映射。
一种了解哪个字符串映射到哪个插槽的方法,因此您可以在密钥上强制使用 "sharding string" 将其路由到特定的分片。
第一个很简单 - CLUSTER SLOTS
会给你那张地图,只需解析它。
第二个更棘手 - 但幸运的是我已经完成了这项工作。我创建了一个 table 最短的字母数字字符串映射到 Redis 集群中的 16384 个槽中的每一个。我在 C 中,但您可以轻松地将其转换为任何形式。 https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
所以你的算法将是,给定一个密钥和一个所需的节点:
查看插槽映射并获取驻留在该节点上的插槽范围。
Select 该节点范围内的一个插槽。
在分片 table 中查找该插槽的条目。
用大括号在键上打那个字符串。例如将
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)