首页 > 编程语言 >实现一致性哈希算法

实现一致性哈希算法

时间:2023-09-24 19:23:11浏览次数:65  
标签:node Hash 算法 哈希 一致性 节点

背景

一致性哈希主要用于分布式系统解决数据存储与访问的负载问题,极大的提高了可用性与扩展性。分布式系统往往是把数据分布到不同的节点,这些节点可以动态的加入或离开集群,这样就需要考虑一些问题,如果按照传统的hash算法进行数据分布,动态扩缩节点就需要对数据进行rehash,数据量大或请求数多的时候,对系统负荷比较大,并不是一个好的解决方案,一致性哈希就是用于解决这个问题。

 

传统的Hash算法

假如现在有6000万的数据量,通过唯一标识将数据分布到三台机器上,通常是用 Hash 唯一标识后再 Mod 存储节点N,Hash(unique_key) % N ,这里N = 3,但是这种方案会存在一个问题,存储节点发生变化的时候,Hash(unique_key) % N 整体的计算结果也会发生变化,就比如原本是Hash(unique_key) % 3,现在变为了Hash(unique_key) % 4 ,整体的数据都会进行rehash重新分布,数据量庞大的时候就会导致整体系统的数据命中率极大降低。

传统Hash算法示例图:

img

 

 

一致性哈希算法

一致性哈希算法主要用于数据分片与负载算法。他在传统Hash算法的基础上进行优化,增加了范围的概念,它由原本Hash运算固定的节点值改为处于某一个范围,而这个范围内的数据值会对应到一个节点上,从而达到数据的定位效果,所有的范围会组成一个环,这个环就是哈希环。好处就是,在进行扩缩节点的时候,只会影响到某一范围内的的数据,而不是像传统Hash算法一样对整个分布式的节点或数据进行重新分片与迁移。

 

一致性哈希本质性上也是一种取模运算,但他不是按照机器数,而是一个固定的值,这个固定值通常是2^32,这主要是因为IP地址由4组8位2进制组成,这样每个IP都在环上都有了对应的节点。

 

 

 

一致性哈希算法基本逻辑逻辑

服务器首先会根据IP地址进行Hash运算,运算后进行mod 2^32,这样就可以得到一个确定的值,将这个值映射到Hash环上,得到一个对应的服务节点。数据存储或访问的时候也通过Hash(key) mod 2^32 的值所属范围寻找对应节点。

 

案例:

首先需要先将4台服务器IP映射到Hash环上,hash(服务器ip)% 2^32,并对映射的四个节点标记为:node-0、node-1、node-2、node-3,其中顺时针取范围,node0 -node1 范围属于node1

node1 -node2 范围属于node2

node2 -node3 范围属于node3

node3 -node4 范围属于node4

 

这个时候有四条数据需要存储,分别为"slim"、"stan"、"smith"、"Jack",经过Hash运算后这四条数据在Hash上的分为别K1、K2、K3、K4 如下图,由图可知顺时针范围,K1属于node-1节点,K2属于node-2节点,K3属于node-3节点,K4属于node-0节点。这样就可以找到对应的服务器节点,这就是一致性哈希的工作原理。

 

 

 

服务器扩缩节点及问题

 

服务器增加

假如新增了一个节点node4,这个节点经过运算后,落在了node3与node0之间,那么可以将node3-node4范围之间的数据迁移到node4即可。其他同理

服务器减少

假如node-2节点要下线,这个时候原本node1-node2范围的数据只需要迁移到node3节点即可。

数据倾斜

假如只有node1和node2两个节点,大量的数据分布在node1范围怎么办呢?这个时候node2资源过剩,这不是浪费资源嘛。

这个时候可以通过虚拟节点来解决这个问题,首先将虚拟节点映射到哈希环,然后将虚拟节点映射到真实节点即可解决问题。

 

标签:node,Hash,算法,哈希,一致性,节点
From: https://www.cnblogs.com/bdefgman/p/17725548.html

相关文章

  • 一致性哈希算法实现(java)
    代码基本实现未完待续........... publicstaticvoidmain(String[]args){​TreeMap<Integer,String>hashNodes=newTreeMap<>();hashNodes.put(1,"1.1.1.1");hashNodes.put(4,"1.1.1.2");hashNodes.put......
  • 最近公共祖先 倍增算法
    P3379【模板】最近公共祖先(LCA)点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+10;vector<int>g[N];intdep[N],fa[N][22];voiddfs(intu,intfather){ dep[u]=dep[father]+1; fa[u][0]=father;//2的i次方的点 for(inti=......
  • 文心一言 VS 讯飞星火 VS chatgpt (99)-- 算法导论9.3 5题
    五、用go语言,假设你已经有了一个最坏情况下是线性时间的用于求解中位数的“黑箱”子程序。设计一个能在线性时间内解决任意顺序统计量的选择问题算法。文心一言:为了在线性时间内解决任意顺序统计量的选择问题,我们可以使用一个基于快速选择算法的方法。快速选择算法是基于快速排序的......
  • 算法打卡|Day4 链表part02
    Day4链表part02今日任务●24.两两交换链表中的节点●19.删除链表的倒数第N个节点●面试题02.07.链表相交●142.环形链表II[TOC]Problem:24.两两交换链表中的节点思路1.迭代法就要注意画图!画图!还是画图!另外迭代的次序不要忘记,链表迭代统一从左往右迭代。用三......
  • 深度学习算法中的遗传编程(Genetic Programming)
    深度学习算法中的遗传编程(GeneticProgramming)引言深度学习算法在近年来取得了巨大的成功,广泛应用于计算机视觉、自然语言处理等领域。然而,深度学习算法仍然面临着一些挑战,例如需要大量的标注数据、模型结构的选择等。为了解决这些问题,研究者们开始探索结合遗传编程(GeneticProgram......
  • 算法刷题:图论(9.23,持续更)
    目录基础知识有向图顶点类邻接表邻接矩阵入度、出度有向加权图无向图(双向图)图的遍历题目DAG所有可能的路径判断二分图dfs解法bfs解法基础知识点:顶点、邻接节点边:有向边、无向边、加权边度:入度、出度、无向边的度环:环、自环(glist[i]中有i)连通性:连通图、不连通有向图顶点......
  • 【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)
    农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长度为Li长度的总和)。FJ忽略了“切口”,即锯切时锯屑损失的额外长度;你也应该忽略它。FJ伤心地......
  • 9.24算法
    反转链表给你单链表的头节点head,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[] 提示:链表中节点的数目范围是[0,5000]-5000<=Node.val<=5000 #include<bits/stdc+......
  • 代码随想录算法训练营-动态规划-2|62. 不同路径
    62. 不同路径 1classSolution:2defuniquePaths(self,m:int,n:int)->int:3#创建一个二维列表用于存储唯一路径数4dp=[[0]*nfor_inrange(m)]56#设置第一行和第一列的基本情况7foriinran......
  • 基于Yolov2深度学习网络的车辆检测算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本MATLAB2022A 3.算法理论概述        车辆检测是计算机视觉领域中的一个重要问题。它在自动驾驶、智能交通系统、交通监控以及车辆计数等应用场景中起着至关重要的作用。近年来,深度学习在图像识别领域取得了显著的......