我想知道是否有一个数据集有一些字符串键,比如
DATA1
DATA2
等等
如果启用了群集模式,分片如何工作?假设我有6个碎片,它如何决定数据1必须转到碎片1,数据2必须转到碎片2等等?
最佳答案
这是一个广泛的问题,您可以在这里找到与集群相关的所有信息:Overview of Redis Cluster main components
我把关键概念/总结留在这里:
所有键都转换为散列数值(范围在0到16384之间)。然后,每个节点分配一个要服务的哈希值范围。
假设我有6个碎片,它如何决定数据1必须转到碎片1,数据2必须转到碎片2等等?
答:因此,当启用群集模式时,每个群集节点将提供一系列密钥。当群集稳定时,每个节点将存储大约16384/6=2731个密钥的hased_值。现在将使用以下规则计算散列:for keydata1
: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