架构一期第五周作业
发布于: 2020 年 10 月 26 日
作业一(2 选 1):
用你熟悉的编程语言实现一致性 hash 算法。
编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。
import hashlibimport randomimport numpyclass ConsistentHashing(): def __init__(self, nodes=None, n_number=100): self._n_number = n_number # 虚拟节点个数 self._node_dict = dict() # 虚拟节点hash值对应node self._sort_list = [] # 虚拟节点hash值存放 if nodes: for node in nodes: self.add_node(node) # 添加节点 def add_node(self, node): for i in range(self._n_number): node_str = "%s%s" % (node, i) key = self._gen_key(node_str) self._node_dict[key] = node self._sort_list.append(key) # 删除节点 def remove_node(self, node): for i in range(self._n_number): node_str = "%s%s" % (node, i) key = self._gen_key(node_str) del self._node_dict[key] self._sort_list.remove(key) # 获取节点hash值 def get_node(self, key_str): if self._sort_list: key = self._gen_key(key_str) for node_key in self._sort_list: if key <= node_key: return self._node_dict[node_key] return self._node_dict[self._sort_list[0]] # 对key值hash @staticmethod def _gen_key(key_str): Vhash = hashlib.md5(key_str.encode("utf-8")).hexdigest() return int(Vhash, 16)# 生成节点以及虚拟节点个数vhss = [1, 10, 50 ,100, 150, 200, 300]hosts = []for i in range(10): hosts.append(i)# 生成随机100万个kvi = 0random_key = []while i <= 1000000: random_key.append(str(random.randint(0,1000000))) i += 1for n in vhss: # 生成有n个虚拟节点的一致性hash testHashing = ConsistentHashing(hosts,n_number=int(n)) # 打印各key所在的节点 sample = [] for i in random_key: sample.append(testHashing.get_node(i)) # print(testHashing.get_node(i)) # 统计离散程度 result = numpy.std(sample, ddof = 1) print(str(n) + "个虚拟节点时的标准差为:" + str(result))
看下面结果,总感觉不对………………
划线
评论
复制
发布于: 2020 年 10 月 26 日 阅读数: 16
Airs
关注
Emmmmmmm 2018.02.28 加入
Emmmmmmm
评论