memcached 分布式聚类算法
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的压力。
以下是我的一段代码:
<?php
/*
memcached 一致性hash分布式算法
*/
interface hash{
public function _hash($str); // hash 算法
} interface distribution{
public function _lookup($key);
} class contents implements hash,distribution{
public $address_array=array();
public function _hash($str){
return sprintf("%u",crc32($str));
}
public function _lookup($key){ //通过key 找到server
$look_key=$this->_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的代码:
<?php
require_once 'config.php'; //载入配置文件
require_once 'distribute.php'; //载入一致hash
$distribute=new contents(); //循环加入server
foreach($mem_array as $key=>$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 的命中率:
<?php require_once 'config.php'; //载入配置文件
$int_get=0;
$int_hits=0;
$rand=1;
foreach($mem_array as $value){
$memcache = memcache_connect($value['ip'],$value['port']);
$statistics =$memcache->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 命中率
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Highcharts Example</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<style type="text/css">
${demo.css}
</style>
<script type="text/javascript">
$(function () {
$(document).ready(function () {
Highcharts.setOptions({
global: {
useUTC: false
}
}); $('#container').highcharts({
chart: {
type: 'spline',
animation: Highcharts.svg, // don't animate in old IE
marginRight: 10,
events: {
load: function () { // set up the updating of the chart each second
var series = this.series[0];
setInterval(function () {
var x = (new Date()).getTime(), // current time
y = parseFloat($.ajax({url:'hit.php',async:false}).responseText);
series.addPoint([x, y], true, true);
}, 1000);
}
}
},
title: {
text: 'memcached 命中率'
},
xAxis: {
type: 'datetime',
tickPixelInterval: 150
},
yAxis: {
title: {
text: 'Value'
},
plotLines: [{
value: 0,
width: 1,
color: '#808080'
}]
},
tooltip: {
formatter: function () {
return '<b>' + this.series.name + '</b><br/>' +
Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
Highcharts.numberFormat(this.y, 2);
}
},
legend: {
enabled: false
},
exporting: {
enabled: false
},
series: [{
name: 'Random data',
data: (function () {
// generate an array of random data
var data = [],
time = (new Date()).getTime(),
i; for (i = -19; i <= 0; i += 1) {
data.push({
x: time + i * 1000,
y: Math.random()
});
}
return data;
}())
}]
});
});
});
</script>
</head>
<body>
<script src="js/highcharts.js"></script>
<script src="js/modules/exporting.js"></script> <div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div> </body>
</html>
memcached 分布式聚类算法的更多相关文章
- Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解
Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解 在Hadoop分布式环境下实现K-Means聚类算法的伪代码如下: 输入:参数0--存储样本数据的文本文件inpu ...
- 09 Memcached 分布式之取模算法的缺陷
一: Memcached 分布式之取模算法的缺陷(1)假设你有8台服务器,运行中突然down一台,则求余数的底数就7. 后果: key_0%8==0 ,key_0%7==0 =>hist(命中) ...
- Memcached 分布式缓存实现原理
摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...
- 缓存应用--Memcached分布式缓存简介
一. 什么是Memcached Memcached 是一个高性能的分布式内存 对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象 来减少读取数据库的次数,从而提供动态. ...
- memcached分布式实现原理
摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数, ...
- memcached分布式缓存
1.memcached分布式简介 memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能.Memcache集群主机不能够相互通信传输数据,它的“分布式”是基于客户端的程序逻辑算 ...
- 【转】memcached分布式部署
FROM : http://www.tuicool.com/articles/777nE3j memcache和memcached两者使用起来几乎一模一样. $mem = new Memcache; ...
- 让memcached分布式
memcached是应用最广的开源cache产品,它本身不提供分布式的解决方案,我猜想一方面它想尽量保持产品简单高效,另一方面cache的key-value的特性使得让memcached分布式起来比较 ...
- memcached分布式部署
memcache和memcached两者使用起来几乎一模一样. $mem = new Memcache; $mem->addServer($memcachehost, '11211'); $me ...
随机推荐
- ContentProvider简要
1.什么是ContentProvider 数据库在Android其中是私有的,当然这些数据包含文件数据和数据库数据以及一些其它类型的数据. 不能将数据库设为WORLD_READABLE,每一个数据 ...
- javascript (十四) dom
通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object M ...
- 全局忽略编译警告(设置QMAKE_CXXFLAGS )
msvc编译器从2010 sp1开始就已经支持UTF-8的源码文件了,然后到vs2012又不支持了,官方表示是BUG.到目前最新的vs2013就解决了这个问题... 但是在编译时仍然会出现4819的警 ...
- 用yum查询想安装的软件
1.使用YUM查找软件包 命令:yum search~ 2.列出所有可安装的软件包 命令:yum list 3.列出所有可更新的软件包 命令:yum list updates 4.列出所有 ...
- MyBATIS使用CRUD
MyEclipse不提供自己主动生成,这里提供mybatis文件包和开发文档 http://download.csdn.net/detail/u010026901/7489319 自己建立配置文件, ...
- js下读取input中的value值
很多人(包括我),总想像以前操作js一样,读取到input中的值:document.getElementById('').value; 结果事实证明这样读到得是null. eval(document. ...
- visio ppt axure AI svg powerdesign xmind
visio ppt axure AI svg powerdesign xmind
- HDU 4921 Map
题意: 给n个节点 他们形成了最多10条链 每条最多1000的长度 每一个节点有个val 你能够选择任何位置截断链 断点前的全部节点被你获得 通过题中计算公式得出你的val 问 通过随 ...
- 模式识别 - 处理多个演示样本研究(MIL)特点(matlab)
处理多个演示样本研究(MIL)特点(matlab) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27206325 多演示样例学习 ...
- delphi 回调函数
program Project2; {$APPTYPE CONSOLE} uses SysUtils; type //定义一个对象事件方法 TCallbackFunc = function (i: I ...