10 Memcached 一致性哈希分布式算法原理与实现[PHP实现]

 1 <?php
 2
 3 header("Content-type:text/html;charset=utf-8");
 4
 5 interface  hash{
 6
 7     public function _hash($str);
 8 }
 9 interface distribution{
10
11     public function lookup($key);
12 }
13 /****
14 一致性哈希分布式算法原理与实现[PHP实现]
15 **/
16 class Consistent  implements hash,distribution{
17     #存放实际节点
18     protected $_nodes=array();
19     #定义虚拟节点的个数
20     protected $mul=64;
21     #定义一个位置数组 记录节点所在位置
22     protected $_position=array();
23     #算出节点
24     public function _hash($str){
25         return sprintf(‘%u‘,crc32($str));//把字符串转成32位符号的整数
26     }
27     #核心功能
28     public function lookup($key){
29         #算出当前节点
30         $point=$this->_hash($key);
31         $node=current($this->_position);//先取圆环上最小的一个节点
32         #循环所以节点
33         foreach($this->_nodes as $k=>$v){
34             #找到当前节点所在在的节点数,如果没找到说明大于所以节点 既在最小的节点上
35             if($point<=$k){
36                $node=$v;
37                break;
38             }
39         }
40         return $node;
41     }
42     #增加一个节点
43     public function addNode($node){
44         #存储到数组中去  arrar([key=>val])
45         //$this->_nodes[$this->_hash($node)]=$node;
46         for ($i=0; $i < $this->mul; $i++) {
47             $this->_position[$this->_hash($node.‘-‘.$i)]=$node;
48         }
49         $this->_sortNode();
50
51     }
52     #删除一个节点
53     public function delNode($node){
54         foreach ($this->_position as $k => $v) {
55             if($v==$node){
56                 unset($this->_position[$k]);
57             }
58         }
59     }
60     #排序
61     protected function _sortNode(){
62         #SORT_REGULAR 根据key的大小进行排序
63         ksort($this->_position,SORT_REGULAR);
64     }
65     #打印出所有的虚拟节点
66     public function getNodes(){
67         var_dump($this->_position);
68     }
69 }
70 $con=new Consistent();
71 $con->addNode(‘a‘);
72 $con->addNode(‘b‘);
73 $con->addNode(‘c‘);
74
75
76 echo ‘当前所以服务器如下:<br/>‘;
77  $con->getNodes();
78 echo ‘<br/>当前的建计算的hsas落点是‘.$con->_hash(‘name‘).‘<br/>‘;
79 echo  ‘name‘.‘在‘.$con->lookup(‘name‘).‘节点上‘;
时间: 2024-11-17 23:48:14

10 Memcached 一致性哈希分布式算法原理与实现[PHP实现]的相关文章

一致性哈希算法原理

一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用. 但现在一致性hash算法在分布式系统中也得到了广泛应用,研究过memcached缓存数据库的人都知道,memcached服务器端本身不提供分布式cache的一致性,而是由客户端来提供,具体在计算一致性has

memcached 一致性哈希算法

本文转载自:http://blog.csdn.net/kongqz/article/details/6695417 一.概述 1.我们的memcache客户端使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的key进行hash计算,分配到不同节点存储.一致性hash算法是对我们要存储数据的服务器进行hash计算,进而确认每个key的存储位置.  2.常规hash算法的应用以及其弊端 最常规的方式莫过于hash取模的方式.比如集群中可用

Java-No.09 一致性哈希算法原理及实现

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

一致性哈希算法原理及其在分布式系统中的应用

本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题:接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题. 分布式缓存问题 假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Memcached作为缓存机制.现在我们一共有三台机器可以作为Memca

一致性哈希算法原理设计

原文出处: 知致智之   欢迎分享原创到伯乐头条 一.前言 一致性哈希(Consistent Hashing),最早由MIT的Karger于1997年提出,主要用于解决易变的分布式Web系统中,由于宕机和扩容导致的服务震荡.现在这个算法思路被大量应用,并且在实践中得到了很大的发展. 二.算法设计 1.问题来源 一个由6台服务器组成的服务,每台Server负责存储1/6的数据,当Server1出现宕机之后,服务重新恢复可用时的场景. 如下表格可以很清楚的看到,当Server1宕机时,Hash1的服

一致性哈希算法在分布缓存中的应用

一.简介 关于一致性哈希算法介绍有许多类似文章,需要把一些理论转为为自己的知识,所以有了这篇文章,本文部分实现也参照了原有的一些方法. 该算法在分布缓存的主机选择中很常用,详见 http://en.wikipedia.org/wiki/Consistent_hashing . 二.算法诞生缘由 现在许多大型系统都离不开缓存(K/V)(由于高并发等因素照成的数据库压力(或磁盘IO等)超负荷,需要缓存缓解压力),为了获得良好的水平扩展性, 缓存主机互相不通信(如Mencached),通过客户端计算K

用于KV集群的一致性哈希Consistent Hashing机制

KV集群的请求分发 假定N为后台服务节点数,当前台携带关键字key发起请求时,我们通常将key进行hash后采用模运算 hash(key)%N 来将请求分发到不同的节点上, 后台节点的增删会引起几乎所有key的重新映射, 这样会造成大量的数据迁移,如果数据量大的话会导致服务不可用. 一致性哈希机制 我倾向于称之为一致性哈希机制而不是算法, 因为这其实和算法没太大关系. 设计这种机制的目的是当节点增减时尽量减小重新映射的key的数量, 尽量将key还映射到原来的节点上. 而对于一致性哈希机制, 如

深入一致性哈希(Consistent Hashing)算法原理,并附100行代码实现

本文为实现分布式任务调度系统中用到的一些关键技术点分享——Consistent Hashing算法原理和Java实现,以及效果测试. 背景介绍 一致性Hashing在分布式系统中经常会被用到, 用于尽可能地降低节点变动带来的数据迁移开销.Consistent Hashing算法在1997年就在论文Consistenthashing and random trees中被提出. 先来简单理解下Hash是解决什么问题.假设一个分布式任务调度系统,执行任务的节点有n台机器,现有m个job在这n台机器上运

Memcached 笔记与总结(5)Memcached 的普通哈希分布和一致性哈希分布

普通 Hash 分布算法的 PHP 实现 首先假设有 2 台服务器:127.0.0.1:11211 和 192.168.186.129:11211 当存储的 key 经过对 2 (2 台服务器)取模运算得出该 key 应该保存到的服务器: <?php $server = array( array('host' => '127.0.0.1', 'port' => 11211), array('host' => '192.168.186.129', 'port' => 11211