redis为什么不使用一致性hash

news2024/11/14 13:38:42

Redis节点间通信时,心跳包会携带节点的所有槽信息,它能以幂等方式来更新配置。如果采用 16384 个插槽,占空间 2KB (16384/8);如果采用 65536 个插槽,占空间 8KB (65536/8)。

今天我们聊个知识点为什么Redis使用哈希槽而不是一致性哈希。

先看文章大纲,提前了解本期内容

图片

图片

往期回顾

之前小许用图文并茂的方式用一期内容让大家快速了解了一致性哈希算法,看过的朋友应该还有印象,没看过的朋友可以点击这里看一遍《五分钟了解一致性哈希算法》。

看明白这篇一致性哈希算法基础,会对本期内容有更好的认识和对比性。

这里我们再简单回顾下:

一致性哈希算法就很好地解决了分布式系统在扩容或者缩容时,发生过多的数据迁移的问题。

算法是对 2^32 进行取模运算的结果值虚拟成一个圆环,环上的刻度对应一个 0~2^32 - 1 之间的数值。

通过虚拟节点的方式很好的处理了数据不平衡问题。

图片

图片

不同的计算方式

不知道朋友们记不记得Redis Cluster的实现,也是用了Hash的方式将键值按照一定算法分配到各个节点的,但是却没有使用一致性哈希算法,而是引入了哈希槽的概念!

这是为什么呢?🤔🤔

我们先看下一致性哈希和哈希槽在计算上的区别

图片

图片

图中A、B、C表示的是三个节点,k1和k2表示的是key:

🔔 一致性哈希是经过 hash() 函数计算后对 2^32 取模的值虚拟成一个圆环

🔔 哈希槽是将每个key通过CRC16计算得到一个16bit的值,然后16bit值再对16384取模来决定放置哪个槽

虽说在计算方式上有区别,好像都解决了数据均衡的问题,应该都是不错的选择。

OK,本文将先对Redis集群节点增减时如何进行哈希槽的分配进行分享,再回过头看为什么Redis 集群没有使用一致性hash,而是引入了哈希槽的概念的原因究竟是什么!

Redis Cluster集群

Redis集群是一种分布式数据库方案,通过服务器分片技术进行数据管理,我们来对它进行一个归纳总结。

哈希槽

集群将数据划分为 16384 (2^14)个槽位(哈希槽),每个Redis服务节点分配了一部分槽位,因为槽位的信息存储于每个节点中,客户端请求的key通过CRC16校验后对16384取模来决定放置哪个槽,这样也就定位到指定的节点中。

图片

图片

上图中 key 【小许】和【code】经过 CRC16 计算后再对哈希槽总个数 16384 取模,得到哈希槽位置分别是在888的节点A上和10924的节点C上面。

🚩 重点:每个节点都会记录哪些槽分配给了自己,哪些槽被分配给了其他节点

增加节点

新增一个节点D,redis cluster的这种做法是从各个节点的前面各拿取一部分slot(槽)到D上,会变成这样:

图片

图片

此时服务A、B、C、D通过分配各自有了对应的哈希槽,新增节点后集群会自动进行哈希槽的重新平均分配,比如上图中四个节点中每个节点的槽位数是:18384 / 4 = 4096。

当然这个你使用命令 【cluster addslots】为每个节点自定义分配槽的数量,这里有个特点,如果我们节点的机器性能有差异,那就可以为性能好的,配置更多槽位,更好的利用机器性能。

减少节点

如果减少一个节点C,redis cluster同样会自动进行槽数量的重新计算分配,然后后变成下面样子:

图片

图片

删除节点C之后,此时服务A、B节点中每个节点的槽位数是:18384 / 2 = 8192

客户端访问节点数据

Redis cluster的主节点各自负责一部分槽,我们来看下来自客户端的请求的key是如何定位到具体的节点,然后返回对应的数据的。

图片

图片

来自Redis-Cli客户端的请求连接到的是集群中的任何一个节点

  1. 1. 首先检查当前key是否存在集群中的节点
  • • 通过CRC16(key)/ 16384计算出slot
  • • 查询负责该slot负责的节点是否存在
  1. 1. 在该节点的话就直接就直接返回key对应的结果
  2. 2. 不在该节点的话,那么会 MOVED重定向(包含槽位和目标地址)指引客户端转向至正确的节点,并再次发送之前执行的命令

