当前位置: 首页 > 科技观察

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

时间:2023-03-12 11:42:04 科技观察

一致性哈希算法及其在分布式存储中的应用集群很快被92%以上的用户使用。“外行看热闹,内行看门道”,一位从事分布式存储的同事看到后说:存储利用率接近93%,数据还在写入中,可见OStorage-EOS的数据分布非常均匀。否则,如果数据分布不够均匀,其他节点或磁盘可能还有很多空间,但是某个磁盘或某个节点已经满了,这时候继续往里面写数据,就会出问题.那么OStorage-EOS分布式对象存储是如何让数据均匀分布在各个磁盘上的呢?原来是用了一种叫“ConsistentHashing”的算法,在consistenthashing的基础上进行了改进,增加了weight、replica、cabinetawareness、regionawareness等机制。一致性哈希算法也是分布式系统领域的经典算法,在很多地方都有应用。下面我们一起来看看:哈希函数在仔细研究一致性哈希之前,我们先来了解一下基本的哈希Hi,一个我们如何使用哈希函数来确定对象存储位置的例子。先看一个比较简单的数据定位方法,用MD5算法得到对象逻辑位置的hash值,然后除以可用磁盘数得到余数。***将剩余值映射到驱动器ID。例如,对象存储在/accountA/container1/objectX,使用4个磁盘存储数据,我们称它们为磁盘0到磁盘3。这里我们先计算MD5值:md5-s/accountA/container1/objectXMD5("/account/container/object")=f9db0f833f1545be2e40f387d6c271de然后我们将hash值(十六进制值)除以盘数取余(取模)。上述十六进制值转十进制为:332115198597019796159838990710599741918取模函数在大多数编程语言中用%运算符表示:332115198597019796159838990710599741918%4=2由于余数为2,所以该算法的最大缺点是将对象存储在磁盘2上就是计算结果取决于除数,也就是盘数。任何时候添加或删除磁盘(除数发生变化)时,同一个对象可能会得到不同的余数,从而映射到不同的磁盘。为了说明这一点,下表显示了添加磁盘后哪个磁盘将成为对象的新存储位置。请注意,几乎每次添加新磁盘时,都必须将对象移动到新磁盘。这只是一个对象的情况。这种行为是普遍的。在添加或删除节点和磁盘时,集群中几乎所有的数据都需要移动。集群将不得不花费大量资源来进行这些迁移,还会产生沉重的网络负载,并且数据将无法读取。ConsistentHashingAlgorithmConsistentHashing可以减少在集群中添加或删除磁盘和节点时移动对象的数量。一致性哈希不是将每个值直接映射到磁盘,而是通过将所有可能的哈希值建模为一个环来工作。一致性哈希算法除了计算对象的哈希值外,还会计算设备的哈希值,根据IP地址和磁盘盘符计算哈希值。每个磁盘都映射到哈希环的某个点,如图所示。当需要存储一个对象时,首先计算该对象的哈希值,然后将其定位在环上,如“对象的哈希”位置所示。系统顺时针搜索环上方下一个磁盘的哈希值,然后找到要存储数据的磁盘。上图中可以看到,对象会存放在磁盘4上。根据这个算法,哈希环上一定区间的哈希值会映射到一个磁盘上。如图所示,我们用不同的颜色来表示不同的区间及其对应的盘面。如果一个对象的哈希值落在蓝色范围内,那么它就会被存储在磁盘1上。有了这样的哈希环,当我们添加新的磁盘,比如磁盘5时,图中粉色部分就不再属于disk4,因为这部分的所有数据目前都属于新的disk5,所以位于disk4的这部分object会被移动到disk5,而其他数据不会受到影响。使用这种方案,增加一个磁盘或者一个节点只需要移动少量的数据,比之前依赖计算哈希值和模数来确定数据存储位置的方案要好很多。移动大量数据。在一致性哈希算法的实际应用中,每一个实际的磁盘或节点都会对应环上的多个标记,这些标记在一些文献中也被称为“虚拟节点(VirtualNode)”,一个磁盘对应许多标签/虚拟节点,甚至每个磁盘对应数百个标签。多个标记是指将环对应的每个磁盘的哈希值范围从一个大区域划分为若干个小区域。这有两个作用。一个效果是一个新增加的磁盘可能会从多个磁盘迁移对象数据,进一步降低了数据迁移的压力。另一个效果是整体数据分布更加均匀。以上就是一致性哈希的基本原理。OStorage-EOS基于一致性哈希算法实现数据的均匀分布,并通过引入副本、权重、柜体感知、区域感知等机制进行改进,以满足企业级用户的需求。.