一致性hash算法的应用与go语言实现

一致性hash算法的应用与实现

设计目标:一致性hash算法的主要设计目标是在分布式系统中实现节点增减时数据映射关系的最小变动,从而保证数据的一致性和系统的稳定性。

一致性hash算法的应用场景

分布式负载均衡

一致性hash算法在分布式系统中得到广泛应用,特别是在需要处理大量数据和高并发请求的系统中。
通过将哈希输出空间组织成一个虚拟的圆环,并在环上分布服务器节点,一致性hash算法能够确保在节点增减时,对原有服务器和用户之间的映射关系产生的影响最小。

分布式缓存

在分布式缓存系统中,如Redis集群,一致性hash算法被用于数据的读写分离和集群部署。
通过哈希算法将键值对映射到不同的缓存服务器上,实现数据的均匀分布和高效访问。

分布式存储

一致性哈希算法也常用于分布式存储系统中,如分布式文件系统、分布式数据库等。通过一致性哈希算法,可以将数据均匀地分布到多个存储节点上,实现数据的分布式存储和访问。

数据分片

在分布式数据库中,一致性哈希算法可以用来确定数据应该存储在哪个分片节点上。通过一致性哈希算法,可以将数据均匀地分布到多个数据库节点上,实现数据的分布式存储和查询。

服务发现

一致性哈希算法还可以用于服务发现,帮助客户端快速定位服务提供者。通过一致性哈希算法,可以将服务节点映射到哈希环上,客户端根据请求的哈希值定位到相应的服务节点,实现服务的动态发现和负载均衡。

P2P网络

在P2P网络中,一致性hash算法被用于节点之间的数据路由和查找。
通过将节点和数据的哈希值映射到同一个哈希空间中,实现节点之间的快速通信和数据共享。

一致性hash算法的go语言实现