☀️☀️ 相信你也和小许一样觉得这种方式弊端很明显,每次执行命令前都可能现在Redis节点上进行MOVED重定向才能找到要执行命令的节点,额外增加了IO开销。

✏️ 不过大多数开发语言的Redis客户端都采用 Smart客户端 支持集群协议,让整个访问就更高效。

我们来看下是如何实现的!

smart客户端

开发语言写的Redis客户端都会采用Smart客户端来支持访问集群。

主要是在内部维护哈希槽--节点的映射关系,这样就可以在Smart客户端实现键到节点的查找,避免了再进行MOVED重定向。

不过第一步还是初始化时会选择一个运行节点,初始化槽和节点映射关系。

我们看下图:

图片

图片

上面我们简单讲了下Redis-Cluster中哈希槽和增删节点槽位的转移分配,回归正题。

🚩 为什么Redis是使用哈希槽而不是一致性哈希呢?

有人可能会说是当节点太少时,一致性哈希容易数据分布不均匀更容易导致雪崩。

但是看过我开头分享的一致性哈希文章,通过引入虚拟节点是基本可以避免这个问题的

如果非要说极限情况,那么Redis哈希槽,也有可能某些hash 区间的值特别多,然后导致该节点导访问过于集中的问题。

抛开这些极端情况,通过上面对哈希槽的总结,以下这些是更值得信服的回答:

  • • 当发生扩容时候,Redis可配置映射表的方式让哈希槽更灵活,可更方便组织映射到新增server上面的slot数,比一致性hash的算法更灵活方便。
  • • 在数据迁移时,一致性hash 需要重新计算key在新增节点的数据,然后迁移这部分数据,哈希槽则直接将一个slot对应的数据全部迁移,实现更简单
  • • 可以灵活的分配槽位,比如性能更好的节点分配更多槽位,性能相对较差的节点可以分配较少的槽位

为什么Redis Cluster哈希槽数量是16384?

我们知道一致性哈希算法是对2的32次方取模,而哈希槽是对2的14次方取模

✏️ Redis作者认为这样做不太值得;并且一般情况下一个redis集群不会有超过1000个master节点,所以16k的槽位是个比较合适的选择。

Redis作者的回答在这里:why redis-cluster use 16384 slots? · Issue #2576 · redis/redis

图片

图片

总结起来主要有以下因素

  • • Redis节点间通信时,心跳包会携带节点的所有槽信息,它能以幂等方式来更新配置。如果采用 16384 个插槽,占空间 2KB (16384/8);如果采用 65536 个插槽,占空间 8KB (65536/8)。
  • • Redis Cluster 不太可能扩展到超过 1000 个主节点,太多可能导致网络拥堵。
  • • 16384 个插槽范围比较合适,当集群扩展到1000个节点时,也能确保每个master节点有足够的插槽

这也就是为什么哈希槽的数量是16384了!

一致性hash虚拟节点:深入理解一致性Hash和虚拟节点_一致性hash 虚拟节点-CSDN博客

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

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

相关文章

Llama 3.1 Omni:颠覆性的文本与语音双输出模型

你可能听说过不少关于语言模型的进展,但如果告诉你,有一种模型不仅能生成文本,还能同时生成语音,你会不会觉得特别酷?今天咱们就来聊聊一个相当前沿的项目——Llama 3.1 Omni模型。这个模型打破了传统的文字生成边界,直接让文本和语音同时输出,实现了真正的"多模态…

【mac】MacOS无法打开XXX文件,因为无法验证开发者的问题解决

博主介绍: 大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 技术范围: 目前专注java体系,以及…

OpenCv(一)

计算机视觉和机器视觉的区别 计算机视觉(Computer Vision)和机器视觉(Machine Vision)是两个密切相关但又有区别的领域。两者在应用、技术和目标上都有所不同。 **计算机视觉:**主要是研究如何使计算机能够理解和处理…

单细胞代谢组学数据分析利器---SCMeTA

今天继续进行新的分享,为了支持单细胞代谢研究的严谨性和可重复性 ,今天分享基于时间序列的单细胞代谢数据分析处理工作流程,名为 SCMeTA。它保留了可扩展的接口和插件系统,以适应来自各种仪器的数据。对从 QE-Orbitrap MS 获取的…

