Swift中的一致性哈希算法(补充)
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)?0,1,??2,??3)2的18次冪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_devsring文件里到底存了什么?
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)題。
- 上一篇: JQuery图表插件之Flot
- 下一篇: 【iCore组合式双核心开发板教程】【快