Redis-集群

news/2024/12/23 1:19:28/

Redis-集群

在这里插入图片描述

主从复制和哨兵只能在主节点进行写数据,从节点读取数据,因此本质上,是进行了读写的分离,每个节点都保存了所有的数据,并不能实现一个很好的分布式效果。

1.哈希求余算法

假设有N台主机,对每台主机进行编号[0,N-1]。当请求来的时候,通过hash(key)%N得到机器号,映射到相应的主机上,此种方式实现简单,但是也存在一些问题。如果我们对集群进行扩充,数据的迁移概率会很大。

2.一致性哈希算法

建立一个哈希环[0,231-1,每个节点负责环中的部分内容,hash(key)% 231计算得到哈希值,顺时针找到距离最近的一个节点。当我们对集群进行扩充时,只需要将部分数据迁移。

添加节点过程:

在这里插入图片描述

数据倾斜问题:新增的服务器n4只是减轻了n2节点的压力,但是n1节点和n3节点的压力没有变化,导致节点数据不均匀,造成部分服务器压力过大,为解决这个问题引入虚拟节点机制。

虚拟节点:从物理节点中虚拟出多个节点,不同的虚拟节点映射一个物理节点,然后统一的对数据迁移。

在这里插入图片描述

3.哈希槽算法

定义一个哈希槽,这些槽均匀的分给节点,每个节点持有一个分片(一部分槽位,可以是连续的也可以不是连续的),利用hash_slot = crc16(key)%16384计算key属于哪一个槽位,通过槽位映射到具体属于哪一个分片。

关于16384:在redis cluster中默认是有16384个槽位,槽位的编号是从[0,16384]

  1. 如果槽位定义过多,数据迁移成本会变高,而16384是相对好的选择。
  2. 节点之间通过心跳包进行通信,心跳包中包含了该节点持有的槽位,每个节点都会使用位图的数据结构来存储持有的槽位,一个比特位存储一个槽位,用0/1来区分当前分片是否持有该槽位,也就是只需要16484b = 2KB空间,如果偏大,在频繁的网络传输中,开销也不小。

3.1如何处理客户端请求

每个节点都会保存一份槽位映射表,这份映射表记录了每个槽位所对应的节点。当一个节点收到一个操作请求时,它首先会根据这个请求中的键值计算出这个键所对应的槽位,然后根据槽位映射表将这个操作发送到对应的节点上。

这种机制使得Redis集群中的每个节点都能够协同工作,共同维护集群中的数据一致性。即使在某个节点发生故障的情况下,其他节点也能够通过槽位映射表找到对应的节点,继续提供服务。

3.2扩容集群

增加节点是,集群会通过哈希槽分配策略将一些哈希槽分配给新节点,从而实现集群的扩容。


http://www.ppmy.cn/news/1149048.html

相关文章

计算mask的体素数量

import numpy as np import nibabel as nib # 用于处理神经影像数据的库 # 从文件中加载mask图像 mask_image nib.load(rE:\mask.nii.gz) # 获取图像数据 mask_data mask_image.get_fdata() # 计算非零像素的数量,即白质骨架的体素总数 voxel_count np.count_no…

【vue3+ts】项目初始化

1、winr呼出cmd,输入构建命令 //用vite构建 npm init vitelatest//用cli脚手架构建 npm init vurlatest2、设置vscode插件 搜索volar,安装前面两个 如果安装了vue2的插件vetur,要禁用掉,否则插件会冲突

02 stm32-hal库 timer 基本定时器设定

1.配置始终时钟参数 >2. 初始化 MX_TIM3_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim3);> 3.增加回调函数 4 中断服务函数 void TIM3_IRQHandler(void) {/* USER CODE BEGIN TIM3_IRQn 0 *//* USER CODE END TIM3_IRQn 0 */HAL_TIM_IRQHandler(&…

一种用于肽图分析的烷化剂,Desthiobiotin-Iodoacetamide

中文名:脱硫生物素-碘乙酰胺 英文名:Desthiobiotin-Iodoacetamide 化学式:C14H25IN4O3 分子量:424.28 外观:固体/粉末 规格:10mg、25mg、50mg等(接受各种规格的定制服务,具体可…

webservice接口自动化测试

1&#xff0c;用soupui进行测试 2&#xff0c;安装soupUI 3&#xff0c;测试的时候是给了一个wdsl 操作步诹&#xff1a;new &#xff08;name , 填写地址&#xff09;---导入wsdl文件---看到所有的接口 发送请求的格式<xml> canshu</xml> 应用场景&#xff0c…

JOSEF约瑟 矿用一般型选择性漏电继电器 LXY2-660 Φ45 JKY1-660

系列型号&#xff1a; JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB JJB-380;JJB-380/660 JD-12…

【C++】手撕STL系列——string篇

文章导读 本章我们将参照STL源码&#xff0c;来模拟实现string类&#xff0c;但不一定非要与库中完全相同。我们将其中重要的、常用的接口进行模拟实现&#xff0c;旨在加深string类的学习与记忆。 为了代码更好地复用&#xff0c;本篇模拟的函数接口的顺序大概为构造类——》…

Ubuntu不显示共享文件夹解决方案

Ubuntu不显示共享文件夹 重装的Ubuntu系统&#xff0c;设置共享文件夹之后不显示&#xff0c;解决方法如下&#xff1a; 1、检查共享文件夹设置成功 vmware-hgfsclient如果设置成功会显示设置好的共享文件夹 2、一次性解决方法&#xff08;每次重启都需要执行一次&#xff…