分布式存储与一致性哈希

文章目录

    • 背景
    • 分布式存储
    • 一致性哈希

背景

许多应用的数据比如聊天内容其实也保存在服务端,而当用户基数庞大的时候,一台服务器肯定是存不下数据的。

分布式存储

例子:假设微信有10亿用户,一个用户的微信信息100M,假设每一个通过微信号来对应微信信息。这是时候就需要差不多10WT的空间来保存这些数据。假设一台服务器有1T的空间,现在就需要10W台服务器。

那么如何保存这些数据?

我们保存数据肯定是为了更加方便的查找,在面对海量数据的时候,可以采用哈希切割。

将每一台服务器进行编号,利用哈希切割,对微信号进行哈希(i = hashstr(微信号) % n,其中n是服务器总台数),然后再额外使用一台服务器保存服务器编号和服务器ip的映射关系。查询的时候直接将请求发送到查询服务器,然后进行哈希获得消息所存的服务器编号,再通过映射找到对应服务器的ip地址进行查询。

有无缺陷?

我们可以发现,当用户数量不断增多的时候,需要增加服务器,而增加服务器会导致n变化,从而之前的映射关系就会变化。就得将数据全部重新拷贝。

如何解决?

一致性哈希

一致性哈希

对哈希切割函数进行修改: i = h a s h s t r ( 微 信 号 ) % ( 2 32 ) − 1 i=hashstr(微信号)\%(2^{32}) -1 i=hashstr()%(232)1,通常来说模上一个大数,这样就可以保证服务器数量增加的时候之前服务器取模后的编号不变。

如何处理i > 服务器编号的值?

2 23 − 1 2^{23}-1 2231分割成实际服务器总台数个数的范围段。一个范围对应一台服务器,在这个范围里的i保存到对应服务器中。比如:算出来的i在区间10000~20000时,保存在3号服务器中。

分布式存储与一致性哈希_第1张图片

当增加服务器台数的时候,利用哈希切割公式找到负载比较大的服务器,将这台服务器对应的区间分出来一段保存到新服务器中。

例如:1000020000范围保存到3号服务器中,但是数据量保存比较多,新增服务器时,将1000015000范围的i保存到新服务器中,将15000~20000仍然保存在3号服务器。此时并不需要将用户数据全部迁移,只需要迁移一小部分数据。一般在用户量少的时候进行迁移。

你可能感兴趣的:(C++,一致性哈希)