为什么要做Redis分片?redis 集群模式的工作原理能说一下么?

image.png

redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。Redis集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000 个节点)。

高并发:支持大并发,通过横向拓展实现,通过 —cluster add-node 添加新机器到集群执行 reshard 命令,重新分配slot ,将相对均摊了 slot 的分布,缓冲了 其他机器的并发压力,从而应对 百万,甚至上千万的并发。

复制:每个小集群都是一个主从复制的架构,从而保证了 主节点挂掉的时候,不至于丢失全部数据,当选举产生新的master节点后,继续对外进行服务,在主备切换过程中,部分

key会有影响,但是其他分片上的key不会有任何影响,从而保证了高可用的场景。

分片:每个不同的主从架构小集群,数据是不一致的,客户端通过哈希函数,将数据路由到不同的数据节点,从而实现了数据的分片。这样技术内存不够用的时候,只需要添加新的集群节点进来,重新分配一下slot 就可以了。

方案说明

  1. 通过哈希的方式,将数据分片,每个节点均分存储一定哈希槽(哈希值) 区间的数据,默认分配了16384 个槽位
  2. 每份数据分片会存储在多个互为主从的多节点上
  3. 数据写入先写主节点,再同步到从节点
  4. 同一分片多个节点间的数据不保持一致性
  5. 读取数据时,当客户端操作的key没有分配在该节点上时,redis会返回转向指令,指向正确的节点

在集群模式下,redis 的 key 是如何寻址的?

每个服务器都会维护一个 slot表,对应了每个 slot 真实的物理节点,当服务器收到命令时,会对 key进行 crc16 进行哈希,得到哈希值 后,对 16384 进行取模,取模的值就是key 对应的slot,如果 这个slot 是由当前服务器处理,则直接继续执行命令,如果不是由当前节点处理,则返回该slot 对应的服务器节点地 址,由客户端重写请求对应的地址。

Redis分片有什么缺点?

  1. 涉及多个key的操作通常不会被支持。例如你不能对两个集合求交集,因为他们可能被存储到不同的Redis实例(实际上这种情况也有办法,但是不能直接使用交集指令)。
  2. 同时操作多个key,则不能使用Redis事务 (2.1)分区使用的粒度是key,不能使用一个非常长的排序key存储一个数据集(2.2)当使用分区的时候,数据处理会非常复杂,例如为了备份你必须从不同的Redis实例和主机同时收集RDB / AOF文件。