云存储硬核技术内幕——(19) 温泉关三百勇士大败波斯(下)

2022-08-04 15:42:25 浏览数 (1)

从在上一期,我们提到,为了有效组织勇士们抵御波斯侵略军,保卫家园,列奥尼达需要经常调整勇士们的战斗阵型,又希望大部分勇士们不需要改变自己的战斗位置。列奥尼达设计了一个环,勇士们根据自己的编号,在环上找到自己的位置,这种算法叫做,一致性哈希(Consistant Hashing)。

一致性哈希的一个缺陷是,哈希环上节点的序号设计不合理时,容易造成哈希不均匀,部分小队人多,部分小队人少,例如这样:

即使我们想办法让哈希环上的节点序号分布得较为均匀,在新的节点加入哈希环后,又会造成新的不均匀:

那么,有没有什么好办法,让各个小分队的人数和战斗力能够较为均匀呢?

列奥尼达突然想到,去翻翻亚里士多德的著作,也许能找到答案……

果然,在亚里士多德的《形而上学》中,列奥尼达发现了这段:

“……万物始所从来,与其格所从人者:其属性变化不已,而本体常如,他们因而称之为元素……譬如我们说苏格拉底美而文明,其所为美与文明者,可先有而后失,乍不常在,然苏格拉底则常在……”

原来,亚里士多德认为,人有自己常在的本体,也有很多变化的属性。如果将这些变化的属性视为人虚拟化的分身,它们是不常在的,而人本身常在。

列奥尼达想到,如果赋予哈希环上的节点拥有多个分身的能力……

如果为哈希环上的节点赋予多个分身……

如果哈希环上有P个节点,每个节点有Q个分身,那么,实际上哈希环上就有了P x Q个分身。我们可以将Q设定为一个比较大的数,如256。根据大数定律,P x Q个随机数,一定会比P个随机数散布得更均匀!(如何用数学方法表达分布均匀性,这个问题留给大家思考)

如图,A/B/C/D/E五个节点经过分身并随机分布在哈希环上以后,哈希环变得大大均匀了:

这样,勇士通过自己的随机编号,在哈希环上顺时针往前走,找到A/B/C/D/E节点的分身,并进入对应的小分队的概率基本上是平等的。

那么,如果再加入一个F小分队呢?

由于F节点也会有多个随机出现的分身,分身随机地落在其他小分队节点分身管辖的区间内,F小分队从其他各个小队分走的勇士数量,从概率上而言,是基本均衡的。同理,当我们减少小分队数量的时候,如解散了小分队D,小分队D的勇士也可以较为均衡地随机分布到其他小分队去。

这样一来,列奥尼达通过引入一致性哈希的机制,实现了以下几点:

1、让现有的勇士们和新加入战团的勇士们,能够均匀分配到各个小分队;

2、当需要从各小分队抽调勇士组建新的小分队的时候,对其他勇士没有影响,并且尽量均匀地从各个小分队抽调;

3、当某个小分队需要解散的时候,勇士们能均匀分到其他小分队,已经在其他小分队的勇士们不受影响;

经过激战,最终希腊城邦击败了波斯侵略军,取得了希波战争的胜利!

让我们回到swift的世界。

swift的ring,其实就是我们提到的一致性哈希环。

我们在前面的故事中,把小分队替换为物理磁盘,勇士替换为对象经过切分后的数据块,可以发现,swift通过一致性哈希算法,解决了这几个问题:

1. 数据如何均匀分布到集群中的各个物理磁盘?

2. 当有新的物理磁盘加入集群时,如何均匀地从其他磁盘上抽调数据移动到新的物理磁盘上,让整个集群上磁盘的负载大致均衡?

3. 如果有物理磁盘离开集群,如何在其他物理磁盘上均匀分配空间,重新构建离开集群的磁盘上数据的副本,保证整个集群上磁盘的负载大致均衡?

一致性哈希是分布式存储的关键算法,除了swift外,Lustre也采用了这种算法解决集群的扩展性问题。

当然,解决这个问题仅仅是对象存储的万里长征走完第一步,想让对象存储变得好用,我们还需要解决很多问题……

请看下回分解。

0 人点赞