redis原理(3)

2021-05-20 14:21:05 浏览数 (1)

传统的取模方式

例如10条数据 0 1 2 3 4 5 6 7 8 9

3个节点node a b c

如果按照取模的方式,那就是

  1. node a: 0,3,6,9
  2. node b: 1,4,7
  3. node c: 2,5,8

当增加一个节点的时候,数据分布就变更为

  1. node a:0,4,8
  2. node b:1,5,9
  3. node c: 2,6
  4. node d: 3,7

总结:数据3,4,5,6,7,8,9在增加节点的时候,都需要做搬迁,成本太高

而搬迁就是从节点a的机器上把数据移动到节点d上

一致性哈希方式 最关键的区别就是,对节点和数据,都做一次哈希运算,然后比较节点和数据的哈希值,数据取和节点最相近的节点做为存放节点。这样就保证当节点增加或者减少的时候,影响的数据最少。

十条数据,算出各自的哈希值,(这里就不变了,实际上要经过一系列计算)

  1. 0 : 0
  2. 1 : 1
  3. 2 : 2
  4. 3 : 3
  5. 4 : 4
  6. 5 : 5
  7. 6 : 6
  8. 7 : 7
  9. 8 : 8
  10. 9 : 9

有三个节点,算出各自的哈希值

  1. node a: 3
  2. node b: 5
  3. node c: 7

这个时候比较两者的哈希值,5等于b,则归属b,4小于b,归属b,3等于a,则归属a,最后所有大于c的,归属于c(这里只是模拟)

相当于整个哈希值就是一个环,对应的映射结果:

  1. node a: 0,1,2,3
  2. node b: 4,5
  3. node c: 6,7,8,9

这个时候加入node d, 就可以算出node d的哈希值: node d: 9

这个时候对应的数据就会做迁移:

  1. node a: 0,1,2,3
  2. node b: 4,5
  3. node c: 6,7
  4. node d: 8,9

只有最后8,9这2条数据被存储到新的节点,其他不变

三.虚拟槽分区

虚拟槽分区巧妙地使用了哈希空间, 使用分散度良好的哈希函数把所有 数据映射到一个固定范围的整数集合中, 整数定义为槽(slot) 。 这个范围 一般远远大于节点数, 比如Redis Cluster槽范围是0~16383。 槽是集群内数据 管理和迁移的基本单位。 采用大范围槽的主要目的是为了方便数据拆分和集 群扩展。 每个节点会负责一定数量的槽, 如图10-4所示。

当前集群有5个节点, 每个节点平均大约负责3276个槽。 由于采用高质 量的哈希算法, 每个槽所映射的数据通常比较均匀, 将数据平均划分到5个 节点进行数据分区。 Redis Cluster就是采用虚拟槽分区, 下面就介绍Redis数 据分区方法。

redis将每个数据放到一个槽中,而很多槽放到节点中。当槽进行扩容,只需要把某些槽迁移到新节点即可。

0 人点赞