news 2026/8/6 11:10:59

【一致哈希算法】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【一致哈希算法】

哈希算法的局限性

传统哈希算法(如hash(key) % N)在集群扩容或缩容时,数据迁移成本极高。例如,3节点扩容至4节点需迁移75%的数据,10节点扩容至11节点需迁移90.9%的数据。这是由于取模运算的基数(节点数N)变化导致所有key的映射关系被破坏。

一致哈希的核心原理

一致哈希将哈希空间组织为环形结构(模数为2^32),节点和key均通过哈希函数映射到环上。key的寻址规则为:从key的位置顺时针查找,遇到的第一个节点即为目标节点。
优势:节点变化时仅影响相邻区间的数据。例如:

  • 扩容时:仅需将新节点与前一节点之间的数据迁移至新节点。
  • 缩容时:仅故障节点与前一节点之间的数据需重新分配。

数据迁移成本对比

  • 3节点→4节点:迁移24.3%数据(传统哈希需75%)。
  • 10节点→11节点:迁移6.48%数据(传统哈希需90.9%)。

虚拟节点解决负载不均

当物理节点较少时,可能出现数据分布倾斜(如80%请求集中在单个节点)。通过为每个物理节点创建多个虚拟节点(如"Node-A-01"、"Node-A-02"等),并将虚拟节点均匀映射到哈希环上,可实现:

  • 更均匀的数据分布:虚拟节点分散后,物理节点承载的key趋于平衡。
  • 动态权重调整:通过增减虚拟节点数量,可调整不同物理节点的负载比例。

实现建议

  1. 哈希函数选择:使用CRC32、MD5等均匀性好的哈希算法。
  2. 虚拟节点数量:通常设置为物理节点的100~200倍,具体数值需通过压测确定。
  3. 异常处理:节点故障时自动跳过,并将请求路由至下一可用节点。
  4. 动态扩容:支持运行时添加节点,仅触发局部数据迁移。

性能优化示例

// 虚拟节点示例代码typeVirtualNodestruct{HashKeyuint32PhysicalNodestring}funcAddNode(ring*[]VirtualNode,nodeNamestring,replicaCountint){fori:=0;i<replicaCount;i++{vnode:=VirtualNode{HashKey:crc32.ChecksumIEEE([]byte(fmt.Sprintf("%s-%d",nodeName,i))),PhysicalNode:nodeName,}*ring=append(*ring,vnode)}sort.Slice(*ring,func(i,jint)bool{return(*ring)[i].HashKey<(*ring)[j].HashKey})}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 5:49:01

函数指针与指针函数

函数指针// 函数名实际上就是指向函数代码的指针void (*func_ptr)() function_a; // 函数指针指向function_a的地址func_ptr(); // 通过地址调用函数指针函数//返回指针的函数&#xff1a;即函数的返回值是一个指针。//例如&#xff1a;int* createIntArray(int size) {int*…

作者头像 李华
网站建设 2026/8/5 22:58:43

终极指南:如何用文本转图表工具实现高效创作

终极指南&#xff1a;如何用文本转图表工具实现高效创作 【免费下载链接】drawio_mermaid_plugin Mermaid plugin for drawio desktop 项目地址: https://gitcode.com/gh_mirrors/dr/drawio_mermaid_plugin 你是否曾经为绘制专业图表而烦恼&#xff1f;现在&#xff0c;…

作者头像 李华
网站建设 2026/8/4 23:17:55

阴阳师自动化脚本终极指南:3步实现游戏全自动操作

阴阳师自动化脚本终极指南&#xff1a;3步实现游戏全自动操作 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 还在为重复的阴阳师日常任务而烦恼吗&#xff1f;OnmyojiAutoScrip…

作者头像 李华
网站建设 2026/8/4 23:20:58

TS-Loader 源码解析与自定义 Webpack Loader 开发指南

TS-Loader 源码解析与自定义 Webpack Loader 开发指南 1. TS-Loader 源码深度解析 1.1 整体架构与核心模块 TS-Loader 是 Webpack 生态中用于处理 TypeScript 文件的核心 loader。其源码结构主要包含以下几个关键部分&#xff1a; 入口文件 (index.js)&#xff1a;导出一个 pit…

作者头像 李华
网站建设 2026/8/6 0:29:06

【MySQL XA规范】

MySQL XA实现分布式事务的原理与应用 XA规范与DTP模型 XA规范定义了分布式事务处理&#xff08;DTP&#xff09;模型中事务管理器&#xff08;TM&#xff09;与资源管理器&#xff08;RM&#xff09;的交互方式。DTP模型包含三个核心组件&#xff1a; 应用程序&#xff08;AP&a…

作者头像 李华
网站建设 2026/8/5 23:04:02

25年最新java面试题大全(整理版)

身为一个7年的Java开发&#xff0c;我发现今年金九银十来面试的后端都有几个相似的缺点&#xff0c;往往导致他们到嘴的offer悄然飞走&#xff0c;还是需要引以为戒&#xff0c;不然机会与时间都在浪费&#xff01;&#xff01; 1. Java核心掌握不牢 对多线程&#xff08;线程…

作者头像 李华