用于KV集群的一致性哈希Consistent Hashing机制
KV集群的请求分发
假定N为后台服务节点数,当前台携带关键字key发起请求时,我们通常将key进行hash后采用模运算 hash(key)%N 来将请求分发到不同的节点上, 后台节点的增删会引起几乎所有key的重新映射, 这样会造成大量的数据迁移,如果数据量大的话会导致服务不可用.
一致性哈希机制
我倾向于称之为一致性哈希机制而不是算法, 因为这其实和算法没太大关系. 设计这种机制的目的是当节点增减时尽量减小重新映射的key的数量, 尽量将key还映射到原来的节点上. 而对于一致性哈希机制, 如果集群有K个key映射到N个节点, 那么在增删节点时引起的key的迁移不会超过K/N个.
一致性哈希的原理
一致性哈希机制的原理, 是将集群节点分布到一个圆上, 各节点预设一个key, 这些key的hash值集中后可得到一个数组, 将该数组排序后首尾相连形成一个圆, 节点的key分布在圆的不同弧段上.
对于请求的key, 其hash值会落入该圆的某一弧段, 按顺时针方向遇见的第一个节点即为其对应节点.
减少节点: 如果删除某一节点, 或者是这个节点故障宕机了, 之前映射到这个节点的key, 会顺时针移到下一个节点, 而其他弧段不受影响.
增加节点: 与减少节点类似, 新的节点会加入到某一个弧段中, 这样原来这个弧段对应的一部分key, 则会落入新加入的节点.
减少热点
由于业务数据的不均或者是哈希算法的原因, 会造成一些热点节点. 可以通过以下方式减轻节点的热点现象
虚拟节点 Replica
虚拟节点是建立在物理节点之上的一种逻辑节点, 目的是为了将物理节点负责的弧段打散并尽量均匀(或随机)分布在整个圆上. 实现方式为: 对每一个物理节点, 为其创建M个虚拟节点后再加入圆环. 因为这些虚拟节点的key得到的hash值是分散的, 所以其在圆环上的分布也是分散的, 在所有的虚拟节点都加入圆环后, 每个物理节点实际上都在圆上分散地控制了M段圆弧.
对于请求的key, 其hash值会映射到某一个虚拟节点, 而热点区域的虚拟节点实际上底下对应的是多个物理节点, 这样就将热点分散到了不同的物理节点上.
哈希槽 Hash Slot
这是Redis集群的做法, 其实是虚拟节点的一种特殊形式. 针对使用的哈希算法, 在一开始就将哈希值拆分为1024或更多个小区间, 这些小区间就是哈希槽, 这些哈希槽会映射到不同的节点. 在节点减少前, 需要将这个节点的哈希槽分配给其他节点, 在增加节点时, 需要将其他节点的哈希槽挪一部分过来. 通过调整哈希槽在各个物理节点间的分配可以对热点进行分散.
用于KV集群的一致性哈希Consistent Hashing机制的更多相关文章
- memcached集群和一致性哈希算法
场景 由于memcached集群各节点之间都是独立的,互不通信,集群的负载均衡是基于客户端来实现的,因此需要客户端用户设计实现负载均衡算法. 取模算法 N个节点,从0->N-1编号,key对N ...
- 一致性哈希(consistent hashing)算法
文章同步发表在博主的网站朗度云,传输门:http://www.wolfbe.com/detail/201608/341.html 1.背景 我们都知道memcached服务器是不提供分布 ...
- 深入一致性哈希(Consistent Hashing)算法原理,并附100行代码实现
转自:https://my.oschina.net/yaohonv/blog/1610096 本文为实现分布式任务调度系统中用到的一些关键技术点分享——Consistent Hashing算法原理和J ...
- 4.安装fluentd用于收集集群内部应用日志
作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-13 11:02:14 星期四 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...
- 一致性hash算法Consistent Hashing
一致性hash算法Consistent Hashing 对于原有hash算法hash%n so... 1.话不多说直接上代码,原理或详解自行百度即可 import cn.pheker.utils.Ut ...
- [转]HBase hbck——检察HBase集群的一致性
Hbase提供了hbck命令来检查各种不一致问题.hbck的名字仿效了HDFS的fsck命令,后者是一个用于检查HDFS中不一致问题的工具.下面这段非常易懂的介绍出自于hbck的源程序. 检查数据在M ...
- Web集群缓存一致性的思考
共享cache+数据库实现缓存一致性: 1.1 memcache + mongo+定时器 1.1.1 memcache 优点:web集群共享数据 缺点:数据生命周期的不可预估性 1.1.2 mongo ...
- SSD固态盘应用于Ceph集群的四种典型使用场景
在虚拟化及云计算技术大规模应用于企业数据中心的科技潮流中,存储性能无疑是企业核心应用是否虚拟化.云化的关键指标之一.传统的做法是升级存储设备,但这没解决根本问题,性能和容量不能兼顾,并且解决不好设备利 ...
- Golang 实现 Redis(7): Redis 集群与一致性 Hash
本文是使用 golang 实现 redis 系列的第七篇, 将介绍如何将单点的缓存服务器扩展为分布式缓存.godis 集群的源码在Github:Godis/cluster 单台服务器的CPU和内存等资 ...
随机推荐
- python测量函数运行时间长度
python测试函数运行时间长度的方法如下 import time def measure_time(): def wraps(func): def mesure(*args,**kwargs): s ...
- mysql修改字符集问题
mysql字符集问题: 本文主要解决mysql7以下问题:mysql7在默认安装后,关于数据库,表默认保存字符格式为latin1: 可以通过命令:查询当前mysql的编码设置: show variab ...
- H3C 802.11b/g工作频段划分图
- Linux下设置postgresql数据库开机启动
PostgreSQL的开机自启动脚本位于PostgreSQL源码目录的contrib/start-scripts路径下,linux文件即为linux系统上的启动脚本: 1.将Linux文件复制到 /e ...
- FreeBSD关机后自动重启的解决办法
我用的是华硕的笔记本电脑,不知道别的电脑有没有这个情况,按handbook关机指令为shutdown -p now,但是我执行这个指令后电脑却自动重启,用Linux关机指令shutdown -h no ...
- 详解Linux获取启动盘路径命令--fdisk、sfdisk -l、lsblk
概述 linux引导磁盘路径可以用于任何问题的故障诊断.这个引导分区或路径包含GRUB配置的Linux引导装载程序.那么我们可以怎么找到当前Linux引导磁盘路径呢? 基本上有三种方法可以找到当前Li ...
- MySQL/MariaDB数据库的函数
MySQL/MariaDB数据库的函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MySQL/MariaDB数据库的函数分为系统函数和用户自定义函数(user-define ...
- W3C--BOM(1)知识梳理
<一>BOM浏览器对象模型 1. window 1.1 window.innerHeight浏览器窗口的内部高度,window.innerWidth浏览器窗口的内部宽度 (对于Inter ...
- Caused by SSLError("Can’t connect to HTTPS URL because the SSL module is not available)
window7系统: 今天刚安装的anaconda(开源的Python包管理器),把原来的python3和python2都给卸载了,结果运行爬虫程序的时候报错: Caused by SSLError( ...
- RippleNet: Propagating User Preferences on the Knowledge Graph for Recommender Systems
一.摘要 为了解决协同过滤的稀疏性和冷启动问题,社交网络或项目属性等辅助信息被用来提高推荐性能. 考虑到知识图谱是边信息的来源,为了解决现有的基于嵌入和基于路径的知识图谱感知重构方法的局限性,本文提出 ...