一文读懂 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到本地的映射表进行查找,如果节点有变更,就发送重定向命令,更新映射表,再查找,这就是切片透明访问的核心(对业务层透明)

相关推荐
一只fish5 分钟前
SQL 性能优化实战:从入门到极致的七重境界
数据库·sql·性能优化
qq_349317485 分钟前
Layui如何修改表格单元格内文字的行间距
jvm·数据库·python
MmeD UCIZ6 分钟前
GO 快速升级Go版本
开发语言·redis·golang
京师20万禁军教头7 分钟前
28面向对象(中级)-封装
java
NCIN EXPE11 分钟前
SQL sever数据导入导出实验
数据库·sql·oracle
2301_7751481515 分钟前
Redis如何实现用户标签管理_利用Set结构存储唯一属性集合
jvm·数据库·python
tERS ERTS19 分钟前
头歌答案--爬虫实战
java·前端·爬虫
xcLeigh19 分钟前
KES 数据库存储过程、函数、触发器实战
数据库·oracle·存储过程·触发器·函数
m0_5964063720 分钟前
mysql如何配置审计日志输出_mysql audit_log_format设置
jvm·数据库·python
geBR OTTE21 分钟前
flask后端开发(8):Flask连接MySQL数据库+ORM增删改查
数据库·mysql·flask