架构一期第五周作业

用户头像
Airs
关注
发布于: 2020 年 10 月 26 日



作业一(2 选 1):

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

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

import hashlib
import random
import numpy
class 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 = [11050 ,100150200300]
hosts = []
for i in range(10):
    hosts.append(i)
# 生成随机100万个kv
i = 0
random_key = []
while i <= 1000000:
    random_key.append(str(random.randint(0,1000000)))
    i += 1
for 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))



看下面结果,总感觉不对………………



用户头像

Airs

关注

Emmmmmmm 2018.02.28 加入

Emmmmmmm

评论

发布
暂无评论
架构一期第五周作业