2024最新的软件测试面试八股文(答案+文档)

一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计,到开发成功投入使用,并在使用中不断地修改、增补和完善,直到停止该软件的使用的全过程(从酝酿到…

黑马头条APP手工测试项目

1.app有关概念 APP测试范围: 业务功能测试 专项测试:兼容性测试 、安装/卸载/升级测试、交叉事件测试 、push消息推送测试、性能测试、其他测试(用户体验、权限/边界、权限) 功能测试测试对象: 功能点(单…

Linux系统通过libgpiod读写GPIO

本文介绍Linux系统通过libgpiod读写GPIO。 从Linux 4.8后,官方不再推荐使用sysfs操作GPIO,目前,libgpiod是操作GPIO的首选方法。本文以Raspberry Pi 4开发板为例简要介绍通过libgpiod读写GPIO。 1.libgpiod简介 libgpiod是用于Linux环境下…

虚拟机:3、(待更)WSL2安装Ubuntu系统+实现GPU直通

WSL2实现linux子系统GPU直通 安装WSL2和Ubuntu 见https://blog.csdn.net/bule_shake/article/details/135992375 问题:wsl --update进度卡住 如果命令wsl --update进度一直为0,可以先运行wsl --shutdown,然后再次升级。 微软商店打不开、…

[2025]基于微信小程序慢性呼吸系统疾病的健康管理(源码+文档+解答)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

CTFshow——萌新隐写(未完待续)

萌新隐写2 首先暴力破解密码,初始密码设为19000000即可 我用的是ziperello 萌新隐写3 萌新隐写4 word打开 - > 打开设置 - > 隐藏文字 - >flag出现 萌新隐写5 中文转unicode 16进制转字符串 base32解码 萌新隐写6 暂时不会。。。。 隐写1 打开就看到头是…

基于微信小程序的健身房管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的健…

深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 这次目标本来要达到60%,但是却非常稳定的达到了40%,​😢​​😢​​😢​​😢​&am…

鹰眼降尘系统怎么样

鹰眼降尘系统是一种高效、智能且环保的粉尘治理解决方案,其表现优秀,朗观视觉小编认为,主要体现在以下几个方面: 智能化程度高:鹰眼降尘系统集成了先进的图像识别技术和机器学习算法,能够自动识别并跟踪粉尘…

2011年全国硕士研究生入学统一考试计算机科学与技术

1. 试卷背景: 试题:2011年全国硕士研究生入学统一考试计算机科学与技术学科联考中的计算机学科专业基础综合试题。难点:该问题的研究难点在于试题涵盖了计算机科学与技术的多个方面,包括数据结构、算法、计算机组成原理、操作系统…

Amber学习---小分子肽段的MD(第一天)

参考资料:1.科学网—AMBER基础教程B0:AMBER分子动力学模拟入门 - 李继存的博文 (sciencenet.cn) 2.Benjamin D. Madej & Ross Walker, An Introduction to Molecular Dynamics Simulations using AMBER 1 使用wsl(windows的子系统linu…

VirtualBox 网络设置

VirtualBox 是一款非常流行的虚拟化软件,在计算机上创建虚拟环境运行不同操作系统和应用程序。网络设置在 VirtualBox 中至关重要,它决定了虚拟机能否连接到互联网或其他计算机,实现数据传输和共享。 在 VirtualBox 中创建虚拟机时&#xff…

Android15之源码分支qpr、dp、beta、r1含义(二百三十二)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

【算法题】64. 最小路径和-力扣(LeetCode)

【算法题】64. 最小路径和-力扣(LeetCode) 1.题目 下方是力扣官方题目的地址 64. 最小路径和 给定一个包含非负整数的 *m* x *n* 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 **说明:**每次只能向下或者…

提升Windows 7中谷歌浏览器隐私设置的方法

在数字化时代,保护个人隐私变得尤为重要。本文将详细介绍如何通过调整谷歌浏览器的隐私设置来提高您的隐私保护水平。(本文由https://www.liulanqibuluo.com/站点的作者进行编写,转载时请进行标注。)以下是具体的操作步骤&#xf…

有源滤波器UAF42

有源滤波器模块,在电路板上同时实现了低通,高通,带通 滤波器,可选其一进行输出,并可通过改变滑变阻值,轻松调节其滤波器中心频率,Q值,通带增益等, 也可方便实现Butterwo…