【redis】一致性hash算法和hash槽

普通hash取模

直接hash(key)%N , N为机器的数量,但不利于集器扩容或者缩容

一致性hash算法和hash槽

一致性hash算法是在redis 分片中使用,hash槽在redis cluster(集群)中使用

Redis一致性hash:Redis一致性hash是为了解决分布式环境下,数据分片的问题。在Redis集群中,数据是分布在不同的节点上的,这个过程就是数据分片。

Hash槽:在Redis中,数据是以hash槽的形式存储在不同的节点上的。Redis会根据key和节点的数量进行hash运算,然后将得到的结果对节点数量进行取模运算,最终得到的结果就是该key应该存储的hash槽。

一致性hash算法

应用场景:分布式缓存系统

Redis一致性hash是为了解决分布式环境下,数据分片的问题。在Redis集群中,数据是分布在不同的节点上的,这个过程就是数据分片

hash环

一致性hash是指将 “存储节点” 和 “数据” 都映射到一个首尾相连的hash环上。如果增删节点,仅影响该节点在hash环上顺时针相邻的后继节点,其他数据不会受到影响。
在这里插入图片描述

第一步:对存储节点进行哈希计算,也就是对存储节点做哈希映射,比如根据节点的 IP 地址进行哈希
假设有四个节点 Node A、B、C、D,经过 ip 地址的哈希计算,它们的位置如下:
在这里插入图片描述

第二步:当对数据进行存储或访问时,对数据进行哈希映射;
有4个存储对象 Object A、B、C、D,经过对 Key 的哈希计算后,它们的位置如下:
在这里插入图片描述

如何确定数据位于hash环上的位置?

对于各个 Object,它所真正的存储位置是按顺时针找到的第一个存储节点。例如 Object A 顺时针找到的第一个节点是 Node A,所以 Node A 负责存储 Object A,Object B 存储在 Node B。

一致性哈希算法大概如此,那么它的容错性和扩展性如何呢?

假设 Node C 节点挂掉了,Object C 的存储丢失,那么它顺时针找到的最新节点是 Node D。也就是说 Node C 挂掉了,受影响仅仅包括 Node B 到 Node C 区间的数据,并且这些数据会转移到 Node D 进行存储。

在这里插入图片描述
同理,假设现在数据量大了,需要增加一台节点 Node X。Node X 的位置在 Node B 到 Node C 直接,那么受到影响的仅仅是 Node B 到 Node X 间的数据,它们要重新落到 Node X 上。

一致性Hash算法使用 “取模法”,且是对 2^ 32次方取模,其可表示的范围为:0 ~ 2^32-1

与普通的hash算法有何不同?

普通的hash算法是对节点数进行hash,而一致性hash是对固定值 2^32 进行取模

易产生问题:数据倾斜

但是一致性哈希算法不能够均匀的分布节点,会出现大量请求都集中在一个节点的情况,在这种情况下进行容灾与扩容时,容易出现雪崩的连锁反应。

当在服务器节点数量太少的时候,容易出现分布不均而导致数据倾斜。
在这里插入图片描述

数据倾斜解决方法:虚拟节点映射

为了解决一致性哈希算法不能够均匀的分布节点的问题,就需要引入虚拟节点,对一个真实节点做多个副本。不再将真实节点映射到哈希环上,而是将虚拟节点映射到哈希环上,并将虚拟节点映射到实际节点,所以这里有「两层」映射关系。

映射关系:缓存数据 ➜ 虚拟节点 ➜ 真实节点

虚拟节点映射物理节点,redis哈希槽的数量是16384个,redis cluster采用的是 CRC16(key) % 16384 算法

个人理解:其实也就是通过构造大量的虚拟节点映射,使得当向redis集群中存储k-v时,hash取模的值可以更大,这样对数据取模后的结果也就更加分散(所有数据穿插分散在不同真实节点上)!

在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

具体做法:可以在服务器IP或主机名的后面增加编号来实现,例如上面的情况,可以为每个服务节点增加三个虚拟节点,于是可以分为:RedisService1#1、 RedisService1#2、 RedisService1#3、 RedisService2#1、 RedisService2#2、 RedisService2#3

对于hash环来说,节点越多,数据分布越平稳。所以采用虚拟节点的方式,将一个节点虚拟成多个节点,保证环上有1000~2000个节点最佳。

一般10个Redis服务器的集群,每个节点可以虚拟100-200个节点,保证环上有1000-2000个节点

一般5个Redis集群,则每个节点虚拟200-400个节点,保证节点数是1000-2000之间,这样才能保证数据分布均衡

引入虚拟节点后,会提高节点的均衡度,还会提高系统的稳定性。

优点

一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。

新增服务器节点/删除服务器节点: 在hash环中新增服务器,也是通过hash算法确认分布,只需要移动一小部分数据即可;移除也是同理

应用

