Redis学习笔记-切片集群Redis Cluster

简介: Redis学习笔记-切片集群Redis Cluster

之前学习了 Redis 哨兵机制和 Redis 哨兵集群建立过程,当主库发生故障时,Redis 哨兵可以将合适的从库切换成主库,这样就可以保证 Redis 的高可用了,但如果 Redis 数据量变大了就会面临扩容的问题,集群的实例增减,或为了实现负载均衡进行数据重新分布,会导致哈希槽和实例的映射关系发生变化,客户端发送请求时,会收到命令执行报错信息,如果了解 MOVEDASK 命令,遇到类似报错信息就很容易理解了,这篇文章就来学习下 Redis Cluster 集群。

1.笔记图

2.Redis 扩容方式

  • 纵向扩展:升级单个 Redis 实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的 CPU,其特点就是实施简单、直接,但会受到硬件和成本的限制
  • 横向扩展:增加与当前 Redis 实例配置相同的实例,在面向百万、千万级别的用户规模时,横向扩展的 Redis 切片集群会是一个非常好的选择

3.切片集群需要思考

  • 数据切片后,在多个实例之间如何分布?
  • 客户端怎么确定想要访问的数据在哪个实例上?

4.哈希槽(Hash Slot)

  • 一个切片集群共有 16384 个哈希槽,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中
  • 首先根据键值对的 key,按照 CRC16 算法计算一个 16 bit 的值
  • 用这个 16bit 值对 16384 取模,得到 0~16383 范围内的模数,每个模数代表一个相应编号的哈希槽

5.相关命令

  • cluster create 命令Redis 会自动把这些槽平均分布在集群实例上,如 N 个实例,每个实例槽的个数 16384/N
  • cluster meet 命令:手动建立实例间的连接,形成集群
  • cluster addslots 命令
  • 指定每个实例上的哈希槽个数,如各个实例配置不一样,需要手动分配哈希槽

  • 如上图所示一共有 3 个实例,同时假设有 5 个哈希槽,实例 1 保存哈希槽 0 1,实例 2 保存哈希槽 2 3,实例 3 保存哈希槽 4
redis-cli -h 172.16.19.3 –p 6379 cluster addslots 0,1
redis-cli -h 172.16.19.4 –p 6379 cluster addslots 2,3
redis-cli -h 172.16.19.5 –p 6379 cluster addslots 4

6.客户端定位数据

  • 在定位键值对数据时,它所处的哈希槽是可以通过计算得到的,这个计算可以在客户端发送请求时来执行,
  • 客户端和集群实例建立连接后,实例就会把哈希槽的分配信息发给客户端
  • Redis 实例会把自己的哈希槽信息发给和它相连接的其它实例,来完成哈希槽分配信息的扩散
  • 客户端收到哈希槽信息后,会把哈希槽信息缓存在本地

7.Redis Cluster重定向机制

  • 哈希槽变化:如在集群中,实例有新增或删除,Redis 需要重新分配哈希槽,为了负载均衡,Redis 需要把哈希槽在所有实例上重新分布一遍
  • 客户端给一个实例发送数据读写操作时,这个实例上并没有相应的数据,客户端要再给一个新实例发送操作命令
  • MOVED 命令:
  • 如果这个实例上并没有这个键值对映射的哈希槽,就会给客户端返回 MOVED 命令响应结果,包含了新实例的访问地址
# 13320 哈希槽    172.16.19.5 新地址    6379  新实例端口号
GET hello:key
(error) MOVED 13320 172.16.19.5:6379
  • Slot 2 中的数据已从实例 2 迁到实例 3,客户端仍然记录着原 Slot 2 信息,所以会给实例 2 发送命令
  • 实例 2 给客户端返一条 MOVED 命令,把 Slot 2 的最新位置(实例 3 上)返给客户端,客户端会向实例 3 发送请求并更新本地缓存
  • ASK 命令
  • 如果 Slot 2 中的数据只有一部分迁移到了实例 3,还有部分数据没有迁移,客户端就会收到一条 ASK 报错信息
GET hello:key
(error) ASK 13320 172.16.19.5:6379
  • ASK 命令并不会更新客户端缓存的哈希槽分配信息
相关文章
|
9月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
600 2
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
970 5
|
7月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
620 5
|
7月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
793 6
|
8月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
10月前
|
负载均衡 NoSQL Redis
【赵渝强老师】Redis的主从复制集群
Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
310 5
|
9月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
827 0
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作