详解一致性哈希算法

news2024/11/24 18:30:01

在单机系统中,所有的数据都存储在同一个服务器下,当数据量越来越多的时候,超过了单机存储容量的上限,就需要使用分布式存储系统,在分布式存储系统重,数据会被拆分到不同的存储服务下,减少单机服务的压力。

哈希算法

在分布式系统中,每个节点存储的数据都是不同的。通过使用分布式存储,将数据水平拆分到不同的节点上,新的数据也会分配到新的节点上,比如使用取模方式分配节点,先用hash算法算出hash值,然后使用hash/N,N是节点数,比如三个节点。

  • 取模值=0,分配节点1
  • 取模值=1,分配节点2
  • 取模值=2,分配节点3

如果节点数量是固定的,数据分配方式是固定的,获取数据的方式也是固定,数据也能正常的获取。

如果节点数量发生了变化,新增或者减少节点时,比如新增节点4,原来分配到节点1的数据被分配到节点4,原来的数据映射都无效,数据也无法正常获取了。这就需要使用到一致性哈希算法

一致性哈希

一致性哈希,从名字就能看出来,该算法符合一致性原则,当服务节点数量增加或减少,数据还能正常获取到。那一致性哈希有什么神奇的地方呢?先介绍什么是一致性哈希:

上面是一个哈希环,环上有2^32个节点。和上面取模算法一样,一致性哈希算法也是取模算法,不同的是一致哈希算法是对2^32个节点取模运算,哈希环的节点是固定的,取模运算结果值也是固定的。

  • 数据先进行哈希运算,获取哈希值。
  • 对哈希值对2^32取模运算。

取模后的值一定是在哈希环上。那是如何找到存储的节点呢?答案在环上往顺时针方向找到第一个节点

比如哈希环上,有三个节点,分别是节点1节点2节点3,平均分布在哈希环上:

新增一个数据,先算出来哈希值,确定该数据在哈希环上的位置,然后从这个位置顺时针方向找到第一个节点,就是存储数据的节点。

比如下图中数据key-01,先算出该数据在哈希环的位置,往顺时针方向找到第一个节点,也就是节点1,同理key-02key-03顺时针分别找到节点2节点3

增减节点

增加一个节点之后,比如新增加一个节点4,经过哈希计算获取节点的位置:

可以看到,此时key-01key-03数据不受影响,key-02存储的节点从节点2迁移到了节点4

那减少一个节点,移除节点1:

此时key-02key-03数据不受影响,只有key-01被迁移到节点2

在一致性哈希上,增加或减少节点,影响的节点从新节点逆时针方向到上一个节点的数据。

对服务器节点扩容或者缩容,影响的数据只占整体数据一小部分,对整体系统的影响不大,对于数据准确性要求多的数据则不适用一致性哈希。

数据倾斜

上面数据是均匀的分布在哈希环上,每个节点的存储压力都比较均衡,但是一致性哈希并不能保证数据会平均的分布在各个节点上,当大量的数据都分布在同一个节点上,如下图所示,大量的节点都分布在节点3上:

此时请求访问数据主要是集中在节点3上,而环上的节点服务器配置基本是一致的,不会因为某个服务器压力大,就单独加大某个服务器的配置。节点3数据存储和访问量是其他节点的几倍以上,当请求压力超过了服务处理的上限后,就会导致节点3崩溃,节点3挂了之后,全部数据压力都会转移到节点1,节点1也会宕机,最后形成雪崩。

数据倾斜解决

为了解决数据倾斜问题,一致性哈希算法引入了虚拟节点,一个节点对应多个虚拟节点,上面三个真实节点,每个节点引入3个虚拟节点:

  • 节点1引入三个虚拟节点:1A、1B、1C
  • 节点2引入三个虚拟节点:2A、2B、2C
  • 节点3引入三个虚拟节点:3A、3B、3C

引入虚拟节点之后,环上一共有9个节点:

