当前位置: 首页 > article >正文

系统设计:一致性哈希

原文towardsdatascience.com/system-design-consistent-hashing-43ddf48d2d32https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/25fd590876caa1d6c711fa521ea11f98.png简介我们生活在一个每天都会大量生成数据的世界上。在大公司中实际上不可能将所有数据存储在单个服务器上。这就是为什么我们需要水平扩展即每个数据部分都存储在单独的服务器上。与我们可以在一个地方简单地存储所有数据的垂直扩展相反在水平扩展中组织存储以实现不同服务器上数据的快速访问至关重要。通过了解简单系统实现的性能劣势我们将设计一个具有弹性的系统以减轻提到的问题。在系统设计中我们将使用的原则被称为一致性哈希。问题假设我们有 n 个需要存储在 k 个不同服务器上的数据对象。服务器的配置可能会随时间变化任何服务器都可以关闭可以向系统中添加新的服务器。考虑到这些潜在的配置更改我们必须设计一个系统该系统可以快速检索所需的数据块并在配置更改的情况下在服务器之间传输数据。简单实现简单实现包括根据哈希函数在不同服务器之间分配数据。例如当我们需要向我们的系统添加新的数据块时我们将它的键插入到哈希函数中该函数输出这个块将属于哪个服务器。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7b3e567cc0c4844806ce974d4503ab76.png基于哈希函数的数据分布。数据根据相应的哈希值存储在服务器上。当我们需要从给定的键检索信息时我们计算其哈希值以确定与该键关联的信息存储在哪个服务器上。在实现此类系统时确保哈希函数均匀分布数据非常重要以便每个服务器存储的数据量大致相同。这个系统在对其进行更改之前运行良好。例如想象一下上面的例子中服务器 S3 被关闭我们无法访问其数据并且将哈希到其桶中的新数据将不会被添加。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/da42dd1417c4552b89fa4ca31f933a09.png每当任何服务器关闭时其数据将不再可访问。唯一可能的解决方案是将所有数据块重新分配到服务器上。由于我们现在有 k-1 个服务器我们不应忘记在哈希函数中的余数必须减少 1。如果向系统中添加新服务器也会发生类似的场景。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/662a75794fc3630bb1741b0d64cfd34b.png在任何系统配置更改的情况下所有数据都需要重新分配。不幸的是数据重新分配是一个资源消耗的操作。在大量数据和频繁配置更改的情况下这种存储系统变得非常低效。一致性哈希一致性哈希是上述系统的优秀替代方案在配置更改的情况下具有更高的容错性。一致性哈希不仅对数据进行哈希也对服务器进行哈希。数据键和服务器被哈希到同一组值[0, n]。为了更容易理解和可视化让我们想象所有的哈希值都位于一个环或时钟上。每个服务器都有自己的哈希范围。服务器哈希范围定义为哈希环上位于服务器哈希值之前和位于逆时针方向上另一个最近服务器哈希值之后的所有哈希值的区间。要确定某个键属于哪个服务器我们需要从键的哈希值开始顺时针方向移动直到我们达到对应于某个服务器的哈希值。该服务器将存储该键的数据。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/df45486af39d7eb0cdfc435956326d61.png哈希环示例。服务器 S1 的哈希范围用蓝色表示。服务器哈希值应存储在其他地方并按升序排列以便可以快速访问。使用二分搜索这使我们能够在 O(log S)的时间内找到存储给定键的服务器S 是服务器数量。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f946dffa0c1970a52ca62e51b49cdc8e.png使用一致性哈希可以以 O(log S)的时间复杂度找到与给定键关联的服务器编号其中 S 是服务器总数。关闭服务器如果任何服务器关闭我们只需简单地删除与该服务器关联的哈希值并将该服务器上的数据仅**转移到顺时针方向的下一个服务器。与简单哈希相比这是一致性哈希的一个巨大优势因为我们不再需要像以前那样重新分配所有数据。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/53b29d6fca78fcb8c3ae364b76d5c6b1.png从上面的例子中关闭服务器 S1 只需要转移之前存储在该服务器上的数据。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fcda44a388c46ab6817a4101357490f7.png关闭 S1 后服务器 S2 扩展了其哈希范围。添加新服务器如果需要向系统中添加新服务器那么我们只需要转移所有与位于新服务器哈希值和逆时针方向最近服务器哈希值之间哈希值相关联的数据。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/72dc699ce47dbb473d64c4c12c242d01.png向系统中添加新服务器 S4。只有存储在 S0 上的一部分数据需要转移到 S4。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/99ae4a446f3fccb30e2ff82485975ecd.png添加 S4 后它占用了之前属于 S0 的一些相关哈希值。不均匀分布虽然一致性哈希似乎对各种配置更改具有弹性但可能会出现数据在服务器之间不均匀分布的时刻。首先这可能是由于选择的哈希函数。实际上我们无法保证它将均匀地为数据生成键。因此这可能导致服务器具有非常不成比例的哈希范围长度。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5eacfacf129e2543e74e21555ce40cc9.png即使在某一时刻数据分布均匀随着各种配置的改变它可能会迅速变得不均匀。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a4a61d500cfc8b33b4f391b07c491604.png随着不均匀分布的增加平均响应时间成比例变长。缓解此问题的可能方法之一是在分布变得倾斜时定期在系统中重新分配所有数据可能使用另一个哈希函数。虽然有时这可能是一个解决方案但当有数百万或数十亿数据对象时这仍然不是最佳方案。虚拟节点虚拟节点是构成哈希的扩展它使得系统更能抵抗不均匀的数据分布。这个想法包括对每个服务器进行多次哈希使用不同的哈希函数。每个服务器的总哈希范围定义为与其所有键相关联的哈希范围的并集。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ce9e2f688551960704a1e8387c78bd08.png使用虚拟节点的一致性哈希。哈希环上的每种独特颜色对应一个服务器。关闭服务器意味着删除与该服务器相关联的所有虚拟节点。该服务器上的所有数据都将转移到其他多个服务器。当添加新服务器时其虚拟节点的所有哈希值应通过之前用于其他服务器的哈希函数来计算。在现实中虚拟节点的数量通常比上面的例子中多得多。一方面随着虚拟节点数量的增加哈希范围在平均上变得更加对齐。另一方面执行与配置变化相关的标准操作需要更多的时间。此外还需要存储关于虚拟节点的额外元数据。在大多数情况下根据给定问题、可用服务器数量和数据量来选择虚拟节点的数量是更好的。当难以估计一个合适的数字时建议调整此参数以找到完美的权衡。应用一致性哈希具有广泛的应用范围。大多数情况下它用于分布式应用程序尤其是在存储大量数据的数据库中这些数据分布在多个服务器上。一些最流行的例子包括Apache Cassandra– 分布式 NoSQL 列数据库Amazon Dynamo DB– 分布式 NoSQL 键值数据库Discord– 视频和聊天应用程序。结论随着分布式系统的兴起一致性哈希开始迅速获得人气。通过能够抵抗频繁的配置变化它提供了一个简单而有效的解决方案用于跨不同集群划分数据。同时虚拟节点数作为一个重要的参数使得一致性哈希能够更好地适应大多数系统设置。资源一致性哈希 | 维基百科除非另有说明所有图像均为作者提供。

