Redis(五)--切片集群

1,150 阅读2分钟

切片集群

之前讲过主从集群,主要是为了增加redis的可靠性。但是对于大量数据的存储,存在一个redis里面,会造成瓶颈,因为硬件无法无限的扩展,而切片集群可以解决问题,可以吧数据分散存储在多个实例里面,这样对于单个实例来说,需要存储的数据只是N分之一。扩展性很高。

从图中来看和数据库的分表很像,在数据分表中,我们会确认一个分表键,再更具这个键做分表的规则。

Redis Cluster

Redis3.0以后官方推出了Redis Cluster来实现切片集群,这里的方案是采用哈希槽(slot)来处理数据和实例之间的映射关系。一个切片集群共有 16384 个哈希槽,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中。

现根据key做一个CRC16 算法,得到一个16位的值,然后对16384取模,确定对应的哈希槽,然后通过哈希槽和实例之间的关系来找到正确的实例。

在手动分配哈希槽时,需要把 16384 个槽都分配完,才可以正常工作

重定向

切片集群的可以良好的支持增删实例,那么在这个过程中,哈希槽需要进行重新分配,同时数据需要迁移。在于哈希算法相关的地方,都会考虑扩容 冲突 哈希算法这3个重要的方向。当哈希槽与实例之间的关系发生改变时,数据会由原来的实例,迁移向新实例

MOVED重定向命令

当数据全部迁移后,假设由实例A迁移到了实例B,但是由于客户端存储的哈希槽的映射关系还是原来的,所以会想实例A继续请求,此时实例A发现这个slot已经迁移到B了,于是返回一个MOVED命令给客户端,并附带了实例B的信息,客户端此时知道机子错了,于是向B发送请求。并且只要收到MOVED后,会更新哈希槽的映射关系

ASK命令

当数据正在迁移过程中是,客户端发送给了实例A相关的命令,A返回一个ASK的报错给客户端,并附带了实例B,此时,客户端再发送给ASKING给B,然后再给B发送具体要实现的命令。ASK只有单次,当第二次是数据还在迁移,那还要再一次进行ASK的过程