专栏名称: 算法与数据结构
算法与数据结构知识、资源分享
目录
相关文章推荐
九章算法  ·  「九点热评」Meta面试新政策曝光 ·  11 小时前  
算法爱好者  ·  TikTok 又可以“续命” 75 天 ·  昨天  
九章算法  ·  FAANG算法大牛开课了!在线击破57个算法 ... ·  3 天前  
51好读  ›  专栏  ›  算法与数据结构

一致性哈希算法及其在分布式系统中的应用

算法与数据结构  · 公众号  · 算法  · 2017-09-18 16:06

正文

请到「今天看啥」查看全文



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


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


一致性哈希算法


算法简述


一致性哈希算法(Consistent Hashing)最早在论文《Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web》中被提出。简单来说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0 - 232-1(即哈希值是一个32位无符号整形),整个哈希空间环如下:



整个空间按顺时针方向组织。0和2^32-1在零点中方向重合。


下一步将各个服务器使用H进行一个哈希,具体可以选择服务器的ip或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置,这里假设将上文中三台服务器使用ip地址哈希后在环空间的位置如下:



接下来使用如下算法定位数据访问到相应服务器:将数据key使用相同的函数H计算出哈希值h,通根据h确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器。


例如我们有A、B、C、D四个数据对象,经过哈希计算后,在环空间上的位置如下:



根据一致性哈希算法,数据A会被定为到Server 1上,D被定为到Server 3上,而B、C分别被定为到Server 2上。


容错性与可扩展性分析


下面分析一致性哈希算法的容错性和可扩展性。现假设Server 3宕机了:







请到「今天看啥」查看全文