分布式【一致性Hash算法简介】
一致性Hash是一种特殊的Hash算法,由于其均衡性、持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和memcached都采用了一致性Hash来作为集群负载均衡的方案。
一致性Hash算法简介
在了解一致性Hash算法之前,先来讨论一下Hash本身的特点。普通的Hash函数最大的作用是散列,或者说是将一系列在形式上具有相似性质的数据,打散成随机的、均匀分布的数据。负载均衡正是利用这一特性,对于大量随机的请求或调用,通过一定形式的Hash将他们均匀的散列,从而实现压力的平均化。
举个例子,如果我们给每个请求生成一个Key,只要使用一个非常简单的Hash算法Group = Key % N来实现请求的负载均衡,如下:
不难发现,这样的Hash只要集群的数量N发生变化,之前的所有Hash映射就会全部失效。如果集群中的每个机器提供的服务没有差别,倒不会产生什么影响,但对于分布式缓存这样的系统而言,映射全部失效就意味着之前的缓存全部失效,后果将会是灾难性的。
一致性Hash通过构建环状的Hash空间代替线性Hash空间的方法解决了这个问题,如下图:
整个Hash空间被构建成一个首尾相接的环,使用一致性Hash时需要进行两次映射。
第一次,给每个节点(集群)计算Hash,然后记录它们的Hash值,这就是它们在环上的位置。
第二次,给每个Key计算Hash,然后沿着顺时针的方向找到环上的第一个节点,就是该Key储存对应的集群。
分析一下节点增加和删除时对负载均衡的影响,如下图:
可以看到,当节点被删除时,其余节点在环上的映射不会发生改变,只是原来打在对应节点上的Key现在会转移到顺时针方向的下一个节点上去。增加一个节点也是同样的,最终都只有少部分的Key发生了失效。不过发生节点变动后,整体系统的压力已经不是均衡的了,下文中提到的方法将会解决这个问题。
问题与优化
最基本的一致性Hash算法直接应用于负载均衡系统,效果仍然是不理想的,存在诸多问题,下面就对这些问题进行逐个分析并寻求更好的解决方案。
数据倾斜
如果节点的数量很少,而hash环空间很大(一般是 0 ~ 2^32),直接进行一致性hash上去,大部分情况下节点在环上的位置会很不均匀,挤在某个很小的区域。最终对分布式缓存造成的影响就是,集群的每个实例上储存的缓存数据量不一致,会发生严重的数据倾斜。
缓存雪崩
如果每个节点在环上只有一个节点,那么可以想象,当某一集群从环中消失时,它原本所负责的任务将全部交由顺时针方向的下一个集群处理。例如,当group0退出时,它原本所负责的缓存将全部交给group1处理。这就意味着group1的访问压力会瞬间增大。设想一下,如果group1因为压力过大而崩溃,那么更大的压力又会向group2压过去,最终服务压力就像滚雪球一样越滚越大,最终导致雪崩。
引入虚拟节点
解决上述两个问题最好的办法就是扩展整个环上的节点数量,因此我们引入了虚拟节点的概念。一个实际节点将会映射多个虚拟节点,这样Hash环上的空间分割就会变得均匀。
同时,引入虚拟节点还会使得节点在Hash环上的顺序随机化,这意味着当一个真实节点失效退出后,它原来所承载的压力将会均匀地分散到其他节点上去。
优雅缩扩容
缓存服务器对于性能有着较高的要求,因此我们希望在扩容时新的集群能够较快的填充好数据并工作。但是从一个集群启动,到真正加入并可以提供服务之间还存在着不小的时间延迟,要实现更优雅的扩容,我们可以从两个方面出发:
高频Key预热
负载均衡器作为路由层,是可以收集并统计每个缓存Key的访问频率的,如果能够维护一份高频访问Key的列表,新的集群在启动时根据这个列表提前拉取对应Key的缓存值进行预热,便可以大大减少因为新增集群而导致的Key失效。
具体的设计可以通过缓存来实现,如下:

