Redis集群
定义
由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集

架构图:

特点:
- Redis集群支持多个Master,每个Master又可以挂载多个Slave
- 由于Cluster自带Sentinel的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能
- 客户端与Redis的节点连接,不再需要连接集群中的所有节点,只需要任意连接集群的一个可用节点
- 槽位slot负责分配到各个物理服务节点,由对应的集群来负责维护节点
Redis集群的数据分片
Redis集群没有使用一致性hash,而是引入了哈希槽的概念。
Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点

分片:使用Redis集群时我们会将存储的数据分散到多台Redis机器上,这称为分片。简言之,集群中的每个Redis实例都被认为是整个数据的一个分片
优势
优势:方便扩缩容和数据分派查找
这种结构很容易添加或者删除节点,比如如果我们想添加个节点D,我需要从A、B、C中的部分槽到D上,如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可,由于从一个节点将哈希槽移到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用状态
哈希槽分区
这里可以看看小林coding的哈希取余分区、一致性哈希算法分区再来与哈希槽分区对比优劣势
为什么出现哈希槽分区?因为一致性哈希算法的数据倾斜问题
哈希槽实质就是一个数组,数组[0,2^14-1]形成hash slot空间
解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为hash槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。

槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。
Redis集群内置了16384个哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同节点。当需要在Redis集群中放置一个key-value时,redis先对key使用CRC16算法算出一个结果然后用16384求余数[CRC16(key)%16384],这样每个key都会对应一个编号在0-16383之间的哈希槽,也就是映射到某个节点上。
为什么Redis集群最大槽数是16384个?
先来看正常的心跳数据包结构


此外,Redis集群不保证强一致性,这意味这在特定条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令(因为主从复制是异步的,即主节点收到一条最新命令,还没复制到从节点时,主节点就挂了)