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机制的更多相关文章

  1. memcached集群和一致性哈希算法

    场景 由于memcached集群各节点之间都是独立的,互不通信,集群的负载均衡是基于客户端来实现的,因此需要客户端用户设计实现负载均衡算法. 取模算法 N个节点,从0->N-1编号,key对N ...

  2. 一致性哈希(consistent hashing)算法

    文章同步发表在博主的网站朗度云,传输门:http://www.wolfbe.com/detail/201608/341.html 1.背景        我们都知道memcached服务器是不提供分布 ...

  3. 深入一致性哈希(Consistent Hashing)算法原理,并附100行代码实现

    转自:https://my.oschina.net/yaohonv/blog/1610096 本文为实现分布式任务调度系统中用到的一些关键技术点分享——Consistent Hashing算法原理和J ...

  4. 4.安装fluentd用于收集集群内部应用日志

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-13 11:02:14 星期四 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  5. 一致性hash算法Consistent Hashing

    一致性hash算法Consistent Hashing 对于原有hash算法hash%n so... 1.话不多说直接上代码,原理或详解自行百度即可 import cn.pheker.utils.Ut ...

  6. [转]HBase hbck——检察HBase集群的一致性

    Hbase提供了hbck命令来检查各种不一致问题.hbck的名字仿效了HDFS的fsck命令,后者是一个用于检查HDFS中不一致问题的工具.下面这段非常易懂的介绍出自于hbck的源程序. 检查数据在M ...

  7. Web集群缓存一致性的思考

    共享cache+数据库实现缓存一致性: 1.1 memcache + mongo+定时器 1.1.1 memcache 优点:web集群共享数据 缺点:数据生命周期的不可预估性 1.1.2 mongo ...

  8. SSD固态盘应用于Ceph集群的四种典型使用场景

    在虚拟化及云计算技术大规模应用于企业数据中心的科技潮流中,存储性能无疑是企业核心应用是否虚拟化.云化的关键指标之一.传统的做法是升级存储设备,但这没解决根本问题,性能和容量不能兼顾,并且解决不好设备利 ...

  9. Golang 实现 Redis(7): Redis 集群与一致性 Hash

    本文是使用 golang 实现 redis 系列的第七篇, 将介绍如何将单点的缓存服务器扩展为分布式缓存.godis 集群的源码在Github:Godis/cluster 单台服务器的CPU和内存等资 ...

随机推荐

  1. CspParameters 对象已存在异常 解决多应用对同一容器的访问问题

    CspParameters cspParams; cspParams = new CspParameters(PROVIDER_RSA_FULL); cspParams.KeyContainerNam ...

  2. WPF 依赖属性前言

    WPF 依赖属性前言 ​ 在.net中,我们可以属性来获取或设置字段的值,不需要在编写额外的get和set方法,但这有一个前提,那就是需要在对象中拥有一个字段,才能在此字段的基础上获取或设置字段的值, ...

  3. 【Code Tools】AB性能测试工具(一)

    一.工具下载 yum -y install httpd-tools 二.AB工具使用 格式: ab [options] [http://]hostname[:port]/path 例如:ab -n - ...

  4. moviepy这个版本,除了字幕,基本可用

    只是注意,开头要坚拍,中间要横拍,结尾图左上右下. 哈哈,如果不是这样,那就要调调角度了. from moviepy.editor import * from moviepy.video.tools. ...

  5. Maven之setting.xml 配置详解

    文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...

  6. 【后缀表达式求解】No.3.栈-evaluate-reverse-polish-notation题解(Java版)

    牛客网的题目链接 题目描述 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid opera ...

  7. db2 mysql oracle 邮件 tomcat ssh telnet ftp samba 账号密码

    db2 mysql oracle 邮件 tomcat ssh telnet ftp samba 账号密码 检测

  8. C# 验证控件的使用RequiredFieldValidator&CompareValidator

    使用验证控件可以向服务器提交表单数据时验证表单内容,下面以RequiredFieldValidator和CompareValidator为例说明验证控件的用法 RequiredFieldValidat ...

  9. 基于源代码为树莓派设备构建 TensorFlow

    本指南为运行 Raspbian 9.0 操作系统的 Raspberry Pi 嵌入式设备构建 TensorFlow.虽然这些说明可能也适用于其他系列的 Raspberry Pi 设备,但它仅针对此文中 ...

  10. easyui_验证扩展

    本文为转载,并非原创 easyui validatebox 验证类型 分类: jquery-easyUI -- : 11000人阅读 评论() 收藏 举报 easyuiValidateBox requ ...