节点数量多了之后,数据在哈希环上的分布就更加均匀了,就不容易出现上面数据倾斜的问题,当有数据存储到1A虚拟节点,在通过1A虚拟节点就能找到真实节点节点1了。

在实际应用中,虚拟节点的数量远大于上面虚拟节点数量。虚拟节点越多,对应的数据分布就更加的均匀。比如Nginx的一致性哈希算法中的虚拟节点就有160个。

虚拟节点除了使数据分布更加均衡之外,也会极大的提高数据的稳定性,当节点的数量变化时,会有不同的节点分担数据的请求压力,而不会像上面一样,当一个节点挂了,数据全都转到另一个节点上,导致雪崩发生。

总结

  • 常见的哈希算法,先计算出哈希值,再根据服务数量取模(hash%N),将数据存储到固定的服务器下。
    • 当节点增加或者减少,N发生了变化,原来hash%N方式都失效了,数据也无法正常的获取了。
  • 一致性哈希算法就是为了解决节点数量发生变化时,数据一致性的问题。
    • 在一个环上有2^32节点,新增一个数据,先算出来哈希值,然后取模,算出来在环上的位置,往顺时针找到第一个服务节点,就是存储的服务节点。
    • 如果添加或者减少服务,比如服务挂了,或者服务扩容了。只是影响从新的服务节点逆时针方向摘到的第一个服务节点,其他数据不受影响。
  • 哈希环数据分布不均匀时,出现数据倾斜,就需要引入虚拟节点,一个服务节点对应多个虚拟节点,访问数据请求到虚拟节点,再找到对应的真实服务节点。虚拟节点越多,数据的分布就越均衡。同时,新增或者减少节点,会有不同的服务节点分摊压力,使服务更加稳定。

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

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

相关文章