在redis集群(主从、哨兵)、缓存中间件memcached中都有使用到它

hash槽

基本概念:槽可以理解为分区,数据都是存放在分区中的,然后分区与机器进行动态绑定。

redis-cluster把所有的“物理节点”映射到 [0-16383] 槽上(不一定是平均分配),cluster 负责维护node ⇌ slot ⇌ value。

redis集群(cluster)并没有选用上面一致性哈希,而是采用了哈希槽(slot)的这种概念。主要的原因就是上面所说的,一致性哈希算法对于数据分布、节点位置的控制并不是很友好。

在这里插入图片描述

产生原因

如果Redis只用复制功能做主从,那么当数据量巨大的情况下,单机情况下可能已经承受不下一份数据,更不用说是主从都要各自保存一份完整数据。在这种情况下,数据分片是一个非常好的解决办法。因此可以借助hash槽自动对数据分片,并落到各个节点上分散存储。通过为每个节点指派不同数量的槽,可以控制不同节点负责的数据量和请求数。

hash方式:一个redis集群包含 16384 个哈希槽,数据库中的每个数据都属于这16384个哈希槽中的一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽。一个redis节点包含N个槽,数据通过hash算法哈希到固定的槽里,所以槽只是决定了数据的存放位置,当多个数据hash出来的结果相同时,他们就被分配到相同的槽里,即也会映射到相同的服务节点上。

一致性hash算法和hash槽的本质区别

其实哈希槽的本质和一致性哈希算法非常相似,不同点就是对于哈希空间的定义。一致性哈希的空间是一个圆环,节点分布是基于圆环的,无法很好的控制数据分布。而 redis cluster 的槽位空间是自定义分配的,类似于 windows 盘分区的概念。这种分区是可以自定义大小,自定义位置的。

为什么redis集群不采用一致性哈希算法?

一致性哈希的节点分布基于圆环,无法很好的手动控制数据分布,比如有些节点的硬件差,希望少存一点数据,这种很难操作(还得通过虚拟节点映射,总之较繁琐)。
而redis集群的槽位空间是可以用户手动自定义分配的,类似于 windows 盘分区的概念,可以手动控制大小。例如机器硬盘小的,可以分配少一点槽位,硬盘大的可以分配多一点。
其实,无论是一致性哈希还是哈希槽的方式,在增减节点的时候,都会对一部分数据产生影响,都需要我们迁移数据,当然,redis集群也提供了相关手动迁移槽数据的命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1488400.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Idea如何查看Maven依赖树

1、使用idea自带的功能查看依赖树 2、使用Maven Helper插件 https://zhuanlan.zhihu.com/p/699663369

指针数组模拟二维数组

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 指针数组&#xff0c;是数组&#xff0c;但是它的元素都是指针。 #define _CRT_SECURE_NO_WARNING #include <stdio.h> int main(void) {int a 3;int b 4;int c 5;int* arr[3] { &a,&b,…

Springboot集成Elasticsearch High Level REST Client实现增删改查实战

获取源码&#x1f6a9; 需要完整代码资料&#xff0c;请一键三连后评论区留下邮箱&#xff0c;安排发送&#xff01;&#xff01;&#xff01;&#x1f916; 什么是High Level REST Client&#xff1f; Elasticsearch 的 High Level REST Client 是一个用于与 Elasticsearch…

2024安全大模型技术与市场研究报告

大模型驱动的AIGC引发技术革命&#xff0c;国资委强调国企需加大AI投入。大模型解决网络安全行业攻防不对等问题&#xff0c;国内外企业纷纷推出基于大模型的网络安全产品&#xff0c;AI将改变网络安全产品格局。 自 2022 年底开始&#xff0c;以 LLM(大语言模型&#xff0c;简…

python-实践简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数&#xff1a; import pygame import time import random 游戏源码&#xff1a; import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…

{Spring Boot 原理篇} Spring Boot自动装配原理

SpringBootApplication 1&#xff0c;Spring Boot 应用启动&#xff0c;SpringBootApplication标注的类就是启动类&#xff0c;它去实现配置类中的Bean的自动装配 SpringBootApplication public class SpringbootRedis01Application {public static void main(String[] args)…

计算word文件打印页数 VBA实现

目录 场景复现环境说明实现原理计算当前文件夹下所有word文件页数总和利用递归计算当前文件夹所有work文件页面数量几个BUG计算结果软件报价后话 场景复现 最近需要帮我弟打印高考资料&#xff0c;搜集完资料去网上打印&#xff0c;商家发出了这个计算页数的界面。我就好奇怎么…

vscode回退不显示了,不方便操作

一、后退前进按钮 顶部显示&#xff0c;方便调试 <—— ——> 文件-> 首选项 -> 设置->commandcenter->勾选 Window: Title Bar Style->custom 将native —>custom

【Tomcat】Mac M3 Pro安装Tomcat7

