什么是集群
集群是由多个复制集组成的,能提供在多个redis节点间共享数据的程序集
简而言之就是将原来的单master主机拆分为多个master主机,将整个数据集分配到各主机上
集群的作用
- 集群中可以存在多个master,而每个master可以挂载多个slave
- 自带哨兵的故障转移机制,不需要再去使用哨兵功能
- 连接集群中的一个可用节点就可以访问整个集群
ps:集群不保证数据的强一致性,会因为网络等原因丢数据
集群算法
数据分片
redis会根据节点的数量将哈希槽分为若干段,每一段分配给若干个redis实例,这个redis实例就是分片
哈希槽:以前每一个key是直接存放在键空间里面的,现在我们在此之上多套了一层数据结构,将键空间划分成多个哈希槽,再将数据存放在哈希槽中
如何找到给定key的分片?
答:使用CRC16(KEY)算法对key进行处理,使用确定性哈希函数对16384(总哈希槽数)进行取模计算出key的对应槽值,根据槽值可以得出对应的分片
使用分片和槽位的优势
- 方便扩缩容和数据分派查找
- 扩缩容不会导致集群不可用
- 不会出现数据倾斜的问题
扩展--slot槽位映射的3种方案
哈希取余分区
优点是简单有效,缺点是当redis服务器需要扩缩容时会导致节点映射关系的改变,如果其中一台主机出现宕机了全部数据hash都会被打乱
一致性哈希算法分区
一致性哈希算法将整个哈希值空间组织成一个虚拟的圆环,圆环的范围是[0,2^32-1]
所有哈希值都会落到圆环上,再将redis节点映射到某一点上,当数据映射到圆环时会顺时针寻找第一个被找到的redis节点,将数据存放在该节点上
优点是可以扩展,影响的节点少,缺点是节点映射的位置可能会导致数据存放不均匀
哈希槽分区
哈希槽分区也就是我们redis集群采用的算法,在数据和节点之间多加了一层槽
槽解决的是粒度问题,把粒度变大了,便于数据移动;哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配
为什么redis集群的槽位是16384个?
出于心跳包消息头,节点数量,压缩比三个方面去考虑
集群配置和使用
集群的配置可以去b站上看视频,网上都有就不浪费时间了,这里说一下一些需要注意的点
- 集群的主从复制不需要配文件,通过命令进行主从复制,且执行的结果具有随机性
- 客户端连接时需要加-c选项,否则无法跨节点进行写操作
- 当一个主机宕机后,其从机会自动上位,且原主机恢复后自动成为从机
- 集群在扩容时,是从现有的节点中均匀分配出一些槽位共同分配给新节点
- 集群在缩容时,是由其中一个节点完全接收节点释放出来的槽位