// 代码是一个简单demo, 不用于生产,在生产环境有许多需要优化地方
package mainimport ("crypto/sha256""encoding/hex""errors""fmt""hash/crc32""sort""strconv"
)type HashFunc func(data []byte) string// sha256
func sha256Hash(data []byte) string {hash := sha256.Sum256(data)hashString := hex.EncodeToString(hash[:])return hashString
}// crc32
func crc32Hash(data []byte) string {crc := crc32.ChecksumIEEE(data)return string(crc)
}// ConsistentHash 一致性哈希算法的结构体
type ConsistentHash struct {replicas     int               // 虚拟节点数量Nodes        map[string]string // 节点哈希表SortedHashes []string          // 已排序的哈希切片hash         HashFunc          // 取hash函数
}// New 初始化hash算法
func New(replicas int, hashFunc HashFunc) *ConsistentHash {return &ConsistentHash{replicas: replicas,hash:     hashFunc,Nodes:    make(map[string]string),}
}// AddNode 添加节点
func (c *ConsistentHash) AddNode(node string) {if c.Nodes == nil {c.Nodes = make(map[string]string)}for i := 0; i < c.replicas; i++ {hash := c.hash([]byte(strconv.Itoa(i) + node))c.Nodes[hash] = nodec.SortedHashes = append(c.SortedHashes, hash)}// 对节点的哈希值进行排序sort.Slice(c.SortedHashes, func(i, j int) bool {return c.SortedHashes[i] < c.SortedHashes[j]})
}// RemoveNode 移除节点
func (c *ConsistentHash) RemoveNode(node string) {var newKeys []stringfound := falsefor _, hashVal := range c.SortedHashes {// 如果存在该节点,就删除该节点if c.Nodes[hashVal] == node {found = truecontinue}// 把剩余节点添加进新的集合中newKeys = append(newKeys, hashVal)}// 如果不存在,就直接返回if !found {return}c.SortedHashes = newKeysfor hashVal := range c.Nodes {if c.Nodes[hashVal] == node {delete(c.Nodes, hashVal)}}
}// GetNode 顺时针查找最近的节点
func (c *ConsistentHash) GetNode(key string) (string, error) {if len(c.SortedHashes) == 0 {return "", errors.New("sortedHash is nil")}hash := c.hash([]byte(key))idx := sort.Search(len(c.SortedHashes), func(i int) bool {return c.SortedHashes[i] >= hash})if idx == len(c.SortedHashes) {idx = 0}return c.Nodes[c.SortedHashes[idx]], nil
}// 测试如下
func main() {cc := New(100, sha256Hash)cc.AddNode("node1")cc.AddNode("node2")cc.AddNode("node3")cc.AddNode("node4")cc.AddNode("node5")aa, _ := cc.GetNode("11")fmt.Println(aa) // node1aa, _ = cc.GetNode("22")fmt.Println(aa) // node1aa, _ = cc.GetNode("33")fmt.Println(aa) // node4aa, _ = cc.GetNode("44")fmt.Println(aa) // node5cc.RemoveNode("node4")fmt.Println("--------------")aa, _ = cc.GetNode("11")fmt.Println(aa) // node1aa, _ = cc.GetNode("22")fmt.Println(aa) // node1aa, _ = cc.GetNode("33")fmt.Println(aa) // node3aa, _ = cc.GetNode("44")fmt.Println(aa) // node3cc.RemoveNode("node2")cc.RemoveNode("node1")cc.RemoveNode("node5")fmt.Println("--------------")aa, _ = cc.GetNode("11")fmt.Println(aa) // node3aa, _ = cc.GetNode("22")fmt.Println(aa) // node3
}

输出如下:

/*
node1
node1
node4
node3
--------------
node1
node1
node3
node3
--------------
node3
node3
*/

总结

一致性hash算法通过其独特的设计理念和实现方式,在分布式系统中发挥着重要作用。它不仅能够解决节点增减时数据映射关系的最小变动问题,
还能够实现数据的均匀分布和高效访问。在分布式缓存、数据库分库分表、P2P网络等场景中,一致性hash算法都有着广泛的应用前景。

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

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

相关文章

揭秘AI 原生应用技术栈

一次性把“AI 原生应用技术栈”说明白 AI热潮持续&#xff0c;厂商努力推动有价值的应用涌现&#xff0c;并打造服务AI原始应用的平台产品。本文精简介绍业界最新的AI原生应用技术栈&#xff0c;让您迅速把握前沿科技脉搏。 整体架构 AI技术栈逻辑图精简呈现&#xff0c;多层…

图形学初识--透视修正

文章目录 前言正文为什么需要透视矫正&#xff1f;1、视图坐标空间--->NDC坐标空间&#xff08;透视投影&#xff09;&#xff08;1&#xff09;直线&#xff1a;&#xff08;2&#xff09;三角形&#xff1a;总结&#xff1a; 2、NDC坐标空间--->屏幕坐标空间&#xff0…

PID控制算法介绍及使用举例

PID 控制算法是一种常用的反馈控制算法&#xff0c;用于控制系统的稳定性和精度。PID 分别代表比例&#xff08;Proportional&#xff09;、积分&#xff08;Integral&#xff09;和微分&#xff08;Derivative&#xff09;&#xff0c;通过组合这三个部分来调节控制输出&#…

因子区间[牛客周赛44]

思路分析: 我们可以发现125是因子个数的极限了,所以我们可以用二维数组来维护第几个数有几个因子,然后用前缀和算出来每个区间合法个数,通过一个排列和从num里面选2个 ,c num 2 来计算即可 #include<iostream> #include<cstring> #include<string> #include…

用户反馈解决方案 —— 兔小巢构建反馈功能

目录 01: 前言 02: 用户反馈整体实现方案分析 03: 兔小巢全解析 04: 基于兔小巢实现用户反馈 05: 总结 01: 前言 在前台系统中&#xff0c;用户反馈 功能也是一个非常常见的需求。 通过反馈功能&#xff0c;我们可以知道当前的应用存在的一些不足和用户相应的一些诉求。…

【Linux系统】进程信号

本篇博客整理了进程信号从产生到处理的过程细节&#xff0c;通过不同过程中的系统调用和其背后的原理&#xff0c;旨在让读者更深入地理解操作系统的设计与软硬件管理手段。 目录 一、信号是什么 1.以生活为鉴 2.默认动作与自定义动作 3.信号的分类、保存、产生 二、产生…

蓝桥杯物联网竞赛_STM32L071KBU6_解决脉冲输出频率数值不稳定BUG

问题&#xff1a; 在用脉冲进行做题的时候发现脉冲输出的频率随着脉冲数值增大而越来越不稳定 典型的情况是10000HZ的时候会变成0HZ或者infHZ也就是无穷大 代码&#xff1a; int BEIGNNUMBER 0; int ENDNUMBER 0; unsigned char STATETIM 0; void HAL_TIM_IC_CaptureCal…

ChatGPT-4o抢先体验

速度很快&#xff0c;结果很智能&#xff0c;支持多模态输入输出&#xff0c;感兴趣联系作者

WordPress电脑版+手机版自动识别切换主题插件优化版

下载地址&#xff1a;WordPress电脑版手机版自动识别切换主题插件优化版 插件介绍&#xff1a; 电脑访问自动显示电脑版 手机访问自动显示手机版

FreeRTOS学习笔记-基于stm32(10)事件标志组

一、事件位、事件标志 事件位用来表明某个事件是否发生&#xff0c;事件位通常用作事件标志&#xff0c;就类似标志位。 二、事件标志组 一个事件组就是一组的事件位&#xff0c;就类似一个标志位寄存器&#xff0c;寄存器的每一位都是一个事件标志。与队列&#xff0c;信号量…

电子电器架构 --- 智能座舱技术分类

电子电器架构 — 智能座舱技术分类 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,…

3. ChaosBlade-Box平台安装

ChaosBlade-Box平台安装 参考自&#xff1a;https://chaosblade.io/docs/about-chaosblade/box-introduce/ 通过ChaosBlade-Box可实现 chaosblade、litmuschaos 等已托管工具自动化部署&#xff0c;按照社区的建立的混沌实验模型统一实验场景&#xff0c;根据主机、Kubernete…

Java基础29(编码算法 哈希算法 MD5 SHA—1 HMac 算法 堆成加密算法)

目录 一、编码算法 1. 常见编码 2. URL编码 3. Base64编码 4. 小结 二、哈希算法 1. 哈希碰撞 2. 常用哈希算法 MD5算法 SHA-1算法 自定义HashTools工具类 3. 哈希算法的用途 校验下载文件 存储用户密码 4. 小结 三、Hmac算法 小结&#xff1a; 四、对称加密…

js获取blob格式的json对象

我们上传文件时可能会携带某些参数&#xff0c;比如 let formData new FormData() formData.append("data",new Blob([JSON.stringify(this.params)],{type: "application/json }))当我们直接取时发现会取到一个file类型的对象&#xff0c;无法取到值 formDa…

鸿蒙轻内核M核源码分析系列七 动态内存Dynamic Memory

内存管理模块管理系统的内存资源&#xff0c;它是操作系统的核心模块之一&#xff0c;主要包括内存的初始化、分配以及释放。 在系统运行过程中&#xff0c;内存管理模块通过对内存的申请/释放来管理用户和OS对内存的使用&#xff0c;使内存的利用率和使用效率达到最优&#x…

【C++小知识】为什么C语言不支持函数重载,而C++支持

为什么C语言不支持函数重载&#xff0c;而C支持 编译链接过程函数名修饰过程总结 在了解C函数重载前&#xff0c;如果对文件的编译与链接不太了解。可以看看我之前的一篇文章&#xff0c;链接: 文件的编译链接 想要清楚为什么C语言不支持函数重载而C支持&#xff0c;有俩个过程…

FFmpeg中 Scaler 使用文档介绍

描述 在 FFmpeg 中,swscale 是一个用于图像缩放和像素格式转换的库,它是 libswscale 的一部分。这个库提供了一系列的功能,允许开发者在视频处理过程中改变视频帧的尺寸和像素格式。以下是 swscale 的一些关键点: 图像重缩放:swscale 允许开发者对视频帧进行尺寸调整,这在…

大模型Prompt-Tuning技术进阶

LLM的Prompt-Tuning主流方法 面向超大规模模型的Prompt-Tuning 近两年来&#xff0c;随之Prompt-Tuning技术的发展&#xff0c;有诸多工作发现&#xff0c;对于超过10亿参数量的模型来说&#xff0c;Prompt-Tuning所带来的增益远远高于标准的Fine-tuning&#xff0c;小样本甚至…

就在刚刚,雷军又做了个10亿的公司

在新能源的滚滚洪流中&#xff0c;宁德时代犹如一艘扬帆起航的巨轮&#xff0c;凭借其在电池技术领域的卓越表现&#xff0c;稳稳占据了行业的领航地位。近日&#xff0c;宁德时代与小米汽车两大巨头携手合作&#xff0c;共同创建了北京时代动力电池有限公司&#xff0c;注册资…

【保姆级讲解Outlook邮箱的使用技巧】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…