博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一致性哈希算法及其在分布式系统中的应用
阅读量:6900 次
发布时间:2019-06-27

本文共 1160 字,大约阅读时间需要 3 分钟。

摘要

本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题。

分布式缓存问题

假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Memcached作为缓存机制。现在我们一共有三台机器可以作为Memcached服务器,如下图所示。

很显然,最简单的策略是将每一次Memcached请求随机发送到一台Memcached服务器,但是这种策略可能会带来两个问题:一是同一份数据可能被存在不同的机器上而造成数据冗余,二是有可能某数据已经被缓存但是访问却没有命中,因为无法保证对相同key的所有访问都被发送到相同的服务器。因此,随机策略无论是时间效率还是空间效率都非常不好。

要解决上述问题只需做到如下一点:保证对相同key的访问会被发送到相同的服务器。很多方法可以实现这一点,最常用的方法是计算哈希。例如对于每次访问,可以按如下算法计算其哈希值:

h = Hash(key) % 3

其中Hash是一个从字符串到正整数的哈希映射函数。这样,如果我们将Memcached Server分别编号为0、1、2,那么就可以根据上式和key计算出服务器编号h,然后去访问。

这个方法虽然解决了上面提到的两个问题,但是存在一些其它的问题。如果将上述方法抽象,可以认为通过:

h = Hash(key) % N

这个算式计算每个key的请求应该被发送到哪台服务器,其中N为服务器的台数,并且服务器按照0 – (N-1)编号。

这个算法的问题在于容错性和扩展性不好。所谓容错性是指当系统中某一个或几个服务器变得不可用时,整个系统是否可以正确高效运行;而扩展性是指当加入新的服务器后,整个系统是否可以正确高效运行。

现假设有一台服务器宕机了,那么为了填补空缺,要将宕机的服务器从编号列表中移除,后面的服务器按顺序前移一位并将其编号值减一,此时每个key就要按h = Hash(key) % (N-1)重新计算;同样,如果新增了一台服务器,虽然原有服务器编号不用改变,但是要按h = Hash(key) % (N+1)重新计算哈希值。因此系统中一旦有服务器变更,大量的key会被重定位到不同的服务器从而造成大量的缓存不命中。而这种情况在分布式系统中是非常糟糕的。

一个设计良好的分布式哈希方案应该具有良好的单调性,即服务节点的增减不会造成大量哈希重定位。一致性哈希算法就是这样一种哈希方案。

个人博客已迁移至,本文全文最新地址为,欢迎访问!!!

转载地址:http://vvcdl.baihongyu.com/

你可能感兴趣的文章
Delphi中DLL的其他应用
查看>>
Node.js nvshens图片批量下载爬虫 1.00
查看>>
[转]Android中的一个TextView中的字体设置不同大小
查看>>
Linux系统搭建负载均衡环境
查看>>
mvn deploy命令上传包
查看>>
C# 中的多线程
查看>>
如何在Mac上放大
查看>>
转:Java NIO系列教程(七) Socket Channel
查看>>
MongoDB aggregate 运用篇(转)
查看>>
【Static Program Analysis - Chapter 3】Type Analysis
查看>>
类的继承关系,多态的体现,我的觉得题目还是有点欠缺
查看>>
微服务(Microservices)—Martin Fowler【翻译】
查看>>
新浪微博客户端(58)-处理点击微博内容中的关键字
查看>>
文件资源Android项目的工程结构
查看>>
Mockito 库、powermock扩展
查看>>
各版本JDK1.5-1.8新特性
查看>>
京东无界零售带来机遇,家电专卖店拉动实体经济,大学生的致富经
查看>>
中国物流能送到四海八荒,菜鸟年度排行榜告诉你都去了哪些地方
查看>>
从业界良心到疲态尽显 Netflix到底中了什么降头?
查看>>
OpenStack消亡?在企业落地为什么越来越难
查看>>