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 ...
随机推荐
- FairScheduler的任务调度机制——assignTasks
首先需要了解FairScheduler是如何在各个Pool之间分配资源,以及每个Pool如何在Job之间分配资源的.FairScheduler的分配资源发生在update()方法中,而该方法由一个线程 ...
- 与众不同 windows phone (4) - Launcher(启动器)
原文:与众不同 windows phone (4) - Launcher(启动器) [索引页][源码下载] 与众不同 windows phone (4) - Launcher(启动器) 作者:weba ...
- win7下不能收到窗口hook消息的问题
win7下由于UIPI的限制, 高权限进程无法收到底权限进程发来的消息, 因此对窗口消息hook时无法接收到消息,解决办法是在调用SetWindowsHookEx之前先调用ChangeWindowMe ...
- windows下Memcached 架设及java应用
1 Memcached 介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据 ...
- TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)
注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): 其中TWinControl对TControl有10个消息进行了覆盖(红色标记),其中有2个是WM_消息,8个是CM_消 ...
- Eclipse Tips
一.取消拼写检查 Window -> Preferences -> General -> Editors -> Text Editors -> Spelling -> ...
- AWS(0) - Amazon Web Services
Computer EC2 – Virtual Servers in the Cloud EC2 Container Service – Run and Manage Docker Containers ...
- SICP 习题 (2.6) 解题总结:丘奇计数
SICP 习题 2.6 讲的是丘奇计数,是习题2.4 和 2.5的延续. 这里大师们想提醒我们思考的是"数"究竟是什么,在计算机系统里能够怎样实现"数".准备好 ...
- Linux 之 rsyslog
Linux 之 rsyslog 系统日志转发 一.rsyslog 介绍 ryslog 是一个快速处理系统日志的程序,提供了高性能.安全功能和模块化设计.rsyslog 是syslog 的升级版,它将多 ...
- MyCAT部署及实现读写分离(转)
MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之.于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显.这篇文章主要是MyCAT的入门部署. ...