python3 一致性hash算法

python3 一致性hash算法

量少的场景, 一致性hash不均匀的问题很难解决,加500个虚拟节点也不是很管用

算法很简单,自己用函数写了一下,仅供参考:

python3代码展示:

import hashlib

server_ip_list = ["192.168.1.10", "192.168.2.20", "192.168.3.30","192.168.4.40"]
client_ip_list = ["113.88.97.173", "106.11.154.33", "207.46.13.149","42.156.137.120", "203.208.60.0", "119.39.47.182", "171.34.179.4", "111.175.58.52", "124.235.138.199","175.184.166.184","111.175.58.52", "124.235.18.119","175.144.163.124","175.14.166.114","111.175.8.152", "124.23.18.113","175.144.13.116"]

def get_md5(data):
    m = hashlib.md5()
    m.update(data.encode(‘utf-8‘))
    return m.hexdigest()

def get_ip():
    virtual_nodes = 500
    node_dict = {}
    # 遍历服务器ip,生成对应的虚拟结点
    for serverip in server_ip_list:
        for i in range(virtual_nodes):
            # serverip加上一些动态参数生成md5值
            hash_key = get_md5(str(‘{0}VN{1}‘.format(serverip,i)))
            node_dict[hash_key]=serverip
    # 将node_dict字典按key排序生成列表
    sorted_key_list = sorted(node_dict)
    # 将node_dict字典按key排序
    node_dict = sorted(node_dict.items(),key=lambda d:d[0],reverse=False)
    #print(node_dict)
    #print(sorted_key_list)

    for clientip in client_ip_list:
        selected_key_list = []
        # clientip生成md5值
        hc = get_md5(str(clientip))
        #print(hc)
        switch = 0
        for key in sorted_key_list:
            #print(key)
            # clientip和sorted_key_list中的md5值做比较,clientip的md5值小于等于sorted_key_list中的md5值,switch=1
            if hc <= key:
                selected_key_list.append(key)
                switch=1
        if switch == 0:
            firstkey = sorted_key_list[0]
        else:
            firstkey = selected_key_list[0]
        #print(firstkey)
        #print(selected_key_list)
        print("{0}请求的服务器ip为:{1}".format(clientip,dict(node_dict)[firstkey]))

# for i in range(2):
get_ip()

执行结果:

113.88.97.173请求的服务器ip为:192.168.2.20
106.11.154.33请求的服务器ip为:192.168.4.40
207.46.13.149请求的服务器ip为:192.168.3.30
42.156.137.120请求的服务器ip为:192.168.3.30
203.208.60.0请求的服务器ip为:192.168.3.30
119.39.47.182请求的服务器ip为:192.168.3.30
171.34.179.4请求的服务器ip为:192.168.4.40
111.175.58.52请求的服务器ip为:192.168.1.10
124.235.138.199请求的服务器ip为:192.168.3.30
175.184.166.184请求的服务器ip为:192.168.3.30
111.175.58.52请求的服务器ip为:192.168.1.10
124.235.18.119请求的服务器ip为:192.168.2.20
175.144.163.124请求的服务器ip为:192.168.2.20
175.14.166.114请求的服务器ip为:192.168.4.40
111.175.8.152请求的服务器ip为:192.168.2.20
124.23.18.113请求的服务器ip为:192.168.1.10
175.144.13.116请求的服务器ip为:192.168.4.40

原文地址:https://blog.51cto.com/3607453/2467684

时间: 2024-08-08 08:43:53

python3 一致性hash算法的相关文章

一致性hash算法

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用.很多哈希算法都能够满足

分布式memcached学习(四)&mdash;&mdash; 一致性hash算法原理

    分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几个概念. 分布式 分布式(distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务. 以一个航班订票系统为例,这个航班订票系统有航班预定.网上值机.旅客信息管理.订单管理.运价计算等服务模块.现在要以集中式(集群,cluster)和分布

分布式算法(一致性Hash算法)

一.分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Response Time).加权法(Weighted )等.其中哈希算法是最为常用的算法. 典型的应用场景是: 有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务器上,每台机器负责1/N的服务. 常用的算法是对hash结果取余数 (hash() mod N ):对机器编号

对一致性Hash算法,Java代码实现的深入研究

一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在

memcache的一致性hash算法使用

一.概述 1.我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的key进行hash计算,分配到不同节点存储.一致性hash算法是对我们要存储数据的服务器进行hash计算,进而确认每个key的存储位置.  2.常规hash算法的应用以及其弊端 最常规的方式莫过于hash取模的方式.比如集群中可用机器适量为N,那么key值为K的的数据请求很简单的应该路由到hash(K

一致性hash算法详解

转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Bal

一致性Hash算法及使用场景

一.问题产生背景      在使用分布式对数据进行存储时,经常会碰到需要新增节点来满足业务快速增长的需求.然而在新增节点时,如果处理不善会导致所有的数据重新分片,这对于某些系统来说可能是灾难性的. 那么是否有可行的方法,在数据重分片时,只需要迁移与之关联的节点而不需要迁移整个数据呢?当然有,在这种情况下我们可以使用一致性Hash来处理. 二.一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot

第十一章 自己实现一致性hash算法

关于一致性hash算法的意义以及其相对于简单求余法(除数求余法)的好处,查看第六章 memcached剖析 注意:真实的hash环的数据结构是二叉树,这里为了简便使用了列表List 1.一致性hash算法的使用地方 memcached服务器 Jedis分片机制 2.真实服务器节点没有虚拟化的一致性hash算法实现 ServerNode:真实服务器节点 1 package hash; 2 3 /** 4 * server节点 5 */ 6 public class ServerNode { 7 p

一致性Hash算法的理解

最近在使用集团内部的TimeTunnel时,想到了中间件的订阅调度策略,可能用到一致性Hash技术,所以查阅了网上其相关的博客与资料,顺便说说自己的一些粗浅理解. 1. 应用场景     如果从十几年前的文章标题”Consistent Hashing and Random Trees“中,可以看出一致性Hash算法的最初提出,是为了解决Web服务页面访问的Cache热点问题而引入的.其实一致性Hash算法已经广泛地应用在现在的web服务中,例如: a. 外层CDN架构里的Nginx代理服务: 全