Swift中的一致性哈希算法(补充)
2019獨角獸企業重金招聘Python工程師標準>>>
? ? 總結一下,理解算法時的幾個問題,搞懂這些基本上就算理解Swift rebalnce的算法了。
Swift如何保證文件的隨機存儲和保持系統中的平衡性?
例如有4臺dev(編號?0,1,??2,??3)2的18次冪262144虛節點,我們都知道builder和ring中存儲了一個數據結構_replica2part2dev,它表明了partition到replica到dev的映射關系,即某個文件的某個副本存儲到哪個dev上,如下圖
系統要做的是根據策略來生成隨機的分布,讓一個文件的三個副本可以存儲到3個不同的dev上去。
builder文件到底存的什么?
其實builder文件里存儲了一個字典型的數據結構,其中包含了整個系統所有的重要的數據。
????????????????'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文件只存儲記錄part分布的數據
?
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())文件對應的part如何生成
一個上傳文件的請求,proxy會來決定哪個node(dev)來存儲這個文件和它的副本。然后向選好的dev發送請求。
例如 admin賬戶,向test容器中,上傳一個名字為update.c的文件。會根據/admin/test/update.c + 設置的HASH_PATH_SUFFIX 生成一個md5 的值 然后解析成一個數字 例如35564 這個就是part,然后在_replica2part2dev 中查找它的三個replica所在的dev ?,然后向這三個dev發送請求。
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對應的sort_key影響它分配的方式,系統生成一個字符串,它分成三段,進行排序,第一段為dev_want,第二段隨機數,第三段dev_id,系統根據這個三段排序,然后查找最想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
系統設置的part減去已經分配的part?生成想要得到的part
轉載于:https://my.oschina.net/zhouxingxing/blog/83749
總結
以上是生活随笔為你收集整理的Swift中的一致性哈希算法(补充)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JQuery图表插件之Flot
- 下一篇: 【iCore组合式双核心开发板教程】【快