启用集群模式时,redis分片如何工作

时间:2018-03-24 05:17:30

标签: redis

我试图了解我是否有一个包含某些字符串键的数据集 数据1 DATA2 等等 如果我启用了群集模式,分片如何工作?假设我有6个分片,它如何决定data1必须转到分片1,数据2分为分片2等等?

1 个答案:

答案 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