日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Swift中的一致性哈希算法(补充)

發(fā)布時(shí)間:2025/7/14 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift中的一致性哈希算法(补充) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>


? ? 總結(jié)一下,理解算法時(shí)的幾個(gè)問(wèn)題,搞懂這些基本上就算理解Swift rebalnce的算法了。

Swift如何保證文件的隨機(jī)存儲(chǔ)和保持系統(tǒng)中的平衡性?

例如有4臺(tái)dev(編號(hào)?01,??2,??3218次冪262144虛節(jié)點(diǎn),我們都知道builder和ring中存儲(chǔ)了一個(gè)數(shù)據(jù)結(jié)構(gòu)_replica2part2dev,它表明了partition到replica到dev的映射關(guān)系,即某個(gè)文件的某個(gè)副本存儲(chǔ)到哪個(gè)dev上,如下圖

系統(tǒng)要做的是根據(jù)策略來(lái)生成隨機(jī)的分布,讓一個(gè)文件的三個(gè)副本可以存儲(chǔ)到3個(gè)不同的dev上去。



builder文件到底存的什么?

其實(shí)builder文件里存儲(chǔ)了一個(gè)字典型的數(shù)據(jù)結(jié)構(gòu),其中包含了整個(gè)系統(tǒng)所有的重要的數(shù)據(jù)。

????????????????'part_power': self.part_power,'replicas': self.replicas,'min_part_hours': self.min_part_hours,'parts': self.parts,'devs': self.devs,'devs_changed': self.devs_changed,'version': self.version,'_replica2part2dev': self._replica2part2dev,'_last_part_moves_epoch': self._last_part_moves_epoch,'_last_part_moves': self._last_part_moves,'_last_part_gather_start': self._last_part_gather_start,'_remove_devs': self._remove_devs

ring文件里到底存了什么?

ring文件只存儲(chǔ)記錄part分布的數(shù)據(jù)

?

def serialize_v1(self, file_obj):# Write out new-style serialization magic and version:file_obj.write(struct.pack('!4sH', 'R1NG', 1))ring = self.to_dict()json_text = json.dumps({'devs': ring['devs'], 'part_shift': ring['part_shift'],'replica_count': len(ring['replica2part2dev_id'])})json_len = len(json_text)file_obj.write(struct.pack('!I', json_len))file_obj.write(json_text)for part2dev_id in ring['replica2part2dev_id']:file_obj.write(part2dev_id.tostring())

文件對(duì)應(yīng)的part如何生成

一個(gè)上傳文件的請(qǐng)求,proxy會(huì)來(lái)決定哪個(gè)node(dev)來(lái)存儲(chǔ)這個(gè)文件和它的副本。然后向選好的dev發(fā)送請(qǐng)求。

例如 admin賬戶,向test容器中,上傳一個(gè)名字為update.c的文件。會(huì)根據(jù)/admin/test/update.c + 設(shè)置的HASH_PATH_SUFFIX 生成一個(gè)md5 的值 然后解析成一個(gè)數(shù)字 例如35564 這個(gè)就是part,然后在_replica2part2dev 中查找它的三個(gè)replica所在的dev ?,然后向這三個(gè)dev發(fā)送請(qǐng)求。

def get_nodes(self, account, container=None, obj=None):key = hash_path(account, container, obj, raw_digest=True)#md5(/account/contianer/obj + HASH_PATH_SUFFIX).digest()if time() > self._rtime:self._reload()part = struct.unpack_from('>I', key)[0] >> self._part_shiftseen_ids = set()return part, [self._devs[r[part]] for r in self._replica2part2dev_idif not (r[part] in seen_ids or seen_ids.add(r[part]))]

sort_key

dev對(duì)應(yīng)的sort_key影響它分配的方式,系統(tǒng)生成一個(gè)字符串,它分成三段,進(jìn)行排序,第一段為dev_want,第二段隨機(jī)數(shù),第三段dev_id,系統(tǒng)根據(jù)這個(gè)三段排序,然后查找最想want的dev

? ?

def _sort_key_for(self, dev):# The maximum value of self.parts is 2^32, which is 9 hex# digits wide (0x100000000). Using a width of 16 here gives us# plenty of breathing room; you'd need more than 2^28 replicas# to overflow it.# Since the sort key is a string and therefore an ascii sort applies,# the maximum_parts_wanted + parts_wanted is used so negative# parts_wanted end up sorted above positive parts_wanted.return '%016x.%04x.%04x' % ((self.parts * self.replicas) + dev['parts_wanted'],randint(0, 0xffff),dev['id'])

parts_wanted?=?(sum_part/sum_weight?)*dev_weith-dev_pars

系統(tǒng)設(shè)置的part減去已經(jīng)分配的part?生成想要得到的part



轉(zhuǎn)載于:https://my.oschina.net/zhouxingxing/blog/83749

總結(jié)

以上是生活随笔為你收集整理的Swift中的一致性哈希算法(补充)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。