一致性哈希的golang实现
时间:2022-07-25
本文章向大家介绍一致性哈希的golang实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
概述
当一个缓存服务由多个服务器共同提供时,存在一个key应该路由到哪一个服务器的问题。假如采用最通用的方式 key % N
(N
为服务器的数目),
当服务器数量发生增加或者减少时,分配方式则变成 key % (N+1)
或者 key%(N-1)
,这时候会有大量的key失效迁移,如果后端的key对应的是有状态的存储数据,
那么这种做法就会导致服务器间大量的数据迁移,从而造成服务器的不稳定,而使用槽映射的方式有一个缺点就是所有节点都需要知道槽与节点对应关系,如果client端不保存槽与节点对应的关系,client就需要实现重定向的逻辑。这时候使用一致性hash算法就很适合。
一致性hash算法的特点
一致性hash算法在1997年由麻省理工学院 karger
等人在解决分布式Cache中提出。一个好的hash算法应该满足四个条件:均衡性(Balance)、单调性(Monotonicity)、分散性(Spread)和负载(Load)。
- 均衡性: 均衡性主要是通过算法分配,集群中各节点应该要尽可能均衡。
- 单调性: 单调性主要是指当集群发生变化时,已经分配到老节点的key,尽可能的继续分配到之前的节点,防止大量数据迁移。
- 分散性: 分散性主要针对同一个key,当在不同的客户端操作时候,可能存在客户端获取到的缓存集群的数量不一致,从而导致将key映射到不同节点的问题,这会引起数据的不一致性。
- 负载: 负载主要针对一个缓存而言,同一缓存有可能会被用户映射到不同的key上,从而导致该缓存的状态不一致。
一致性hash算法详解
一致性hash的核心思想是将key做hash运算,然后通常的做法是按照一定的算法得出一个 0 ~ 2^32-1
之间的值,环的大小为 2^23
,key计算出的整数为key在hash环上的位置。
所以就是两步:
- 将代表服务器的key做hash,得到服务器节点在hash环上的位置。
- 将缓存的key,用同样的方法计算出hash环上的位置,按顺时针方向,找到第一个大于等于hash环位置的服务器的ServerNodeKey,从而得到该key需要分配的服务器。
如图所示,key做hash之后得到一个整数然后顺时针在环上找第一个遇到的服务器:
如果只使用实际节点,一般都会出现hash出来的范围分配不均的情况,这时候就需要加上虚拟节点,如图:
golang的一致性hash算法实现:consistent-hash
- 代码实现 WordPress 反垃圾评论功能
- Flash/Flex学习笔记(39):弹性运动
- 兼容Mono的下一代云环境Web开发框架ASP.NET vNext
- ASP.NET vNext 概述
- 丰富排版页面——为你的wordpress主题添加短代码形式美化框
- 开放式管理基础结构 OMI
- 人类设计了游戏和AI 2017年AI在游戏中打败了人类
- WordPress 代码实现相关文章(列表模式)功能
- 自动刷新页面
- Python语言被列入全国计算机等级考试科目中
- WordPress纯代码高仿 无觅相关文章 图文模式功能
- 各种序列化库的性能数据
- WordPress内置搜索结果只有一篇文章时自动跳转到该文章
- Flash/Flex学习笔记(23):运动学原理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- IDEA Pycharm WebStorm JetBranis全版本 2020年 最新激活方式
- SpringBoot整合MyBatis
- Sublime Text 3解决中文乱码
- pyPI: Python计算热带气旋潜在强度(Potential Intensity, 数据+代码)
- CVE-2019-0808 从空指针解引用到权限提升
- 打卡群刷题总结0926——零钱兑换
- 这样写的代码,都是垃圾......
- 打卡群刷题总结0928——整数拆分
- 面试官最爱问的 11道 Redis 面试题,我替你整理好了
- 打卡群刷题总结0929——计算各个位数不同的数字个数
- codeforces 1423K(数学+差分数组预处理)
- 电影大片里的代码究竟有多高级?
- 打卡群刷题总结0930——最大整除子集
- 机器学习中的常用编码方式(一)
- leetcode题目之1、2---两数相加