在应对数据量扩容时,虽然增加内存这种
纵向扩展
的方法简单直接,但是会造成数据库的内存过大,导致性能变慢。
Redis切片集群提供了
横向扩展
的模式,也就是使用多个实例,并给每个实例配置一定数量的哈希槽,数据可以通过键的哈希值映射到哈希槽,再通过哈希槽分散保存到不同的实例上。
好处是扩展性好,不管有多少数据,切片集群都能应对。
从3.0开始,官方提供了一个名为Redis Cluster
的方案,用于实现切片集群。切片集群由多个普通redis服务器组成,大家一起存储全量数据。
当然,数据切片之后也带来了下面几个问题:
数据切片后,在多个实例之间如何分布?
在Redis Cluster方案中,一个切片集群共有16384
个哈希槽,这些哈希槽类似于数据分区
,每个键值对都会根据它的key,被映射到一个哈希槽中。
客户端如何定位数据?
在对数据库中的16384个槽都进行了指派之后,集群就会进入上线状态
,这时客户端就可以向集群中的节点发送数据命令了。
处理流程如下:
重新分片(slot迁移)
为什么需要重新分片?
在集群中,实例和哈希槽的对应关系并不是一成不变的,最常见的变化有两个:
- 发生数据的
新增或删除
,Redis需要重新分配哈希槽; - 为了
负载均衡
,Redis需要把哈希槽在所有实例上重新分布一遍。
重新分片
在实例和哈希槽的对应关系发生变化之后,就需要进行重新分片了,重新分片操作将任意数量已经指派给某个源节点的槽改为指派给另一个目标节点, 并且相关槽所属的键值对也会从源节点被移动到目标节点
重新分片过程