给面试官讲明白:一致性Hash的原理和实践
“一致性hash的设计初衷是解决分布式缓存问题,它不仅能起到hash作用,还可以在服务器宕机时,尽量少地迁移数据。因此被广泛用于状态服务的路由功能”
01分布式系统的路由算法
假设有一个消息推送系统,其简易架构如下

)
设备接入层不仅要接收设备的登录、下线等状态命令,还要把开发者的消息推送给设备。这个时候设备接入层就需要维护设备的状态信息(当然可以专门拆一个状态服务去维护这些信息,要求这部分必须少有代码更新,具体原因自己去想哦=_=)。这个时候设备接入层的每台server都保留一批设备的状态信息cache,设备应该连接哪台server去获取数据,同时中间层的消息又该发往哪个server去推送呢?这就用到了一致性hash算法。
02什么是一致性hash算法
一致性hash由对象、资源、算法和机器组成。它要做的是:对象通过算法判断连哪台机器。在如上系统中:设备id(userID)为对象;其对应的状态数据(cache)为资源;服务器为机器。

在一致性hash算法中,这些资源围成了一个闭环,每台机器又保存着一个资源段,每个资源段对应一批对象/设备;这样如果某台机器挂了,那它对应的资源转移到离它较近的机器x,这台dead server对应的设备连接到机器x就行。
现在假设这四个资源段对应的设备,活跃情况相差较大。比如说资源段1、2对应的设备特别活跃,而资源段3和4几乎没活动。这样机器1-2需要保存大量的状态数据,而3-4则有大量的空置,显然是不合理的。改进版的一致性hash算法是这样操作的:它不再是每台机器去保存一个连续的资源段,而是让每台机器都保存多个区域的部分资源段。如机器1保存每个资源段的1/4,机器2保存每个资源段的1/4,机器3、4同样如此。这样即使个别号段有热点,也会均摊到不同的机器。

03一致性hash在系统中的应用
如上介绍了一致性hash的概念和改进,在系统实践中,我们用户量非常大,往往不只一个集群。我们是如此使用一致性hash:
首先根据不同号段选择对应的集群,这部分是可配置的
确定集群后,根据一致性hash把设备匹配到server的某个instance上(每台server部署多个设备接入层实例(1.每个instance保存的状态信息更分散;2.服务的gc问题会有缓解)
建立机器虚拟节点:把user逆序(打乱之前连续userId),组成新的资源段;相当于建立了server虚拟节点
记录每台server锁服务的设备数,如果机器A挂了,挑选服务设备数最少的机器去承接kicked-device
04不是所有情况都适合一致性hash
以上介绍了一致性Hash的原理和实践,但不是所有的服务都适合用一致性hash来路由。比如01节中的消息推送系统,中间层是无状态的,开发者接入层请求cluter-A的哪台机器都行,它只要做完基本校验后,把消息异步发给MQ即可,无需等待结果直接返回; 而设备接入层是有状态的,且对较高时延无法忍受,更适合一致性Hash选择好server-instance,然后通过TCP/UDP来通信。
如果喜欢我的文章,请长按二维码,关注靳刚同学

您的转发是对我最大的支持,谢谢!
长按订阅更多精彩▼
给面试官讲明白:一致性Hash的原理和实践的更多相关文章
- 一文搞懂一致性hash的原理和实现
在 go-zero 的分布式缓存系统分享里,Kevin 重点讲到过一致性hash的原理和分布式缓存中的实践.本文来详细讲讲一致性hash的原理和在 go-zero 中的实现. 以存储为例,在整个微服务 ...
- 一致性Hash的原理与实现
应用场景 在了解一致性Hash之前,我们先了解一下一致性Hash适用于什么场景,能解决什么问题?这里先放一下我自己认为适用的场景.一致性Hash适用于服务器动态扩展且需要负载均衡的场景 试想以下场景, ...
- 分布式缓存技术memcached学习(四)—— 一致性hash算法原理
分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...
- 分布式缓存技术memcached学习系列(四)—— 一致性hash算法原理
分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前, ...
- 一致性Hash算法原理及C#代码实现
一.一致性Hash算法原理 基本概念 一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间环如下: 整个空间按顺 ...
- 一致性Hash算法原理,java实现,及用途
学习记录: 一致性Hash算法原理及java实现:https://blog.csdn.net/suifeng629/article/details/81567777 一致性Hash算法介绍,原理,及使 ...
- 跟面试官讲Binder(零)
面试的时候,面试官问你说,简单说一下Android的Binder机制,你会怎么回答? 我想,我会这么说. 在Android启动的时候,Zygote进程孵化出第一个子进程叫SystemServer,而在 ...
- 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看
前言 HashMap 源码和底层原理在现在面试中是必问的.因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合.文章较长,介绍了很多原理性的问题,希望对你有所帮助~ ...
- 【数据结构与算法】一致性Hash算法及Java实践
追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机 ...
随机推荐
- visual studio code emmet 插件不提示?解决方案
使用visual studio code编辑.vue文件时,emmet插件无法使用, 可以通过以下方试解决: code →首选项 →设置 ,在右侧窗口“用户配置”.“工作区设置”添加以下代码: // ...
- scrapy基础知识之发送POST请求:
可以使用 yield scrapy.FormRequest(url, formdata, callback)方法发送POST请求. 如果希望程序执行一开始就发送POST请求,可以重写Spider类的s ...
- Shiro中@RequiresAuthentication等等注解介绍
使用前请先开启Shiro的controller层注解,如果已经设置请下滑绕过 要在spring-mvc.xml中写. <!--下面的用于开启shiro的权限注解--> <bean c ...
- 7.秋招复习简单整理之请你讲讲 Statement 和 PreparedStatement 的区别?哪个性能更好?
Statement和PreparedStatement都是数据库用于执行SQL语句的句柄,但是PreparedStatement代表一个预编译的SQL. 以下是PreparedStatement和St ...
- idea环境下push项目
1,选中需要推送的项目: 2,VCS-git-add 添加到本地仓库 3,vcs-commit 提交 4.commit and push 推送到远程仓库 出现错误这是提示程序有错误或者是TODO代码没 ...
- Spark 中的机器学习库及示例
MLlib 是 Spark 的机器学习库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模.MLlib 由一些通用的学习算法和工具组成,包括分类.回归.聚类.协同过滤.降维等,同时还包括底层的优化 ...
- restTemplate重定向问题 &cookie问题
最近在做一个转发功能,zuul + ribbon + resttemplate 进行路由.负载.转发的功能 基本准备就绪,在微信自动登陆那遇到了一个坑,ribbon 系统用resttemplate 转 ...
- drop、truncate和delete的区别 [转载]
drop.truncate和delete的区别 本文转载自: https://www.cnblogs.com/zhizhao/p/7825469.html (1)DELETE语句执行删除的过程 ...
- 关于Object.defineProperty 的基础知识
Object.defineProperty 这个方法大家耳熟能详,可以对 对象的属性进行添加或修改的操作.即可以进行 数据劫持 .vue就是通过这个方法来劫持数据的. 平时我们创建对象的时候,一般通 ...
- C#中Thread.IsBackground 属性
Thread thread.IsBackground =true; //Gets or sets a value indicating whether or not a thread is a ba ...