2

一致性hash算法及其实现

 2 years ago
source link: https://allenwind.github.io/blog/5966/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
Mr.Feng Blog

NLP、深度学习、机器学习、Python、Go

一致性hash算法及其实现

简单讲述一致性hash算法。

大数据时代,单机数据库再也无法满足存储、访问需求。为满足需求,数据库往往会做分库分表处理。这就引申出一个问题:如何让存储的数据尽可能均匀地分散到各个节点,同时满足减少节点是数据的迁移较少。

一致性哈希算法

这个算法在Cache系统中的应用越来越广。最早出现在Consisten Hashing and Random Trees

基本使用场景

有N台cache服务器,如何将一个对象object映射到N台cache上?通常情况下会考虑这样的映射规则:hash(object)%N

再考虑如下三种情况:

  • cache集群中的服务器k宕机了,所有映射到k上的对象都失效了,这时需要把服务器k从集群中移去,这样集群中还有N-1台服务器,映射公式变成hash(object)%(N-1)

  • 由于cache的访问量加大,需要添加cache,如果添加一台,映射公式变成hash(object)%(N+1)

  • 后来添加上去的节点,如何把访问量从整体上平分开来?

这三种情况的解决方案需要一致性哈希算法

hash算法和单调性

hash算法的一个衡量标准是单调性(Monotonicity),定义如下:

  • 单调性指如果已经有一些内容通过哈希分派到相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到旧的缓冲中,而不会被映射到新的缓冲集合中。上述简单的映射无法满足单调性。

一致性哈希算法的原理

基本眼里包括如下几点:

  • 环形hash空间
  • 把对象映射到hash空间
  • 把cache映射到hash空间
  • 把对象映射到cache
  • 考察cache的变动

虚拟结点的处理方法

引入虚拟节点就是为了处理当节点异常而引起的问题。

  • 虚拟结点的处理方法

Hash(“IPAddress”) | 没有虚拟结点的情况

Hash(“IPAddress#1”) | 有虚拟节点#1
Hash(“IPAddress#2”) | 有虚拟节点#2


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK