Redis Cluster 集群

embedded/2025/1/18 20:49:42/

1. Redis Cluster 简介

Redis Cluster 是 Redis 官方提供的 Redis 集群功能。

bf12e5f5b0994b89bd196668426696f4.png

 

 

 

为什么要实现 Redis Cluster?

Redis 是单线程的(从网络 I/O 处理到实际的读写命令处理),无论单核 CPU 下内存多大,如果需要大量计算能力,还是需要采用分布式以增加 CPU 资源。

 

随着公司发展,用户数量增多,并发越来越多,业务需要更高的 QPS,而主从复制中单机的 QPS(10W)可能无法满足业务需求。

 

数据量的考虑:现有服务器内存不能满足业务数据的需要时,单纯向服务器添加内存不能达到要求,此时需要考虑分布式需求,把数据分布到不同服务器上。

 

网络流量需求:业务的流量已经超过服务器的网卡的上限值,可以考虑使用分布式来进行分流。

 

离线计算,需要中间环节缓冲等别的需求。

 

Redis Cluster 缺点

当节点数量很多时,性能不会很高。

 

解决方案:使用 smart 智能客户端操作集群达到通信效率最大化。客户端内部负责计算维护键,槽以及节点的映射,用于快速定位到目标节点。智能客户端知道由哪个节点负责管理哪个槽,而且当节点与槽的映射关系发生改变时,客户端也会知道这个改变,这是一种非常高效的方式。

 

集群的限制

key 批量操作支持有限:例如 mget、mset 必须在一个 slot。

 

key 事务和 Lua 支持有限:操作的 key 必须在一个节点。

 

key 是数据分区的最小粒度:不支持 bigkey 分区。

 

不支持多个数据库:集群模式下只有一个 db0。

 

复制只支持一层:不支持树形复制结构。

 

Redis Cluster 满足容量和性能的扩展性,很多业务“不需要”。

 

大多数时客户端性能会“降低”。 命令无法跨节点使用:mget、keys、scan、flush、sinter 等。 Lua 和事务无法跨节点使用。

 

客户端维护更复杂:SDK 和应用本身消耗(例如更多的连接池)。

 

数据分布

为什么要做数据分布?

全量数据,单机 Redis 节点无法满足要求,按照分区规则把数据分到若干个子集当中。

86a903aabf9746559ce4562421018aa6.png

 

 

常用数据分布之顺序分

48d577f11bb24e24bb38910d86d649a4.png

 

 

顺序分区常用在关系型数据库的设计。

 

常用数据分布之哈希分布

 943cc51d2e084b2aaacb89d3799f6d2e.png

 

b552fb8ac4a84fddb9fa09dfd5ca2c1f.png

 4b036cf5573042e9b3c851dcc7ecae3c.png

 

 

虚拟槽分区

虚拟槽分区是 Redis Cluster 采用的分区方式。

 

预设虚拟槽,每个槽就相当于一个数字,有一定范围。每个槽映射一个数据子集,一般比节点数大。

 

Redis Cluster 中预设虚拟槽的范围为 0 到 16383

 

每个 key 通过 CRC16 校验后对 16384 取模来决定这个 key 存放在哪个槽(slot)。

 

 0b42f1a0107e4b8ab487ece1a9f0cc6c.png

 

 

 

步骤:

 

把 16384 个槽按照节点数量进行平均分配,由节点进行管理。

 

对每个 key 按照 CRC16 规则进行 hash 运算。

 

把 hash 结果对 16383 进行取余。

 

把余数发送给 Redis 节点。

 

节点接收到数据,验证是否在自己管理的槽编号的范围。

 

如果在自己管理的槽编号范围内,则把数据保存到数据槽中,然后返回执行结果。

 

如果在自己管理的槽编号范围外,则会把数据发送给正确的节点,由正确的节点来把数据保存在对应的槽中。

 

 需要注意的是:Redis Cluster 的节点之间会共享消息,每个节点都会知道是哪个节点负责哪个范围内的数据槽。

 

虚拟槽分布方式中,由于每个节点管理一部分数据槽,数据保存到数据槽中。当节点扩容或者缩容时,对数据槽进行重新分配迁移即可,数据不会丢失。

 

虚拟槽分区特点:

 

使用服务端管理节点、槽、数据。例如 Redis Cluster。

 

 


http://www.ppmy.cn/embedded/155038.html

相关文章

25/1/17 嵌入式笔记 STM32F103

#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h"uint8_t RxData; //定义用于接收串口数据的变量int main(void) {/*模块初始化*/OLED_Init(); //OLED初始化/…

ubuntu20.04 docker安装

Ubuntu | Docker DocsPost-installation steps | Docker Docs # 创建目录 sudo mkdir -p /etc/docker # 写入配置文件 sudo tee /etc/docker/daemon.json <<-EOF { "registry-mirrors": [ "https://docker-0.unsee.tech", &qu…

下载文件,浏览器阻止不安全下载

背景&#xff1a; 在项目开发中&#xff0c;遇到需要下载文件的情况&#xff0c;文件类型可能是图片、excell表、pdf、zip等文件类型&#xff0c;但浏览器会阻止不安全的下载链接。 效果展示&#xff1a; 下载文件的两种方式&#xff1a; 一、根据接口的相对url&#xff0c;拼…

某讯一面,感觉问Redis的难度不是很大

前不久&#xff0c;有位朋友去某讯面试&#xff0c;他说被问到了很多关于 Redis 的问题&#xff0c;比如为什么用 Redis 作为 MySQL 的缓存&#xff1f;Redis 中大量 key 集中过期怎么办&#xff1f;如何保证缓存和数据库数据的一致性&#xff1f;我将它们整理出来&#xff0c;…

HBase深度历险

作者&#xff1a;京东物流 于建飞 简介 HBase 的全称是 Hadoop Database&#xff0c;是一个分布式的&#xff0c;可扩展&#xff0c;面向列簇的数据库&#xff0c;是一个通过大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案。本文会像剥洋葱一样&#xff0c…

如何使用Python将长图片分隔为若干张小图片

如何使用Python将长图片分隔为若干张小图片 1. Python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项6. 其他文章链接快来试试吧&#x1f60a; 1. Python需求的任务 _ 使用Python将长图片分隔为若干张小图片 我有如下的一张长图片 想要将其分割为若…

C#里await Task.Run死锁的分析与解决

一段如下的代码,它是必然死锁的: private void button1_Click(object sender, EventArgs e){Task<string> res = GetResAsync();textBox1.Text = res.Result;}private async Task<string> GetResAsync(){string t = await Task.Run(() => {Thread.Sleep(10…

前缀和 (一维 二维)

前缀和作用&#xff1a; 快速求出原数组中一段数组的和 思路 1.预处理前缀和数组 2.用公式求区间和 公式&#xff1a; 二维前缀和&#xff1a; s [ i ] [ j ] s[ i - 1 ] [ j ] s[ i ] [ j - 1 ] - s [ i - 1 ] [ j - 1]; 题型 一维 二维 题解 一维 #include <iost…