一文读懂 Redis 集群:从哈希槽到透明访问

目录

Redis的集群模式和其优缺点

那么哈希槽是怎么映射到具体的redis节点中呢?

优点缺点

cluster集群客户端是怎样知道该访问哪个分片的?


Redis的集群模式和其优缺点

Redis的集群采用Redis 切片集群(Redis Cluster)方案,该方案把一个数据分散在多个节点上,降低对单节点的依赖,大大提高了数据的读写效率

Redis Cluster使用哈希槽(Hash Slot)来处理数据与节点的映射关系,一个切片集群共有16384个哈希槽,每一个键值对的key都会经过处理映射在对应的哈希槽中

分为两步:

1.把key经过CRC16算法得到一个16bit的值

2.把16bit的值对16384(哈希槽总数)取模,得到的模值就是映射key的位置

那么哈希槽是怎么映射到具体的redis节点中呢?

**1.平均分配:使用cluster create命令创建集群时,**把所有的哈希槽均匀分配给节点,如果有4个节点那么就由16384/4,来给每一个redis节点分配哈希槽

**2.手动分配:使用cluster meet命令创建节点之间的连接组成集群,**后续再手动的使用cluster addslot来手动配置哪一个集群的占用多少哈希槽

注意:手动分配时需要把16384个哈希槽分配完,否则集群不能正常工作

上图中的切片集群一共有 2 个节点,假设有 4 个哈希槽(Slot 0~Slot 3)时,我们就可以通过命令手动分配哈希槽,比如节点 1 保存哈希槽 0 和 1,节点 2 保存哈希槽 2 和 3。

优点缺点

优点:

1.高性能:redis切片集群,把数据分散在多个节点,减少单节点压力,让数据的读写提高,提升整体的吞吐量

2.高可用:redis主从同步机制让集群的主从节点的数据可以保证最终一致性,哪怕一个主节点挂掉还可以选举新的主节点,保证可用性

3.可扩展性强:redis可以自由添加或减少节点可扩展性比较强,集群中某些节点还可以做代理节点转发请求,增加数据的灵活度和可制定性
缺点:

1.部署和维护比较复杂:redis集群的部署和维护需要考虑很多,主从配置、分片的规则、节点的布置,故障处理等需要较高的技术支持,实现比较复杂

2.数据同步问题:在数据同步时,某些节点挂掉后,数据同步会出现问题,数据量越大,读取的时间越久,就会有读写延迟

3.数据切片限制:因为数据分散在不同的节点,所以在对一个key进行多个操作时,可能会因为数据分散的原因导致操作失败

cluster集群客户端是怎样知道该访问哪个分片的?

cluster集群共有16384个哈希槽,客户端先与一个集群中的节点构建连接,会发送CLUSTER SLOTS命令得到所有哈希槽和节点的对应关系,再把这个关系缓存到本地

如果要根据key寻找到哈希槽,那么就要对key进行CRC16算法处理后再对16384取模,把结果拿到本地缓存的映射表中去查找就能找到对应的哈希槽

如果期间节点发生了改变(如节点下线,槽位迁移),节点会向客户端发送ASK或MOVED重定向命令,来告知客户端,从而修改本地的映射表,之后就可以根据新的映射表查找

总结:根据key到本地的映射表进行查找,如果节点有变更,就发送重定向命令,更新映射表,再查找,这就是切片透明访问的核心(对业务层透明)

相关推荐
浮芷.2 分钟前
鸿蒙PC端 TTS 并发调用问题详解:资源竞争与队列管理
算法·华为·开源·harmonyos·鸿蒙·鸿蒙系统
SunnyDays10119 分钟前
如何在 Java 中实现 OFD 与 PDF 格式互转
java·开发语言
装不满的克莱因瓶10 分钟前
掌握感知器的学习原理
人工智能·python·神经网络·算法·ai·卷积神经网络
Lsk_Smion11 分钟前
力扣实训 _ [994].腐烂的橘子/图论
算法·leetcode·图论
hsg7717 分钟前
简述:Jensen Huang‘s Footsteps网站全内容分析
前端·javascript·数据库
yuezhilangniao17 分钟前
MySQL 8.0.32 二进制安装脚本 和初始化 操作系统版本rocky86
数据库·mysql·adb
轻微的风格艾丝凡19 分钟前
两电平三相VSC整流模式从不控整流平滑切换至有源整流调试记录
算法·dsp·c2000
dongf201933 分钟前
R语言KNN算法
算法·数据分析·r语言
Trouvaille ~33 分钟前
【Redis篇】Redis 主从复制:数据同步的原理与实现
数据库·redis·缓存·中间件·高可用·主从复制·后端开发
真实的菜1 小时前
Redis 从入门到精通(五):哨兵模式(Sentinel)—— 自动故障转移的完整原理与实战
数据库·redis·sentinel