Redis——集群分区(一致性哈希算法/预分区/Cluster/Twemproxy/Predis)

本文介绍了Redis的数据分区策略,包括客户端处理的数据分治,如逻辑拆分、hash算法和一致性哈希算法,以及服务器端处理的代理和负载均衡。一致性哈希在扩展性上有优势,但可能导致部分数据丢失。预分区方案如Redis Cluster解决了扩展问题,允许动态添加节点。代理方案如Twemproxy提供了负载均衡,而Predis客户端支持一致性哈希。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇文章中我们通过主从复制可以人为的搭建集群,也可以通过 Sentinel 管理多台 Redis 服务器,自动维护一个集群,都可以解决单机情况下 master 出现单点故障问题,实现服务的高可用。但是都属于在 X 轴方向上的水平扩展,每台机器都需要存储全量数据,所以没有解决单台机器容量有限的问题

我们可以把数据根据业务逻辑进行划分,每台 Redis 服务只存储一部分内容,并对外提供一部分服务,这样单台 Redis 服务器就不需要存储全量数据。

既然有多个 Redis 实例对外提供服务,那么数据是怎么分区映射存储到不同的 Redis 实例?请求是怎么负载到不同的服务进程?

一、数据分治

数据分治可以在 Redis 服务下手,也可以在客户端下手,我们先来考虑一下在 client 端如何进行数据分治

1、Client 端处理

1、逻辑拆分

首先如果数据可以根据逻辑拆分,可以让不同逻辑的数据存储到不同的 Redis 服务实例

在这里插入图片描述

弊端:很多场景下,数据并不能简单的根据逻辑进行拆分,所以这种方案对数据特征有很大的要求,限制性较大

2、hash 算法

如果数据不可以简单的根据逻辑拆分,我们可以使用各种映射算法,让数据按照一定的规则映射、保存在不同的 Redis 服务实例上。映射算法中我们最常用的就是 hash 算法

首先可以使用 hash 算法 + 取模,将数据模上 Redis 服务实例个数,让数据映射、存放到不同的服务实例

在这里插入图片描述

弊端:hash 算法有一个天生的缺陷——算法取模需要根据机器数进行取模,但是增加机器就会导致 hash 算法的取模混乱,无法在正确的 Redis 实例中取到数据。

此时需要进行全局洗牌,全部的数据都需要 rehash,数据需要重新计算和迁移,在目前数据量这么大的情况下,会造成整个系统响应速度变慢,甚至服务不可用,所以 hash 算法会限制整个系统的扩展性

3、一致性哈希算法

既然 hash 算法需要根据实际的物理机器取模,会限制系统的扩展性,那么我们想办法让它不进行取模不就行了?这样的算法有很多,主要思想就是无论给出什么数据,算法都能把它映射成等宽的字符串(或者数字),与数据一一对应

一致性哈希算法没有取模的过程,因为取模会受限于模数,模数限制了扩展性。一致性哈希算法要求数据(key)和设备(node)都是要参与 hash 运算的,一般把它抽象成一个环形,称之为哈希环

在这里插入图片描述

Redis 进程实例会映射在哈希环上的某一个点,数据到达的时候也会映射到哈希环上的一个点,然后就会找到最近的、代表 Redis 实例的一个点进行存储

当添加新的 Redis 服务实例的时候,也会映射在哈希环上一个点,代表此物理进程实例,此时映射关系如下:

在这里插入图片描述

优点&#

### Redis Cluster 架构原理与设计 #### 无中心结构的集群模式 Redis-Cluster采用无中心结构,每个节点不仅保存数据还记录着整个集群的状态。这种去中心化的设计使得任何单点都不会成为系统的瓶颈或故障源[^2]。 #### 数据分布策略——虚拟槽分区 为了实现分布式存储并解耦合数据同具体Redis实例之间的关联性,Redis利用了16384个哈希槽的概念来进行键值分配。每当有一个新的Key被写入时,系统会通过特定算法(通常是CRC16)计算该Key对应哪个具体的哈希槽号,并最终决定由哪台服务器负责处理这个Key的操作请求[^5]。 #### 客户端角色的重要性 不同于传统意义上的查询路由方式,在Redis Cluster环境中,客户端扮演了一个更为重要的角色。它们不仅要发起命令调用还要参与到实际的数据定位过程中来。初次访问某个未知资源时,如果指定的目标地址不存在,则返回给客户端一个MOVED响应码告知正确的路径;而后续操作则可以依据之前获取到的信息直接向相应位置发出指令,减少了不必要的跳转次数,提高了整体性能表现[^3]。 #### 集群间通信机制 各个成员之间维持着全互联拓扑形态下的稳定联系渠道,确保能够及时同步彼此间的最新变动情况以及共同维护全局视角下的一致性和可用性水平。此外,针对可能出现的不同步现象设置了专门的纠错流程用于修正错误状态下的slot映射关系,保障业务连续运行不受影响[^4]。 ```python import crcmod.predefined crc16_func = crcmod.predefined.mkCrcFun('crc-ccitt-false') def get_slot(key): """Calculate the hash slot for a given key.""" return crc16_func(key.encode()) % 16384 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值