写点什么

架构训练营第五周作业

用户头像
一期一会
关注
发布于: 2020 年 11 月 22 日

作业:


1. 用你熟悉的编程语言实现一致性 hash 算法。


解答


用 python 实现:

import md5
class HashRing(object):
def __init__(self, nodes=None, replicas=10): """生成哈希环.
`nodes` :包含实现__str__ 方法的队列. `replicas` 每个节点生成的虚拟节点, 用于改善分布的随机性 """ self.replicas = replicas
self.ring = dict() self._sorted_keys = []
if nodes: for node in nodes: self.add_node(node)
def add_node(self, node): """增加一个节点(会按照配置生成虚拟节点数). """ for i in xrange(0, self.replicas): 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 xrange(0, self.replicas): key = self.gen_key('%s:%s' % (node, i)) del self.ring[key] self._sorted_keys.remove(key)
def get_node(self, string_key): """按照键返回对应分配的节点
哈希环为空,返回 `None` """ return self.get_node_pos(string_key)[0]
def get_node_pos(self, string_key): """查询节点位置
哈希环为空,返回 `None` """ if not self.ring: return None, None
key = self.gen_key(string_key)
nodes = self._sorted_keys for i in xrange(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 = md5.new() m.update(key) return long(m.hexdigest(), 16)
复制代码

2.编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性


编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性


发布于: 2020 年 11 月 22 日阅读数: 66
用户头像

一期一会

关注

还未添加个人签名 2018.01.08 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
可以做一个测试用例看看偏差
2020 年 11 月 29 日 11:01
回复
没有更多了
架构训练营第五周作业