文章目录 下载配置环境变量修改权限启动和关闭 下载 官网&#xff1a;https://tomcat.apache.org/ cd ~/Library tar -zxvf /Users/用户名/Downloads/apache-tomcat-7.0.99.tar.gz mv apache-tomcat-7.0.99 ~/Library/tomcat配置环境变量 vi ~/.bash_profileexport TOMCAT…

Oracle核心进程详解并kill验证

Oracle核心进程详解并kill验证 文章目录 Oracle核心进程详解并kill验证一、说明二、核心进程详解2.1.PMON-进程监控进程2.2.SMON-系统监控进程2.3.DBWn-数据库块写入进程2.4. LGWR-日志写入器进程2.5. CKPT-检查点进程 三、Kill验证3.1.kill ckpt进程3.2.kill pmon进程3.3.kill…

【OpenCV C++20 学习笔记】操作图片

操作图片 概述图片的导入和保存对导入的图片的操作获取像素值Point类型和图片像素 内存管理和引用计数一些简便操作图片可视化更精确的类型转换 概述 在本专栏的第一篇文章中就介绍了一个用OpenCV处理图片的实例&#xff08;《图片处理基础》&#xff09;&#xff0c;这篇文章…

破局产品同质化:解锁3D交互式营销新纪元!

近年来&#xff0c;随着数字体验经济的蓬勃发展&#xff0c;3D交互式营销作为一种创新手段迅速崛起&#xff0c;它巧妙地解决了传统产品展示中普遍存在的缺乏差异性和互动性的问题&#xff0c;使您的产品在激烈的市场竞争中独树一帜&#xff0c;脱颖而出。 若您正面临产品营销…

杭州东网约车管理再出行方面取得的显著成效

随着科技的飞速发展&#xff0c;网约车已成为人们日常出行的重要选择。在杭州这座美丽的城市&#xff0c;网约车服务更是如雨后春笋般蓬勃发展。特别是杭州东站&#xff0c;作为杭州的重要交通枢纽&#xff0c;网约车管理显得尤为重要。近日&#xff0c;沧穹科技郑重宣告已助力…

photoshop学习笔记——选区2 套索工具

套索工具 快捷键 L shift L 在3中套索工具间切换 套索工具有3种 套索工具 按下鼠标左键绘制选取&#xff0c;松开后自动闭合&#xff0c;完成选取绘制 多边形套索工具 按下鼠标左键绘制定位点&#xff0c;点与点之间用直线连接&#xff0c;使用back键删除上一个点&#x…

外行对自动驾驶汽车的一些想法-2024-

起源 前段时间有关于自动驾驶汽车的讨论&#xff0c;现在热度终于快过去了。 (⊙﹏⊙) 其实&#xff0c;完全不用担心自动驾驶取代人类。 引用 这是一篇24年4月的报道。 上图为引用&#xff0c;可以看到打工人的忙碌。 2023 一个热爱自动驾驶但妥妥外行之人的思考-2023-C…

Pytorch使用教学7-张量的广播

PyTorch中的张量具有和NumPy相同的广播特性&#xff0c;允许不同形状的张量之间进行计算。 广播的实质特性&#xff0c;其实是低维向量映射到高维之后&#xff0c;相同位置再进行相加。我们重点要学会的就是低维向量如何向高维向量进行映射。 相同形状的张量计算 虽然我们觉…

基于dcm4chee搭建的PACS系统讲解(三)服务端使用Rest API获取study等数据

文章目录 DICOMWeb Support模块主要数据结构ER查询信息基本信息metadata信息统计信息 实践查询API及参数解析API返回的json数组定义VRObjectNodeObjectMapper解析显示指定tag并解析 后记 前期预研的PACS系统&#xff0c;近期要在项目中上线了。因为PACS系统采用无权限认证&…

EtherNet/IP转Profinet协议网关(经典配置案例)

怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题&#xff0c;作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为JM-PN-EIP&#xff0c;下面是详细介绍。 一&#xff0c;设备主要功能 1、捷米特J…

霍尔传感器介绍

霍尔传感器概述 霍尔传感器是一种基于霍尔效应原理的传感器&#xff0c;‌广泛应用于各种电子和工业领域。‌ 霍尔传感器的工作原理基于霍尔效应&#xff0c;‌即当电流通过一个位于磁场中的导体时&#xff0c;‌在导体两侧会产生电势差。‌这种效应由美国物理学家爱德华霍尔…

“真互动”线上艺术空间,为艺术展览注入新活力!

在数字技术蓬勃发展的浪潮中&#xff0c;线上艺术展览作为艺术界的一股新兴力量&#xff0c;正以其独特的魅力重塑展览形态。相较于传统线下艺术展的复杂筹备与地域限制&#xff0c;线上艺术展凭借其高效的时间空间利用、无界限的沉浸式探索&#xff0c;赋予观众前所未有的艺术…