相关文章:

系统设计:一致性哈希

原文:towardsdatascience.com/system-design-consistent-hashing-43ddf48d2d32 https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/25fd590876caa1d6c711fa521ea11f98.png 简介 我们生活在一个每天都会大量生成数据的世界上。在…...

系统设计:布隆过滤器

原文:towardsdatascience.com/system-design-bloom-filter-a2e19dcd4810 https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/350b777cef6f9090c441e88a64b5066c.png 简介 哈希表是最广为人知和使用的几种数据结构之一。通过明智…...

Ro_一键获取E盾验证后台

链接:https://pan.quark.cn/s/a876e818b593软件来源网络,安全性自测。需要自己查找辅助IP...

Flutter 路由导航完全指南

Flutter 路由导航完全指南 引言 路由导航是任何移动应用的核心功能之一。Flutter 提供了强大而灵活的路由系统,支持多种导航方式。本文将深入探讨 Flutter 路由导航的各种技巧和最佳实践。 基础导航 Navigator.push Navigator.push(context,MaterialPageRoute(…...

Flutter 性能优化完全指南

Flutter 性能优化完全指南 引言 性能优化是移动应用开发中至关重要的一环。Flutter 虽然天生具有较好的性能表现,但在复杂应用中仍需要开发者进行针对性优化。本文将深入探讨 Flutter 性能优化的各种技巧和最佳实践。 性能问题定位 使用 DevTools // 在 pubspec.yam…...

CSS 渐变高级技巧完全指南

CSS 渐变高级技巧完全指南 引言 CSS 渐变是现代 Web 设计中不可或缺的视觉效果,它可以创建平滑的颜色过渡,为网页增添丰富的视觉层次。本文将深入探讨 CSS 渐变的各种类型和高级技巧。 基础语法回顾 线性渐变 .linear-gradient {background: linear-grad…...

Flutter 状态管理架构设计完全指南

Flutter 状态管理架构设计完全指南 引言 状态管理是 Flutter 应用开发的核心问题之一。一个好的状态管理架构能够使代码更加清晰、可维护和可测试。本文将深入探讨 Flutter 状态管理的各种架构模式和最佳实践。 状态管理概述 Flutter 中的状态可以分为以下几类: 局部…...

从《飞机大战》项目倒推环境搭建:手把手教你为Python 3.8+配置Pygame开发环境(Windows版)

从《飞机大战》项目倒推环境搭建:手把手教你为Python 3.8配置Pygame开发环境(Windows版) 当你决定用Python开发一个《飞机大战》游戏时,第一步不是急着写代码,而是搭建一个能跑起来的环境。这就像盖房子前要先打地基—…...

如何永久保存微信聊天记录:一个开源工具的全方位解决方案

如何永久保存微信聊天记录:一个开源工具的全方位解决方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/We…...

B样条曲线入门:从‘节点向量’这个硬骨头啃起,理解平滑背后的数学

B样条曲线入门:从‘节点向量’这个硬骨头啃起,理解平滑背后的数学 当你第一次看到B样条曲线时,可能会被那些复杂的数学公式和术语吓到。但别担心,我们今天要聊的"节点向量"(Knot Vector)概念&…...

别再只用XGBoost了!LightGBM实战:用直方图算法和Leaf-wise策略,5分钟搞定海量数据建模

LightGBM实战:5个关键技巧让海量数据建模效率提升10倍 当你的数据集从GB级别跃升到TB级别时,XGBoost的训练时间可能从几小时延长到几天。上周我们团队处理一个包含3亿条用户行为记录的数据集时,原本需要8小时的XGBoost训练,切换到…...

手把手教你用GD32F407和LWIP实现一个简易网络调试助手(UDP/TCP双模)

基于GD32F407与LWIP的智能网络调试工具开发实战 在嵌入式设备网络化需求日益增长的今天,如何快速构建一个稳定可靠的网络通信调试工具成为许多工程师面临的挑战。GD32F407作为国产MCU的优秀代表,搭配轻量级TCP/IP协议栈LWIP,能够为各类工业控…...

终极兼容方案:让老旧游戏手柄在现代游戏中重获新生

终极兼容方案:让老旧游戏手柄在现代游戏中重获新生 【免费下载链接】XOutput DirectInput to XInput wrapper 项目地址: https://gitcode.com/gh_mirrors/xo/XOutput 还在为那些功能完好却被现代游戏抛弃的经典游戏手柄感到惋惜吗?我们深知那种无…...

如何快速部署Windows系统:MediaCreationTool.bat终极实战指南

如何快速部署Windows系统:MediaCreationTool.bat终极实战指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...

告别乱码困扰:GBKtoUTF-8编码转换工具全方位指南

告别乱码困扰:GBKtoUTF-8编码转换工具全方位指南 【免费下载链接】GBKtoUTF-8 To transcode text files from GBK to UTF-8 项目地址: https://gitcode.com/gh_mirrors/gb/GBKtoUTF-8 你是否曾遇到过这样的场景?从旧系统导出的文档在Mac上打开变成…...

OpenHarmony.Avalonia 归档事件对中国自主软件生态的影响--信任的坍塌与生态的异化

026年5月8日,中国开源技术社区发生了一起具有里程碑意义的争议性事件:由开发者“布布”(Bubu)主导的 OpenHarmony-NET/OpenHarmony.Avalonia 项目正式宣告停止更新并进入归档状态。这一决定不仅标志着一个由民间力量驱动的底层基础…...

超实用!电机、仪表盘、流动条…一个专为工控量身打造的 WinForm 控件库

前言在.NET 开发中,WinForm 虽然早已不是"新潮"的代名词,却依然活跃在大量工业控制、设备配套和企业内部系统中。原因很简单:稳定、轻量、部署简单,尤其适合对图形性能要求不高但对兼容性和可靠性要求极高的场景。然而&…...

【仅限大会注册用户获取】大模型版本血缘图谱自动生成工具链(含开源PoC),奇点智能大会现场演示后即刻下线

更多请点击: https://intelliparadigm.com 第一章:大模型版本管理策略:奇点智能大会 在2024年奇点智能大会上,大模型版本管理被确立为AI工程化落地的核心基础设施。与传统软件版本控制不同,大模型版本需同时追踪代码、…...

Windows平台Android开发环境自动化部署:ADB与Fastboot驱动智能安装工具技术解析

Windows平台Android开发环境自动化部署:ADB与Fastboot驱动智能安装工具技术解析 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitc…...

罗技PUBG压枪宏技术深度解析:硬件级输入控制的演进与挑战

罗技PUBG压枪宏技术深度解析:硬件级输入控制的演进与挑战 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在FPS游戏竞技生态中&#…...

如何用nmrpflash拯救你的Netgear路由器:终极免费救援指南

如何用nmrpflash拯救你的Netgear路由器:终极免费救援指南 【免费下载链接】nmrpflash Netgear Unbrick Utility 项目地址: https://gitcode.com/gh_mirrors/nmr/nmrpflash 你的Netgear路由器突然变成"砖头"了吗?固件升级失败、系统崩溃…...

PIDtoolbox完全指南:3步掌握无人机黑盒日志分析的终极免费工具

PIDtoolbox完全指南:3步掌握无人机黑盒日志分析的终极免费工具 【免费下载链接】PIDtoolbox PIDtoolbox is a set of graphical tools for analyzing blackbox log data 项目地址: https://gitcode.com/gh_mirrors/pi/PIDtoolbox 你是否曾面对无人机的飞行日…...

魔珐星云:打造企业BI数据讲解智能体,让数据自己会说话

目录 摘要 1. 引言:当BI数据遇上具身智能 1.1 传统BI的痛点 1.2 具身智能的破局之道 1.3 项目价值 2. 魔珐星云:具身智能的表达层基础设施 2.1 产品定位与技术架构 2.2 核心能力对比 2.3 应用场景 3. DeepSeek-V3.2:数据洞察的AI大…...

纯电商用车再生制动能量回收模糊控制策略【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于自适应扩展卡尔曼滤波的SOC精确估计与能量管理…...

如何用MAA助手彻底解放双手:明日方舟智能自动化工具终极指南

如何用MAA助手彻底解放双手:明日方舟智能自动化工具终极指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https…...

为什么向量空间必须是“无限”的?

为什么向量空间必须是“无限”的? 为什么说运算结果总是在 V 中? 向量空间的定义本质上就是划定了一个“无论你怎么加、怎么乘,都逃不出这个圈子”的集合。那么为什么还分V,U 子集呢,这样讲来,不就是一个向量空间包括一切的意思吗? 当数学家说“地板是一个向量空间(子…...

基于储能系统参与电网一次调频的下垂控制仿真示例

目录 手把手教你学Simulink——基于储能系统参与电网一次调频的下垂控制仿真示例 一、 引言:当“新能源浪潮”遇见“频率崩塌”——储能如何化身电网的“速效救心丸”? 二、 问题本质:一次调频的“核心挑战”与“协同逻辑” 1. 核心挑战 …...

AI浪潮下光纤需求爆发,康宁如何从玻璃厂变身光纤之王?

AI光纤需求爆发,英伟达加速布局根据CRU,AI数据中心的光纤需求一年增长75.9%,供需缺口从6%撕开到15%,光纤价格更是在数月间涨超3倍。产能跟不上了,这就是为什么英伟达要投资康宁并加速光纤产能扩张。两个月前&#xff0…...

GetQzonehistory:3分钟免费备份QQ空间所有历史说说

GetQzonehistory:3分钟免费备份QQ空间所有历史说说 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还在担心QQ空间里那些承载青春记忆的说说会随着时间流逝而消失吗&#xf…...

深度相机绿篱三维重建与修剪轨迹控制方法【附程序】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅如需沟通交流,点击《获取方式》 (1)紧耦合视觉-惯性-深度里程计与法线引导的稠密重建&am…...