当前位置:  编程技术>综合
本页文章导读:
    ▪吐槽memcached proxy 之memagent      前言: 本人在网络上并未找到magent的实际应用的例子,都是一些测试,本人想通过java调用代理magent来解决单点故障的问题,但是没有相关的文档API介绍。其实本人在学习memcached与magent之后,.........
    ▪Plugin & Hook 设计与实现        插件系统应该具备一下功能:插件探测插件注册插件调用插件注销   <?php final class Plugin{ private $plugins = null; private $directory = 'plugins'; private $path = null; public function __construct(){ $thi.........
    ▪Hoj 3132 CHI-HUO Little P      题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=3132 本题学习计算几何基础:叉积 我们怎么去判断一个点在一条线段的左侧还是右侧呢? 这就要用到向量叉积。叉积的一个非常重要的性质是通过.........

[1]吐槽memcached proxy 之memagent
    来源:    发布时间: 2013-11-07

前言:

本人在网络上并未找到magent的实际应用的例子,都是一些测试,本人想通过java调用代理magent来解决单点故障的问题,但是没有相关的文档API介绍。其实本人在学习memcached与magent之后,发现网络上,很多人并没有把magent理解对,并不知道它是什么一个角色,只知道是个memcached代理,然后就互相抄袭拷贝对方的文章,有的压根都没有自己亲手测试过。就算自己真正动手测试过magent的,但是并没有把它运用到实际的项目中,起码在本人看来,暂时java还没法调用magent,没有相关的客户端API。

其实对于magent,大家可以把它理解成是memcached客户端的一个扩展,它同样有java client、spymemcached、xmemcached它们的功能,支持ketama一致性hash算法,多了一个memcached备份功能而已。只是暂时我们只可以用telnet进入magent启动的进程服务set、get值的,并没有方法来直接通过代码调用magent服务set、get值,这也是我为什么认为magent没有实际应用的原因。就拿java来说,在实际应用中,我们是通过memcached客户端,来实现memcached的功能。而magent服务无法用java程序来调。

 

很多人都理解成了,我只要在memcached服务器上配置好magent,客户端还是采用如memcached-client-for-java来调用,当set、get值的时候,magent会自动分配并自动把值保存到备份服务器上,其实错了,既然你还是采用的memcached-client-for-java,那么就是运用的memcached-client-for-java里面的一致性hash算法了,而不是采用的magent里面的一致性hash算法了。这样做,其实还是撇开了magent。

 

这也是:http://www.oschina.net/question/858822_77565 中提出:

但是测试结果告诉,当A或者B,或者AB都当掉之后,取值为null。也就是说,magent代理服务并没有将值set到备份服务上。

的答案

 

就如一个公司的创始人(客户端)一开始有很多任务(key value)要分配(set、get)给各员工(memcached服务器)做,后来请来了一个CEO(magent),想让他来代理分配 (set、get) 工作,解决员工离职(单点故障)问题。所以正常情况下,应该是,创始人(客户端)把所有的任务(key value)直接交给CEO(magent)就行了,而不是创始人(客户端)还亲自再分配工作给员工(memcached服务器),应该直接让CEO(magent)自己去分配工作,解决员工离职(单点故障)。而现在的问题是 创始人(客户端)无法联系上(调用) CEO(magent)。

 

虽然感觉magent在实际项目中并无法应用,不过下面,我还是会附上magent的测试例子。其实个人觉得,在解决单点故障的问题上,可以自己采用本地备份的方法解决

 

以上纯属个人的理解,技术有限,如有错误,还望大家指出纠正,互相学习

 

-------------------------------------------------------------------------------------------------------------------------------------

memcached不提供集群功能,因为集群的要素是负载均衡和单点恢复;
memcached在server端之间是不会进行通讯的,目前比较流行的有下面第几种替代的解决方案,虽不是很完美,但是能满足一些基本需求。

 

1、通过客户端进行hash算法 存到不同的mamcached server上
  该方法是在客户端存值之前先对key进行hash,把算出的hash对应的不同的memcached server上,这样保证了系统中的数据是存放到不同的mamcached server上,分散了在单台机器上的风险,提高了性能,缺点是单一台机器down后,它上面的数据将会丢失,没法恢复,不能动态增加机器,动态增加机器后,本地key对应server会发生改变,以前的老数据将不能取到,只能系统全部重启
 当前的memcached java client就提供了该功能,代码如下
  String[] serverlist = {"10.10.9.116:11211","10.10.9.116:11212"}; //定义了两台cache机器
  SockIOPool pool = SockIOPool.getInstance();
  pool.setServers(serverlist);

  Integer weights[]=new Integer{1,3};//可以根据每台机器的性能设置不同的权重

  pool.setWeights(weights);
  pool.setInitConn(initConn);
  pool.setMinConn(minConn);
  pool.setMaxConn(maxConn);
  pool.setMaintSleep(mainSleep);
  pool.setNagle(false);
  pool.setFailover( true );
  pool.initialize();
  instance = this;

2、现在通用的使用一致hash算法 ,可以最大限度避免第一条中的缺点,可以动态的增加或减少机器而对现有的其他机器上的数据保持不变,只会影响小部分的数据的存取。
目前 java client、spymemcached、xmemcached都支持一致hash,同时还采用了虚拟节点的一致性hash算法,使memcached尽量的负载均衡,可以参考:http://blog.csdn.net/fdipzone/article/details/7170045
下面是memcached java client的一段代码,需要设置的几个关键属性:
  pool.setNagle(true);//这是开启一个nagle 算法。改算法避免网络中充塞小封包,提高网络的利用率 ;
  pool.setHashingAlg(SockIOPool.CONSISTENT_HASH);//设置为一致性hash算法,在memcached集群时使用
  pool.setFailover( true ); //集群用  设置池的故障转移的标志  当一个memcached服务器失效的时候客户端默认会   failover另一个服务去.如果失效的服务器恢复运行,客户端会返回到原来连接的服务器.一般不要使用该功能
  pool.setAliveCheck(true);//表示在使用Socket以前是否先检查Socket状态

3、使用memagent

上面1、2都是针对客户端在访问时候进行key的hash算法,而3的方法是基于在memcached服务端安装代理进行分发,它可以进行数据的备份,当某台机器down后会自动从备份机器取对应的数据有如下特点:

     A、和每个memcache server保持多个长连接,效果是减少memcache server保持的连接数量及创建销毁连的开销。不过,memcache本身就支持大并发连接,这个功能也就没什么特别的说道。

     B、支持memcache的binary协议命令,实现请求的转发。

     C、和memcache一样,基于libevent的事件驱动来处理IO。

     D、支持ketama 的一致性hash算法。

     E、支持memcache backup集群,当memcache集群有机器挂了,memagent会将get请求转向memcache backup集群。这个功能对于cache的稳定性要求高的场景下会有用武之地。

magent是一款开源的Memcached代理服务器软件,其项目网址为:
http://code.google.com/p/memagent/


优点:系统自动备份,当一台机器down后自动切换到备份机器

 

------------------------------------------------------------------------------------------------------------------------------------

测试环境:
四台机器:192.168.1.105、192.168.1.151、192.168.1.152、192.168.1.153
192.168.1.105为主机,151、152、153为在105上安装的虚拟机
四台机器上均安装了memcached与magent

1.151、152、153三台机器上,分别启动两个memcached进程,端口均为11211、11212
2.现以105机器为代理机器和备份机器,即在105的机器上启动一个备份的memcached服务,端口为11213,同时再启动一个magent代理进程服务,端口为10000,做主magent服务。
3.另外在151机器上再启动一个magent服务,作为备份的magent服务,万一105机器宕机,则可以启动备份的magent服务,实际配属配置需根据实际应用环境来定,我这边只是测试一下该集群的工作机制与逻辑。


在151机器上启动两个memcached进程:
memcached -m 1 -u root -d -l 192.168.1.151 -p 11211
memcached -m 1 -u root -d -l 192.168.1.151 -p 11212
在152机器上启动两个memcached进程:
memcached -m 1 -u root -d -l 192.168.1.152 -p 11211
memcached -m 1 -u root -d -l 192.168.1.152 -p 11212
在153机器上启动两个memcached进程:
memcached -m 1 -u root -d -l 192.168.1.153 -p 11211
memcached -m 1 -u root -d -l 192.168.1.153 -p 11212
在105机器上启动一个memcached进程:备份用
memcached -m 1 -u root -d -l 192.168.1.105 -p 11213
在105机器上启动一个magent进程:
magent -u root -n 51200 -l 192.168.1.105 -p 10000 -s 192.168.1.151:11211 -s 192.168.1.151:11212 -s 192.168.1.152:11211 -s 192.168.1.152:11212 -s 192.168.1.153:11211 -s 192.168.1.153:11212 -b 192.168.1.105:11213
在151机器上启动一个magent进程:备份用
magent -u root -n 51200 -l 192.168.1.151 -p 10000 -s 192.168.1.151:11211 -s 192.168.1.151:11212 -s 192.168.1.152:11211 -s 192.168.1.152:11212 -s 192.168.1.153:11211 -s 192.168.1.153:11212 -b 192.168.1.105:11213

在105机器上:
[root@localhost ~]# memcached -m 1 -u root -d -l 192.168.1.105 -p 11213
[root@localhost ~]# magent -u root -n 51200 -l 192.168.1.105 -p 10000 -s 192.168.1.151:11211 -s 192.168.1.151:11212 -s 192.168.1.152:11211 -s 192.168.1.152:11212 -s 192.168.1.153:11211 -

    
[2]Plugin & Hook 设计与实现
    来源:    发布时间: 2013-11-07

 


插件系统应该具备一下功能:

插件探测

插件注册

插件调用

插件注销

 

		
<?php
final class Plugin{
	private $plugins 	= null;
	private $directory 	= 'plugins';
	private $path		= null;
	public function __construct(){
		$this->path = $this->directory.'/';
	}
	public function autoload(){
		$interfaces = scandir($this->directory);
		unset($interfaces[0]);
		unset($interfaces[1]);
		foreach($interfaces as $interface)
		{
			//load all of the plugins
			$file =  $this->path . $interface;
			if (@file_exists($file))
			{
				include_once($file);
				$class =  basename($interface, ".php");
				if (class_exists($class))
				{
					$this->$class = new $class($this);
					$vars = get_class_vars($class);
					$entity['name'] 			= $vars['name'];
					$entity['description'] 	= $vars['description'];
					$entity['author'] 		= $vars['author'];
					$entity['class'] 		= $class;
					$entity['methods'] 		= get_class_methods($class);

					$this->plugins[$class] = $entity;
				}
			}
		}

	}
	public function load($plugin){
		$file = $this->path . $plugin . '.php';
		if (@file_exists($file))
		{
			include_once($file);
			$class = $plugin;
			if (class_exists($class))
			{
				$this->$class = new $class($this);
				$vars = get_class_vars($class);
				$entity['name'] 			= $vars['name'];
				$entity['description'] 	= $vars['description'];
				$entity['author'] 		= $vars['author'];
				$entity['class'] 		= $class;
				$entity['methods'] 		= get_class_methods($class);

				$this->plugins[$class] = $entity;
			}
		}
	}
	public function show(){
		print_r($this->plugins);
	}
}
		
		
6.2. 接口定义
		
<?php
interface iPlugin
{
	public function test();
}
		
		
6.3. 插件
		
<?php
final class demo implements iPlugin{
	public static $author 		= 'Neo Chen<openunix@163.com>';
	public static $name = 'Demo';
	public static $description = 'Demo Simple';
	public function __construct(){

	}
	public function test(){
		echo 'Hello world!!!';
	}
}
		
		
6.4. 测试
		
<?php
function __autoload($class_name) {
    require_once('library/'.$class_name . '.php');
}

//include_once('library/Plugin.php');
$plugin = new Plugin();
echo '=============================';
$plugin->load('demo');
$plugin->demo->test();
echo '=============================';
$plugin->autoload();
$plugin->show();
		


已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—




    
[3]Hoj 3132 CHI-HUO Little P
    来源: 互联网  发布时间: 2013-11-07

题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=3132

本题学习计算几何基础:叉积

我们怎么去判断一个点在一条线段的左侧还是右侧呢?

这就要用到向量叉积。叉积的一个非常重要的性质是通过它的符号判断两向量相互之间的顺逆时针关系:设向量P=(x1,y1),Q=(x2,y2)
如果P*Q>0则P在Q的顺时针方向;即:x2*y1 - x1*y2>0
如果P*Q=0则P与Q共线,可能同向,与可能反向;即:x2*y1 - x1*y2=0
如果P*Q<0则P在Q的逆时针方向。即:x2*y1 - x1*y2<0

如何已知两个点坐标,求其向量是简单的

另外利用二分法实现查找:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

#define maxn 100002

typedef struct
{
    int x1;
    int y1;
    int x2;
    int y2;
} NArray;

NArray nArray[maxn];

int numArray[maxn];
int x,y,n,m;

bool cmp(int a,int b)
{
    return a>b;
}
bool cmp1(NArray a,NArray b)
{
    return a.x1<b.x1;
}
//true代表右边,false代表左边
bool judge(int e,int px,int py)
{
    return (long long)(px - nArray[e].x2) * (long long)(nArray[e].y1 - nArray[e].y2)
    > (long long)(nArray[e].x1 - nArray[e].x2) * (long long)(py - nArray[e].y2);
}
//二分
void add(int px,int py)
{
    if(judge(n,px,py))
    {
        numArray[n+1]++;
        return;
    }
    int a = 1;
    int b = n;
    while(a<b)
    {
        int mid = (a+b)/2;
        if(!judge(mid,px,py))
        {
            b = mid;
        }
        else
        {
            a = mid + 1;
        }
    }
    numArray[a]++;

}


int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif

    int px,py;
    while(scanf("%d %d %d %d",&x,&y,&n,&m)!=EOF)
    {
        memset(numArray,0,sizeof(numArray));

        for(int i=1; i<=n; i++)
        {
            scanf("%d %d",&nArray[i].x1,&nArray[i].x2);
            nArray[i].y1 = y;
            nArray[i].y2 = 0;
        }
        sort(nArray+1,nArray+n+1,cmp1);
        for(int i=1; i<=m; i++)
        {
            scanf("%d %d",&px,&py);
            add(px,py);
        }

        sort(numArray+1,numArray+n+2,cmp);
        for(int j=1; j<=4; j++)
        {
            printf("%d ",numArray[j]);
        }
        printf("%d\n",numArray[5]);

    }
    return 0;
}


作者:niuox 发表于2013-1-7 10:16:48 原文链接
阅读:0 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源 iis7站长之家
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3