架构第五周作业
发布于: 2020 年 10 月 25 日
作业一(2 选 1):
用你熟悉的编程语言实现一致性 hash 算法。
编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。
一致性hash
import hashlibclass HashRing(object): def __init__(self, nodes=None, vnodes=3): self.vnodes = vnodes self.ring = dict() self._sorted_keys = [] if nodes: for node in nodes: self.add_node(node) def add_node(self, node): for i in range(0, self.vnodes): key = self.gen_key('%s:%s' % (node, i)) self.ring[key] = node self._sorted_keys.append(key) self._sorted_keys.sort() def remove_node(self, node): for i in range(0, self.vnodes): key = self.gen_key('%s:%s' % (node, i)) del self.ring[key] self._sorted_keys.remove(key) def get_node(self, string_key): return self.get_node_pos(string_key)[0] def get_node_pos(self, string_key): if not self.ring: return None, None key = self.gen_key(string_key) nodes = self._sorted_keys for i in range(0, len(nodes)): node = nodes[i] if key <= node: return self.ring[node], i return self.ring[nodes[0]], 0 def get_nodes(self, string_key): if not self.ring: yield None, None node, pos = self.get_node_pos(string_key) for key in self._sorted_keys[pos:]: yield self.ring[key] while True: for key in self._sorted_keys: yield self.ring[key] def gen_key(self, key): m = hashlib.md5() m.update(key.encode()) return m.hexdigest()
划线
评论
复制
发布于: 2020 年 10 月 25 日 阅读数: 8
Geek_Gu
关注
还未添加个人签名 2019.09.09 加入
还未添加个人简介
评论