[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 快速排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代…

【Linux】canal1.1.7同步MySQL8.0.3和Redis

目录前言一、MySQL8配置1. 修改my.cnf2. 重启mysql3. 建用户、授权二、Canal服务端配置1. 下载2. 修改配置3. 启动服务与验证三、Canal客户端编写1. yml配置文件添加canal服务端配置信息和Redis信息2. 配置pom文件3. 代码4. MySQL建表storage.storage5. 启动客户端与验证参考前…

中微8S6990使用过程的一些记录--GPIO初始化、定时器、PWM、ADC、休眠等外设的配置和使用

前言 最近把一款产品的代码从新唐MS51移植到了中微8S6990平台上,记录下移植过程遇到的各种情况。 目录前言定时器初始化、中断服务函数GPIO配置ADC模数转换初始化PWM初始化Main函数休眠的一些注意事项最后定时器初始化、中断服务函数 void TMR0_Config(void) {/*(…

keepalived+nginx 双机热备搭建

keepalivednginx 双机热备搭建一、准备工作1.1 准备两台centos7.91.2 nginx 与 keepalived软件 双机安装1.3 ip分配1.4 修改主机名1.5 关闭selinux(双机执行)1.6 修改hosts(双机执行)二、安装keepalived2.1 执行一下命令安装keepa…

MidiaPipe +stgcn(时空图卷积网络)实现人体姿态判断(单目标)

文章目录前言Midiapipe关键点检测stgcn 姿态评估效果前言 冒个泡,年少无知吹完的牛皮是要还的呀。 那么这里的话要做的一个东西就是一个人体的姿态判断,比如一个人是坐着还是站着还是摔倒了,如果摔倒了我们要做什么操作,之类的。…

【模型复现】-alexnet,nn.Sequential顺序结构构建网络

深度卷积神经网络(AlexNet) 在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意。一方面&#…

第五章 事务管理

1.事务概念 *什么是事务:事务是数据库操作最基本单元,逻辑上是一组操作,要么都成功,要么都失败 *事务的特性(ACID):原子性、隔离性、一致性、持久性 2.搭建事务操作环境 *模拟场景&#xff…

uart串口接收模块

uart串口接收模块 1、UART(异步串行接口) 串行通信:指利用一条数据线将资料一位位的顺序传输。   异步通信:以一个字符为传输单位,通信中两个字符间的时间间隔是不固定的,然而在同一个字符的两个相邻位代…

【微信小程序】-- 页面事件 - 下拉刷新(二十五)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…

高盐废水除钙镁的技术解析

高盐废水指含有机物和至少总溶解固体(totaldissolvedsolids,tds)的质量分数大于3.5%的废水,具有水量大,无机盐离子k、na、ca2、mg2、cl-、so42-等含量高,水质水量变化大,成分复杂,难生化降解等特…

2023年中职网络安全竞赛——CMS网站渗透解析

需求环境可私信博主 解析如下: CMS网站渗透 任务环境说明: 服务器场景:Server2206(关闭链接) 服务器场景操作系统:未知 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; Flag:8089

华为套件生态

华为套件生态前言蓝牙设备华为耳机华为鼠标智慧互联超级终端多屏协同远程访问文件共享华为电脑管家我的设备控制中心前言 华为的手机、平板、电脑、耳机、手环、手表等设备可以组成华为生态。以下分享一些生态体验。 蓝牙设备 华为耳机 快速连接 在手机/电脑附近打开华为耳…

里奇RIDGID管线定位仪/探测仪维修SR-20 SR-24 SR-60

美国里奇SeekTech SR-20管线定位仪对于初次使用定位仪的用户或经验丰富的用户,都同样可以轻易上手使用SR-20。SR-20提供许多设置和参数,使得大多数复杂的定位工作变得很容易。此外,当你在不复杂的环境下完成些基本的定位工作时,这…

软件测试7

一 CS和BS软件架构 CS:客户端-服务器端,BS:浏览器端-服务器端 区别总结: 1.效率:c/s效率高,某些内容已经安装在系统中了,b/s每次都要加载最新的数据 2.升级:b/s无缝升级&#xff0c…

【Maven】(五)Maven模块的继承与聚合 多模块项目组织构建

文章目录1.前言2.模块的继承2.1.可继承的标签2.2.超级POM2.3.手动引入自定义父POM3.模块的聚合3.1.聚合的注意事项3.2.反应堆(reactor)4.依赖管理及属性配置4.1.依赖管理4.2.属性配置5.总结1.前言 本系列文章记录了 Maven 从0开始到实战的过程,Maven 系列历史文章清…

三天吃透SpringMVC面试八股文

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…

【操作系统原理实验】命令解释器模拟实现

选择一种高级语言如C/C等,编写一类似于DOS、UNIX中的命令行解释程序。 1)设计系统命名行提示符; 2)自定义命令集(8-10个); 3)用户输入help命令以查找命令的帮助; 4)列出命令的功能,区分内部命令…

fuse文件系统调试环境

libfuse源码:GitHub - libfuse/libfuse: The reference implementation of the Linux FUSE (Filesystem in Userspace) interface 一、ubuntu20.04挂载fuse文件系统 1,安装编译工具 apt install ninja-build apt install meson apt install build-ess…

4. C#语法基础

一、cs文件结构 上面程序的各个部分说明如下: 程序的第一行using System; 其中【using】关键字用于在程序中包含 System 命名空间。一个程序一般有多个 using 语句。程序的第七行是 namespace 声明。一个 namespace 是一系列的类,MyFirstWinFormApp 命名…

SQL语句大全(MySQL入门到精通——基础篇)(基础篇——进阶篇——运维篇)

文章目录前言MySQL——基础篇一、SQL分类二、图形化界面工具三、DDL(Data Definition Language|数据定义语言)1.SQL-DDL-数据库操作2.SQL-DDL-表操作&查询3.SQL-DDL-数据类型3.SQL-DDL-表操作-修改&删除四、DML(Data Manipulation La…