我试图了解我是否有一个包含某些字符串键的数据集 数据1 DATA2 等等 如果我启用了群集模式,分片如何工作?假设我有6个分片,它如何决定data1必须转到分片1,数据2分为分片2等等?
答案 0 :(得分:0)
这是一个广泛的问题,您可以在此处找到与群集相关的所有信息:Overview of Redis Cluster main components
我将离开关键概念/摘要: 所有键都转换为散列数值(范围在 0到16384 之间)。然后每个节点分配一系列hash_values来服务。
假设我有6个分片,它如何决定data1必须转到分片1,数据2分为分片2等等?
Ans:因此,当您启用群集模式时,每个群集节点都将提供一系列密钥。虽然群集稳定,但每个节点将存储大约16384/6 = 2731个hased_values的密钥。现在哈希将使用以下规则计算:对于密钥data1
:
hash_slot = Hash_Algorithm(data1) % 16384
哈希算法可以是MD5,CRC等。
hash_slot = CRC16(data1) % 16384
在redis-cli上运行此命令,以了解哪个具有以下范围:$> cluster slots
示例输出(新版本,包括ID):
127.0.0.1:30001> cluster slots
1) 1) (integer) 0 // begin slot
2) (integer) 5460 // end slot
3) 1) "127.0.0.1"
2) (integer) 30001
3) "09dbe9720cda62f7865eabc5fd8857c5d2678366"
4) 1) "127.0.0.1"
2) (integer) 30004
3) "821d8ca00d7ccf931ed3ffc7e3db0599d2271abf"
2) 1) (integer) 5461 // begin slot
2) (integer) 10922 // end slot
3) 1) "127.0.0.1"
2) (integer) 30002
3) "c9d93d9f2c0c524ff34cc11838c2003d8c29e013"
4) 1) "127.0.0.1"
2) (integer) 30005
3) "faadb3eb99009de4ab72ad6b6ed87634c7ee410f"
.....
.....
正如文档描述:
密钥分发模型
密钥空间分为16384个插槽,有效地设置了16384个主节点的集群大小的上限(但建议的最大节点大小约为1000个节点)。
群集中的每个主节点处理16384个哈希槽的子集。当没有正在进行的集群重新配置时(即散列插槽从一个节点移动到另一个节点),集群是稳定的。当集群稳定时,单个节点将提供单个散列槽(但是,在网络分裂或故障的情况下,服务节点可以有一个或多个将替换它的从属,并且可以用于扩展读取过时数据的读取操作。)
用于将键映射到散列槽的基本算法如下(读取此规则的散列标记异常的下一段):
<强>
HASH_SLOT = CRC16(key) mod 16384
强>