不过这个方案在实际使用时有一个很大的限制,那就是高频Key本身的缓存失效时间可能很短,预热时储存的Value在实际被访问到时可能已经被更新或者失效,处理不当会导致出现脏数据,因此实现难度还是有一些大的。
历史Hash环保留
回顾一致性Hash的扩容,不难发现新增节点后,它所对应的Key在原来的节点还会保留一段时间。因此在扩容的延迟时间段,如果对应的Key缓存在新节点上还没有被加载,可以去原有的节点上尝试读取。
举例,假设我们原有3个集群,现在要扩展到6个集群,这就意味着原有50%的Key都会失效(被转移到新节点上),如果我们维护扩容前和扩容后的两个Hash环,在扩容后的Hash环上找不到Key的储存时,先转向扩容前的Hash环寻找一波,如果能够找到就返回对应的值并将该缓存写入新的节点上,找不到时再透过缓存,如下图:
这样做的缺点是增加了缓存读取的时间,但相比于直接击穿缓存而言还是要好很多的。优点则是可以随意扩容多台机器,而不会产生大面积的缓存失效。
相关文章:
分布式【一致性Hash算法简介】
一致性Hash是一种特殊的Hash算法,由于其均衡性、持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和memcached都采用了一致性Hash来作为集群负载均衡的方案。 一致性Hash算法简介 在了解一致性Hash算法之前,先来讨论一下Ha…...
PHP命令行脚本接收传入参数的三种方式
1.使用$argv or $argc参数接收,会把文件本身计算在内 $argv: 以数组形式接收保存参数 $argc:保存参数个数 <?php echo "接收到{$argc}个参数"; print_r($argv); //执行 //php /usr/local/php/bin/php test.php 接收到1个…...
【STM32】STM32学习笔记-ADC单通道 ADC多通道(22)
00. 目录 文章目录 00. 目录01. ADC简介02. ADC相关API2.1 RCC_ADCCLKConfig2.2 ADC_RegularChannelConfig2.3 ADC_Init2.4 ADC_InitTypeDef2.5 ADC_Cmd2.6 ADC_ResetCalibration2.7 ADC_GetResetCalibrationStatus2.8 ADC_StartCalibration2.9 ADC_GetCalibrationStatus2.10 A…...
1329:【例8.2】细胞 广度优先搜索
1329:【例8.2】细胞 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 一矩形阵列由数字0 到9组成,数字1到9 代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如: 4 10 0234500067 1034560500 2045600671 00000000…...
9款免费网络钓鱼模拟器详解
根据《2023年网络钓鱼状况报告》显示,自2022年第四季度至2023年第三季度,网络钓鱼电子邮件数量激增了1265%。其中,利用ChatGPT等生成式人工智能工具和聊天机器人的形式尤为突出。 除了数量上的激增外,网络钓鱼攻击模式也在不断进…...
linux cpu、memory 、io、网络、文件系统多种类型负荷模拟调测方法工具
目录 一、概述 二、stress介绍和使用 2.1 介绍 2.2 使用 三、stress-ng介绍和使用 3.1 介绍 3.2 使用 3.3 实例 四、sysbench 4.1 介绍 4.2 使用 五、lmbench 5.1 介绍 5.2 使用 一、概述 今天介绍两款cpu负荷调试工具,用来模拟多种类型的负载。主要用来模拟CPU…...
1018:奇数偶数和1028:I love 闰年!和1029:三角形判定
1018:奇数偶数 要求:输入一个整数,判断该数是奇数还是偶数。如果该数是奇数就输出“odd”,偶数就输出“even”(输出不含双引号)。 输入样例:8 输出样例:even 程序流程图:…...
数据密集型应用系统设计--第2章 数据模型与查询语言
一、引言 数据模型可能是开发软件最重要的部分,而且还对如何思考待解决的问题都有深远的影响。 大多数应用程序是通过一层一层叠加数据模型来构建的。每一层都面临的关键问题是:如何将其用下一层来表示? 1.作为一名应用程序开发人员,观测现实…...
yolo 分割label格式标注信息图片显示可视化查看
参考: https://github.com/ultralytics/ultralytics/issues/3137 https://blog.csdn.net/weixin_42357472/article/details/135218349?spm=1001.2014.3001.5501 需要把坐标信息在图片上显示 代码 1)只画出了坐标边缘 import cv2 import numpy as np from random impor…...
霍兰德职业兴趣测试 60题(免费版)
霍兰德职业兴趣理论从兴趣的角度出发探索职业指导的问题,明确了职业兴趣的人格观念,使得人们对于职业兴趣的认识有了质的变化。在霍兰德职业兴趣理论提出来之前,职业兴趣和职业环境二者分别独立存在,正是霍兰德的总结,…...
MySQL之视图内连接、外连接、子查询
目录 一、视图 1.1 含义 2.1 视图的基本语法 二、案例 三、思维导图 一、视图 1.1 含义 虚拟表,和普通表一样使用 视图(view)是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据…...
以报时机器人为例详细介绍tracker_store和event_broker
报时机器人源码参考[1][2],本文重点介绍当 tracker_store 类型为 SQL 时,events 表的表结构以及数据是如何生成的。以及当 event_broker 类型为 SQL 时,events 表的表结构以及数据是如何生成的。 一.报时机器人启动 [3] Rasa 对话系统启动方…...
理解JavaScript事件循环机制
JavaScript作为前端开发的核心语言之一,其事件循环机制是实现异步编程的关键。本文将深入探讨JavaScript事件循环机制,帮助您更好地理解它是如何工作的,以及如何在前端开发中充分利用这一机制。 1. 什么是事件循环? JavaScript是…...
自定义View之重写onMeasure
一、重写onMeasure()来修改已有的View的尺寸 步骤: 重写 onMeasure(),并调用 super.onMeasure() 触发原先的测量用 getMeasuredWidth() 和 getMeasuredHeight() 取到之前测得的尺寸,利用这两个尺寸来计算出最终尺寸使用 setMeasuredDimensio…...
专为Mac用户设计的思维导图软件MindNode 2023 for Mac助您激发创意!
在现代快节奏的生活中,我们经常需要整理思绪、规划项目、记录灵感。而思维导图作为一种高效的思维工具,能够帮助我们更好地整理和展现思维。现在,我们介绍一款强大而直观的思维导图软件——MindNode 2023 for Mac,助您拓展思维边界…...
Linux命令——用户和权限相关
文章目录 1 用户管理1.1 用户标识符1.2 用户添加1.3 用户删除1.4 用户配置文件1.4.1 passwd文件1.4.2 shadow文件1.4.3 group文件 2 密码管理3 权限管理 1 用户管理 1.1 用户标识符 用户标识符主要是UID和GID,UID表示用户id,GID表示用户组id。在登录的…...
linux反汇编工具: ida pro、rizinorg/cutter; ubuntu 22 flameshot延迟截图 以应对下拉菜单
rizinorg/cutter rizinorg/cutter 是 命令行反汇编工具 rizinorg/rizin 的图形化界面, 这比 ida pro跑在kvm虚拟机中方便多了, ubuntu22.04下直接下载Cutter-v2.3.2-Linux-x86_64.AppImage后即可运行,如下图: 注意 有个同名的报废品: radare2/Cutter 即 radare2的图形化界…...
【INTEL(ALTERA)】使用NiosV/m 处理器,niosv-download 为什么会失败?
说明 在英特尔 Quartus Prime Pro Edition 软件 23.3 版及更高版本中将 Nios V 处理器软件下载到非流水线Nios V/m 处理器时,可能会出现此问题。 这是由于处理器限制,仅影响非流水线Nios V/m 处理器。 以下其他处理器不受此限制的影响: 管道…...
【无线通信专题】NFC通信模式及可能的应用方式
在文章【无线通信专题】NFC基本原理中我们讲到了NFC工作模式。其中NFC工作模式主要有三种,读写模式、卡模拟模式、点对点模式。 NFC通信模式丰富,NFC Forum定义了三种NFC设备:通用NFCForum设备、读写器设备和标签设备。这些NFC设备可以在三种通信模式下运行,并对应用案例进…...
pyinstaller生成的exe文件启动时间漫长的原因
加-F慢的原因是,pyinstaller把所有资源文件包括python解释器的依赖文件和库都打包到exe一个文件中,用户打开时,pyinstaller需要先执行一边解压操作,把依赖文件全部解压出来。慢就慢在这里。 如果不加-F,你会发现那些文…...
保姆级教程:手把手教你安装并激活DevExpress 20.1.3(附资源与注册机使用避坑指南)
深度指南:DevExpress 20.1.3开发环境高效配置与资源管理 在.NET生态系统中,DevExpress始终以其强大的控件库和高效的开发工具占据重要地位。对于刚接触这个工具集的开发者来说,如何快速搭建一个稳定的开发环境往往成为项目启动的第一道门槛。…...
MybatisPlus分页插件PaginationInnerInterceptor原理解析与实战配置指南
MybatisPlus分页插件PaginationInnerInterceptor深度剖析与高效实践 当你在Spring Boot项目中处理海量数据时,分页查询就像给数据装上精准导航——而MybatisPlus的PaginationInnerInterceptor正是这个导航系统的核心引擎。不同于简单配置就能用的工具类,…...
SPIRAN ART SUMMONER优化指南:如何调整参数让生成的图片更符合预期
SPIRAN ART SUMMONER优化指南:如何调整参数让生成的图片更符合预期 1. 理解SPIRAN ART SUMMONER的核心参数 SPIRAN ART SUMMONER作为一款基于Flux.1-Dev模型的图像生成工具,其参数设置直接影响最终输出效果。与普通AI绘画工具不同,它融入了…...
ai辅助stm32开发,向快马描述需求即可获得精准的f103c8t6引脚配置代码
最近在做一个基于STM32F103C8T6的小项目,需要用到UART、I2C、PWM、ADC和GPIO等多种外设。作为嵌入式开发新手,最头疼的就是引脚分配和初始化代码的编写。好在发现了InsCode(快马)平台的AI辅助开发功能,用自然语言描述需求就能得到专业的代码解…...
终极Chrome全页截图指南:一键保存完整网页内容的高效方案
终极Chrome全页截图指南:一键保存完整网页内容的高效方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-ex…...
WWW-万维网
万维网的概念与组成结构万维网(World Wide Web,WWW)是一个分布式的信息存储空间,在这个空间中:一个事物被称为一样 “资源”,并由一个全域 “统一资源定位符”(URL)标识。这些资源通…...
Simulink Simscape传感模块实战指南:从基础到高级应用
1. Simscape传感模块基础入门 第一次接触Simulink Simscape的传感模块时,我完全被那些复杂的参数搞晕了。后来才发现,这些模块其实就是物理系统的"眼睛"和"耳朵",专门用来捕捉机械系统中的各种运动状态和力学特性。举个生…...
告别Python环境依赖!用PyInstaller打包Tkinter/Selenium程序的最佳实践
告别Python环境依赖!用PyInstaller打包Tkinter/Selenium程序的最佳实践 你是否遇到过这样的尴尬场景?精心开发的Python程序在本地运行完美,但分享给同事或客户时,对方却因为缺少Python环境或依赖库而无法使用。尤其当程序涉及图形…...
Easy-Scraper:Rust 构建的现代化网页数据采集解决方案
Easy-Scraper:Rust 构建的现代化网页数据采集解决方案 【免费下载链接】easy-scraper Easy scraping library 项目地址: https://gitcode.com/gh_mirrors/ea/easy-scraper 在数据驱动决策的时代,网页数据采集已成为企业获取市场情报、研究人员收集…...
Agent 性能优化:降低 Token 消耗的 5 个技巧
Agent 性能优化:降低 Token 消耗的 5 个技巧系列文章: 《AI Agent 开发实战》第 7 期 难度等级: ⭐⭐⭐⭐ 预计耗时: 35 分钟🎯 本文目标 学会优化 AI Agent 性能: ✅ 减少 Token 消耗✅ 提高响应速度✅ 降…...
