【深入解读Redis系列】Redis系列(五):切片集群详解(上)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【深入解读Redis系列】Redis系列(五):切片集群详解

首发博客地址

https://blog.zysicyj.top/

系列文章地址[1]


如果 Redis 内存很大怎么办?

假设一台 32G 内存的服务器部署了一个 Redis,内存占用了 25G,会发生什么?

此时最明显的表现是 Redis 的响应变慢,甚至非常慢。

这是因为 RDB 快照是通过 fork 子线程来实现的,fork 操作时间和 Redis 数据量成正相关,而 fork 时会阻塞主线程。

随着数据量的增加,fork 耗时也会增加。所以,当对 25G 的文件进行 fork 时,Redis 的响应就会变慢。

针对这种大数据量的存储,有什么其他的方案呢?

什么是切片集群?

Redis 分片集群是一种将 Redis 数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性。在分片集群中,数据被分为多个片段,每个片段存储在不同的节点上,这些节点可以是物理服务器或虚拟服务器。

Redis 分片集群的主要目的是将数据分布在多个节点上,以便可以通过并行处理来提高读写吞吐量。每个节点负责处理一部分数据,并且在需要时可以进行扩展以适应更多的负载。此外,分片集群还提供了故障容错和高可用性的功能,即使其中一个节点发生故障,其他节点仍然可以继续工作。

比如我们将 25GB 的数据平均分成 5 份(当然,也可以不做均分),使用 5 个实例来保存,每个实例只需要保存 5GB 的数据。如下图所示:

切片集群架构图

这样,每个实例只有 5GB 内存,执行 fork 的时候就快得多,不会阻塞主线程。

实际业务中,大数据量通常是无法避免的。而切片集群,就是一个非常好的方案。

如何保存更多数据?

我们可以纵向扩展也可以横向扩展

纵向扩展

即升级单个 Redis 实例的配置,如内存、硬盘、带宽、CPU 等

横向扩展

即增加 Redis 实例的个数

纵向扩展和横向扩展对比图

那么,纵向扩展和横向扩展的区别是什么呢?

纵向扩展(Scale Up)和横向扩展(Scale Out)是常见的两种扩展方式,用于提升系统的性能和处理能力。它们有着不同的特点和适用场景。

  1. 纵向扩展: 纵向扩展是通过增加单个节点的硬件资源来提升系统性能。具体来说,是增加服务器的处理能力、存储容量或内存大小等。这可以通过升级服务器的 CPU、内存、硬盘等硬件设备来实现。

优点:

  • 简单方便:纵向扩展只需要升级现有的服务器,不需要进行系统的重构和数据迁移。
  • 成本相对较低:相对于横向扩展,纵向扩展的成本通常更低,因为只需要购买更高配置的硬件设备。

缺点:

  • 有限的扩展能力:纵向扩展的扩展能力受限于单个节点的硬件资源,无法无限扩展。
  • 单点故障:如果纵向扩展的节点发生故障,整个系统的可用性将会受到影响。

适用场景:

  • 对于单个节点负载较高、需要处理大量并发请求的应用场景,纵向扩展可以提供更好的性能和响应能力。
  • 当数据集较小,可以被一个节点的硬件资源容纳时,纵向扩展是一种经济有效的方式。
  1. 横向扩展: 横向扩展是通过增加多个节点来提升系统的性能和处理能力。每个节点可以是一台独立的服务器或者虚拟机。数据在多个节点上进行分片存储,各个节点共同处理请求,并共享负载。

优点:

  • 无限扩展能力:横向扩展可以通过增加更多节点来实现无限的扩展能力,可以根据需求动态添加或移除节点。
  • 高可用性:由于数据分布在多个节点上,即使其中一个节点发生故障,其他节点仍然可以继续工作,提供高可用性。

缺点:

  • 复杂性增加:横向扩展需要进行数据分片和负载均衡的设计和实现,增加了系统的复杂性。
  • 成本较高:相对于纵向扩展,横向扩展需要购买更多的服务器或虚拟机,成本较高。

适用场景:

  • 对于需要处理大量并发请求、数据集较大的应用场景,横向扩展可以提供更好的性能和可伸缩性。
  • 当需要保证系统的高可用性和故障容错能力时,横向扩展是一种可行的方案。

纵向扩展和横向扩展是两种不同的扩展方式,各自有着不同的优点和适用场景。在实际应用中,应根据具体需求和限制,选择合适的扩展方式来提升系统性能和可伸缩性。

在面向百万、千万级别的用户规模时,横向扩展的 Redis 切片集群会是一个非常好的选择。

Redis 是如何做分片的

Redis 通过一种称为哈希槽(hash slot)的机制来实现分片集群。哈希槽将整个数据集分成固定数量的槽,每个槽都有一个唯一的编号,通常是从 0 到 16383。

在 Redis 分片集群中,有多个节点(主节点和从节点),每个节点负责存储其中一部分的槽数据。节点之间通过集群间通信协议进行数据的交互和同步。

当一个客户端发送一个命令到 Redis 分片集群时,集群会根据命令涉及的键的哈希值将命令路由到正确的槽上。这个槽所在的节点负责处理这个命令并返回结果给客户端。

具体的分片过程如下:

  1. 客户端发送命令到 Redis 分片集群中的任意一个节点。
  2. 节点根据命令涉及的键的哈希值计算出对应的槽号。
  3. 节点根据槽号确定该槽所在的节点,并将命令路由到该节点。
  4. 该节点处理命令并返回结果给客户端。

当节点加入或离开集群时,Redis 分片集群会自动进行数据的重新分片和迁移,以保持数据的均衡和高可用性。具体的过程如下:

  1. 当一个新节点加入集群时,集群会将一部分槽从现有节点迁移到新节点上,以平衡数据负载。
  2. 当一个节点离开集群时,集群会将该节点负责的槽迁移到其他可用节点上,以保证数据的可用性。

通过哈希槽的机制,Redis 分片集群实现了数据的分片和自动迁移,以提供高可用性、扩展性和容错性。同时,节点间的通信和数据同步保证了集群的一致性和可用性。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
3月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
136 0
|
4月前
|
存储 NoSQL 算法
Redis 集群模式搭建
Redis 集群模式搭建
95 5
|
4月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
|
4月前
|
缓存 NoSQL Java
Redis Spring配置集群
【7月更文挑战第5天】
79 10
|
3月前
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
138 0
|
3月前
|
NoSQL Linux Redis
使用docker-compose搭建redis-cluster集群
使用docker-compose搭建redis-cluster集群
563 0
|
3月前
|
NoSQL Linux Redis
基于redis6搭建集群
基于redis6搭建集群
|
4月前
|
消息中间件 监控 NoSQL
Redis哨兵改集群
【7月更文挑战第7天】
下一篇
无影云桌面