博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcached 分布式聚类算法
阅读量:4694 次
发布时间:2019-06-09

本文共 2456 字,大约阅读时间需要 8 分钟。

          memcached 分布式集群,该决定必须书面开发商自己。和redis 由分布式server决定。上 memcached 有两个选项用于分布式。第一个是:模运算

另一种是:一致性hash 分布式算法。以下我就这两种算法简介一下。

        一、取模算法:

        取模算法是不靠谱的算法,当有n 台server,突然一台server突然down 掉了。memcached 的命中率仅仅有1/n-1。结果是怎么来的,自己想想吧。比方有8台memchached 

server,0,1,2,3。4,5。6,7,8  这8个数字存入到memcached server,突然有一台memcached serverdown 掉了。

我们用取模法,从memcached server取值。

发现仅仅有0。1,2。3,4,5,6。56 这些数被7,8取模的值是一样的。也就是说这么写能被命中。

也就得出了结论 n/n(n-1) 个数可以被命中。相同也得出结论server集群越大,

命中率也就越低。

这中算法直接pass 掉。

并且命中率会无限趋进于0。

   二、一致性hash 分布式算法:

        介绍这样的算法。首先我引进一个概念是虚拟节点。虚拟节点也就是说在没台memcached server虚拟非常多节点。并算出每一个节点的hash 值。

存key 时,同一时候计算出key 的hash 

值,当key的hash 值,接近或等于某个节点的hash 值,就放到某个 memcached server。当某个memcached serverdown 掉后。其它server共同承担这台server的压力。

以下是我的一段代码:

_hash($key); $current_key=current($this->address_array); foreach($this->address_array as $key=>$value){ if($look_key<=$key){ $current_key=$key; break; } } return $value; } public function _address($node){ // 虚拟节点 for($i=0;$i<64;$i++){ $key=$this->_hash($node.'_'.$i); $this->address_array[$key]=$node; } $this->_sortkey(); } public function _sortkey(){ // 对hash 后的值排序 ksort($this->address_array,SORT_REGULAR); } public function delnode($node){ // down 掉了某台server $new_address=array_diff_key($this->address_array,array_flip(array_keys($this->address_array,$node))); $this->address_array=$new_address; return $new_address; } }

以下另一段模拟降低一台memcached server的代码:

 

$value){ $distribute->_address($key); } //降低一台server $distribute->delnode('B'); for($i=0;$i<10000;$i++){ $key='key'.sprintf("%04d",$i); $memca_key=$distribute->_lookup($key); $memca_party=$mem_array[$memca_key]; $memcache = memcache_connect($memca_party['ip'],$memca_party['port']); if(!$memcache->get($key)){ $memcache->add($key,'value'.$i,0,0); } $memcache->close(); }

     以下是memcached server的配置文件

   

/*   memcached 的配置文件 */ $mem_array=array(     'A'=>array('ip'=>'127.0.0.1','port'=>'11211'),	 'B'=>array('ip'=>'127.0.0.1','port'=>'11212'),	 'C'=>array('ip'=>'127.0.0.1','port'=>'11213'),	 'D'=>array('ip'=>'127.0.0.1','port'=>'11214')  );

以下是计算memcached 的命中率:

getStats(); $int_get += $statistics['cmd_get']; $int_hits += $statistics['get_hits']; } if($int_get==0){ echo $rand; return true; } $rand=$int_hits/$int_get; echo $rand;
以下是highcharts 插件统计的 memcached 命中率

			
Highcharts Example

      

转载于:https://www.cnblogs.com/zfyouxi/p/5043582.html

你可能感兴趣的文章
23 Java学习之RandomAccessFile
查看>>
P2709 小B的询问
查看>>
PHP echo 和 print 语句
查看>>
第一讲 一个简单的Qt程序分析
查看>>
Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
查看>>
poj 1979 Red and Black(dfs)
查看>>
【.Net基础03】HttpWebRequest模拟浏览器登陆
查看>>
zTree async 动态参数处理
查看>>
Oracle学习之常见错误整理
查看>>
数据库插入数据乱码问题
查看>>
altium annotate 选项设置 complete existing packages
查看>>
【模式识别与机器学习】——SVM举例
查看>>
【转】IT名企面试:微软笔试题(1)
查看>>
IO流入门-第十章-DataInputStream_DataOutputStream
查看>>
DRF的分页
查看>>
Mysql 模糊匹配(字符串str中是否包含子字符串substr)
查看>>
python:open/文件操作
查看>>
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>