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 ...
随机推荐
- MFC 单文档中动态添加菜单项和响应菜单事件
新建一个单文档程序 在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏 #define ID_N ...
- centos6安装bt工具transmission
centos6 install transmission 1. 安装所需的组件: yum -y install gcc gcc-c++ m4 make automake libtool gettex ...
- GrabCut--Opencv篇
最近因为工作需要,需要实现一个Grabcut函数.Opencv已经提供此函数,今天把opencv的例程拿出来跑了一下,对于简单的背景实现效果还不错. OpenCV中的GrabCut算法是依据<& ...
- sqlplus连接登录数据库时,出现 ORA-28009错误(转)
安装了oracle10g,打算用SQLPLUS 登录数据库进行操作.打开sqlplus后,可以看到要求输入用户名,口令和主机字符串.前面两个都知道,但是后一个却不明白,查了资料才知道是安装时的全局数据 ...
- 14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读
14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读 一致性读 意味着 InnoDB 使用多版本来保护查询一个数据库在当前时间点的快照. 查询看到被事务做出的修改, ...
- C++内存管理学习笔记(6)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- [C++]C++中的运行时类型检测
Date:2014-1-3 Summary: 使用C++中的运行时类型检测.(文章重点在于记录本人的使用情况,并非深层讨论RTTI) Contents:写习惯C#的我,在C++依然存在哪些.NET的惯 ...
- UVALive 5791 Candy's Candy 解题报告
比赛总结 题目 题意: 有f种口味的糖果,现在要把每颗糖果分到一些packs里面去.packs分两种: flavored pack:只有一种口味. variety pack:每种口味都有. 求满足下列 ...
- Android 实现环形进度按钮circular-progress-button
※效果 ※简单介绍 显示运行进度的button,可用于数据的提交.系统登录等.动画效果非常棒.提高用户体验. ※使用说明 Declare button inside your layout XML f ...
- POJ 2418 Hardwood Species( AVL-Tree )
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> ...