文档章节

使用HashRing实现python下的一致性hash

G
 GeorgeBrown
发布于 2015/06/06 01:02
字数 450
阅读 125
收藏 1
import md5
class HashRing(object):
    def __init__(self, nodes=None, replicas=3):
        """Manages a hash ring.
        `nodes` is a list of objects that have a proper __str__ representation.
        `replicas` indicates how many virtual points should be used pr. node,
        replicas are required to improve the distribution.
        """
        self.replicas = replicas
        self.ring = dict()
        self._sorted_keys = []
        if nodes:
            for node in nodes:
                self.add_node(node)
    def add_node(self, node):
        """Adds a `node` to the hash ring (including a number of replicas).
        """
        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):
        """Removes `node` from the hash ring and its replicas.
        """
        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):
        """Given a string key a corresponding node in the hash ring is returned.
        If the hash ring is empty, `None` is returned.
        """
        return self.get_node_pos(string_key)[0]
    def get_node_pos(self, string_key):
        """Given a string key a corresponding node in the hash ring is returned
        along with it's position in the ring.
        If the hash ring is empty, (`None`, `None`) is returned.
        """
        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):
        """Given a string key it returns the nodes as a generator that can hold the key.
        The generator is never ending and iterates through the ring
        starting at the correct position.
        """
        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):
        """Given a string key it returns a long value,
        this long value represents a place on the hash ring.
        md5 is currently used because it mixes well.
        """
        m = md5.new()
        m.update(key)
        return long(m.hexdigest(), 16)



from hash_ring import *
memcache_servers = ['192.168.0.246:11212',
                   '192.168.0.247:11212',
                    '192.168.0.249:11212']
ring = HashRing(memcache_servers)
server = ring.get_node('my_key')
print server
server = ring.get_node('my_keysdfsdf')
print server


有了一致性hash,你可以最小程度的减轻因为增加或者是减少服务器带来的大量的缓存MISS 

在Memcached、Key-Value Store、Bittorrent DHT、LVS中都采用了Consistent Hashing算法,可以说Consistent Hashing 是分布式系统负载均衡的首选算法

© 著作权归作者所有

共有 人打赏支持
G
粉丝 1
博文 17
码字总数 8910
作品 0
厦门
高级程序员
私信 提问
用Python从零开始创建区块链1

作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用Python来创建一个区块链。 对数字货币的崛起感到新奇的我们,并且想知道其背后的技术——区块链是怎样实现的。 但是完全搞懂...

雪花又一年
04/13
0
0
通过PHP的hash冲突漏洞进行DDoS攻击的解决办法

通过PHP的hash冲突漏洞进行DDoS攻击的解决办法 最近各语言爆hash碰撞漏洞。包含php,ruby,python,java各个语言。Microsoft的.net也受影响。 hash碰撞原理: Hash,简单来讲,是一种将任意长度的...

keengo
2012/01/07
0
0
从0开始构建区块链(Blockchain)

从0开始构建区块链(Blockchain) 2018-07-20 14:53编辑: yyuuzhu分类:区块链来源:树下老男孩 区块链 招聘信息: iOS开发 iOS开发 iOS开发 app开发上架H5技术 app开发技术 图像处理及模式识...

yyuuzhu
07/20
0
0
Pyinsane 1.3.6 发布,Python 扫描仪操作

Pyinsane 1.3.6 修复了对 Python 3 支持的 bug,同时保留 scanner.options[].value 行为的一致性。 Pyinsane 是 Sane API (使用ctypes) 和抽象层的纯 Python 实现。支持 Python 2.7 和 3.x,...

oschina
2014/05/02
709
0
(总结)python 3程序开发指南(六)面向对象程序设计

1.在python中每个内置的类、类库以及我们创建的每个类都直接或间接地从最顶层的基类----object类衍生而来。 2.我们可以通过在类中实现len、add方法来支持len()、add()函数 3.python面向对象编...

索隆
2012/04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《阿里铁军》的读书笔记和读后感范文2600字

《阿里铁军》的读书笔记和读后感范文2600字: 在中国互联网,有一个流传很广的说法是,百度强在技术,腾讯强在产品,阿里强在运营。虽然发展到今天,已经不能再用这样简单的视角来看待这三个...

原创小博客
27分钟前
1
0
怎样实际项目中运用责任链模式

1 模式概要 1.1 简介 责任链模式为请求创建一个接收者对象链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把请求传给下一个接收者,依此类推 责任链模式避...

小刀爱编程
42分钟前
2
0
【宇润日常疯测-004】JS 遍历数组如何快!快!快!

首先,我就是一后端全栈,对前端也只是会用罢了。闲的无聊来测测,不深究,只看表面,不喜勿喷! 遍历数组在写 JS 代码时候一定是经常用的,那么怎么遍历能达到最高效率呢,很多人一定没有测...

宇润
45分钟前
10
2
Linux系统如何定制History输出格式

Linux系统使用History命令来查看系统的运行记录,从而找出一些问题。但是History输出的数据中常常没有时间等信息。本文就来教大家Linux系统如何定制History输出格式。   具体方法如下 以r...

linuxprobe16
48分钟前
2
0
(一) pyhon 基础语法(数值 字符串 元组 列表 字典)

1、python的数据类型: 数值 字符串 列表 元组 字典; 数值类型包括; 整型(int) 长整型(long) 浮点型(float) 复数型 字符串; 可以通过type() 来查看是什么类型的; 注释:len()只支持 字符...

芬野de博客
48分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部