我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Consistent hashing i

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Consistent hashing i

I have implemented consistent hashing in Python. The module is called hash_ring and you can get it right away. This post will explain the motivation behind the project and details. I think other languages such as Ruby can reuse my code since it's fairly simple :-)

To install the project, simply do:

sudo easy_install  hash_ring

Example of usage when mapping keys to memcached servers:

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')


The motivation behind hash_ring

Consistent hashing is really neat and can be used anywhere where you have a list of servers and you need to map some keys (objects) to these servers. An example is memcached or a distributed system.

A problem when you use memcached clients is that you map keys to servers in following way:

server=serverlist[hash(key)%len(serverlist)]

The major problem with this approach is that you'll invalidate all your caches when you add or remove memcache servers to the list - and this invalidation can be very expensive if you rely on caching.

This problem was solved 10 years ago by David Karger et al and they have published following articles that explain the idea of consistent caching in greater details:

  • Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web

  • Web Caching with Consistent Hashing

Another motivation is that I am currently looking into building a distributed hash map - and consistent hashing is essential in such a system. Here are a few widely used systems that use consistent hashing:

  • Amazon Dynamo

  • BitTorrent

How consistent hashing works

Consistent hashing is fairly simple (and genius way of distributing keys). It can be best explained by the idea that you have a ring that goes from 0 to some big number. Given a node A, you find a placement for A on the ring by running hash_function(A), the hash_function should generally mix the values well - good candidates for the hash function are MD5 or SHA1. Given a (key, value) pair you find the key's placement on the ring by running hash_function(key). A node holds all the keys that have a value lower than itself, but greater than the preceding node.

Tom White has written a great blog post about consistent hashing, take a look at it, it explains the idea in much greater detail.

Python implementation

I think my Python implementation is beatiful so I will share the full implementation. The code speaks for itself or something:

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)


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Consistent hashing i

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Consistent hashing i

I have implemented consistent hashing in Python. The module is called hash_ring and you can get it right away. This post
2023-01-31

如何实现Consistent Hashing算法

这篇文章给大家分享的是有关如何实现Consistent Hashing算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robi
2023-06-17

java中i++与++i的区别

i++是先赋值,再运算,++i是先运算,再赋值。实例如下:package com.test; public class TestAdd { public st
java中i++与++i的区别
2017-03-13

c++中i++和++i的区别

c++ 中 i++ 和 ++i 的区别在于读取和递增变量值的顺序:i++:先读取 i 的原始值,再递增其值。++i:先递增 i 的值,再读取递增后的值。C++中i++和++i的区别在C++编程语言中,i++和++i都是后缀递增运算符,用于
c++中i++和++i的区别
2024-05-01

c++中++i和i++的区别

在 c++ 中,递增运算符 ++i 和 i++ 的区别在于执行顺序:++i 先递增再计算表达式,而 i++ 先计算表达式再递增。因此,需要立即使用递增后的值时使用 ++i,需要先使用原始值再递增时使用 i++。C++ 中 ++i 和 i++
c++中++i和i++的区别
2024-04-26

c++中的i++和++i区别

c++ 中的 i++ 和 ++i 运算符用于增加变量 i 的值,主要区别在于运算符的位置:后缀增量运算符 (i++) 先操作 i 值,然后返回原始值;前缀增量运算符 (++i) 先增量 i 值,然后返回增量值。C++ 中的 i++ 和 ++
c++中的i++和++i区别
2024-05-12

详解Python中表达式i += x与i = i + x是否等价

前言 最近看到一个题目,看似很简单,其实里面有很深的意义,题目是Python 表达式 i += x 与 i = i + x 等价吗?如果你的回答是yes,那么恭喜你正确了50%,为什么说只对了一半呢? 按照我们的一般理解它们俩是等价的,整数
2022-06-04

c语言中++i与i++的区别

c 语言中,单目递增运算符 ++i 与 i++ 的区别在于执行递增操作的顺序:++i(前置递增):先将变量递增 1,再返回结果。i++(后置递增):先返回变量当前值,再将变量递增 1。C 语言中 ++i 与 i++ 的区别在 C 语言中,
c语言中++i与i++的区别
2024-05-02

python2.7 MySQLdb i

CREATE TABLE `a` (  `id` int(15) NOT NULL AUTO_INCREMENT,  `ip` varchar(20) NOT NULL,  `apply` varchar(20) NOT NULL,  PR
2023-01-31

Python:expected an i

IndentationError:expected an indented block错误解决这个错误的意思是缺少缩进注意提示你的代码内行,可能缩进出现问题。解决方法:在该缩进的地方加Tab或者空格(但不能混用)
2023-01-31

在c语言中i++和++i的区别

c语言中 i++ 和 ++i 都为自增运算符,执行顺序不同:i++ 先读取 i 值再加 1;++i 先加 1 再读取 i 值。C语言中 i++ 和 ++i 的区别直接回答:C语言中,i++ 和 ++i 都是自增运算符,但执行顺序不同。详
在c语言中i++和++i的区别
2024-05-02

C语言i++和++i示例代码分析

这篇文章主要讲解了“C语言i++和++i示例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言i++和++i示例代码分析”吧!一看就懂的i++和++i详解前言我相信很多朋友可能之前
2023-07-05

c语言中i和i有什么区别

c 语言中的 i 和 i 是大小写不同的标识符,分别代表变量名或常量名。 i 通常用于整型变量,i 通常用于表示数字 1 的常量,但用法不限于此。C 语言中 i 和 I 的区别在 C 语言中,i 和 I 是两个不同的标识符,用于代表变量名
c语言中i和i有什么区别
2024-05-10

c语言中++i和i++有什么区别

c语言中,++i和i++都是递增运算符,但区别在于:++i是前缀运算符,先递增再取值;i++是后缀运算符,先取值再递增;++i返回递增后的值;i++返回递增前后的值。C 语言中 ++i 和 i++ 的区别在 C 语言中,++i 和 i++
c语言中++i和i++有什么区别
2024-04-27

java中的表达式i++和++i的区别

区别:i++先赋值再自增;++i先自增再赋值。相关视频教程推荐:java视频教程例如: int i=0; System.out.println(i++); System.out.println(i++);第一个打印出0
java中的表达式i++和++i的区别
2017-08-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录