-
Memcache集群代理服务magent + memcached for java应用0
如题:
在3个虚拟集中搭建好memcache 缓存分布式集群,利用magent代理memcache
服务器分别为A,B,C ip 分别为:192.168.100.3,192.168.100.4,192.168.100.5.
A,B作为缓存服务端口为11211,11212。
C作为mc备份服务和magent服务器。备份m服务端口为11213,magent服务端口:12000
正常情况应该是当A,B,C都启动mc服务,启动命令分别为:
memcached -d -u root -m 512 192.168.100.3 -p 11211 -c
512 -P /temp/memcached.pid
memcached -d -u root -m 512 192.168.100.4 -p 11212 -c
512 -P /temp/memcached.pid
memcached -d -u root -m 512 192.168.100.5 -p 11213 -c
512 -P /temp/memcached.pid
在C上启动magent服务,
启动命令为:
magent -u root 51200 -l 192.168.100.5 -p 12000 -s 192.168.100.3:11211 -s 192.168.100.4:11212 -b 192.168.100.5:11213
接下来用memcached for java 连接,存取值,出现一个问题。
下面是java client代码
package com.memcache.client;
/**
* Memcache 分布式缓存服务器应用
* @author gouwei
* 2012/10/30
*/
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class MemcacheClient {
//创建管理客户端和服务器通讯连接池 实例
private static SockIOPool Pool = null;
private static MemCachedClient memCacheClient = null;
//配置缓存服务器
public static void getMemcacheConnection(){
memCacheClient = new MemCachedClient();
SockIOPool scokIOPool = Pool.getInstance();
// 设置缓存服务器列表
String[] servers = {
"192.168.100.3:11211",
"192.168.100.4:11212"
//"192.168.100.5:11213"
};
//设置cache服务器权重
Integer[] weigths = {2,3};
//获取连接
/**
* 每个服务器最少可用连接数 默认:5
* 每个服务器最大可用连接数 默认:32
*/
//相连接池设置服务器列表和权重
scokIOPool.setServers(servers);
scokIOPool.setWeights(weigths);
/* 设置是否使用Nagle算法,因为我们的通讯数据量通常都比较大
(相对TCP控制数据)而且要求响应及时,因此该值需要设置为false(默认是true)
*/
scokIOPool.setNagle(false);
//开始时每个cache服务器的可用连接数
scokIOPool.setInitConn(5);
//设置socket读取等待超时时间 默认为30000ms
scokIOPool.setSocketTO(3000);
//设置scoket连接等待超时时间 默认为3000ms
scokIOPool.setSocketConnectTO(1000);
/**
* • 设置hash算法
• alg=0 使用String.hashCode()获得hash code,该方法依赖JDK,可能和其他客户端不兼容,建议不使用
• alg=1 使用original 兼容hash算法,兼容其他客户端
• alg=2 使用CRC32兼容hash算法,兼容其他客户端,性能优于original算法
• alg=3 使用MD5 hash算法
• 采用前三种hash算法的时候,查找cache服务器使用余数方法。采用最后一种hash算法查找cache服务时使用consistent方法。
*/
scokIOPool.setHashingAlg(3);
//启动pool
scokIOPool.initialize();
}
}
个人理解认为理论上应该是:
缓存服务器列表应该为A,B,然后当数据set进AB服务之后,magent服务还会将值set到C的MC备份服务器。然后当A或者B down掉之后,magent代理服务会将key hash到C的MC备份服务上取值才对。
String[] servers = {
"192.168.100.3:11211",
"192.168.100.4:11212"
};
但是测试结果告诉,当A或者B,或者AB都当掉之后,取值为null。也就是说,magent代理服务并没有将值set到备份服务上。
还有一个问题想请教各位:
在memcached for java api上有这么一段话:
· public void setServers( String[] servers )
· 设置连接池可用的cache服务器列表,server的构成形式是IP:PORT(如:127.0.0.1:11211)
· public void setWeights( Integer[] weights )
· 设置连接池可用cache服务器的权重,和server数组的位置一一对应
· 其实现方法是通过根据每个权重在连接池的bucket中放置同样数目的server(如下代码所示),因此所有权重的最大公约数应该是1,不然会引起bucket资源的浪费。
for ( int i = 0; i < servers.length; i+/+ ) { if ( this.weights /!= null && this.weights.length > i ) { for ( int k = 0; k < this.weights[i].intValue(); k+/+ ) { this.buckets.add( servers[i] ); if ( log.isDebugEnabled() ) log.debug( "++++ added " + servers[i] + " to server bucket" ); } }
我有点不明白当MC服务器个数和权重值有什么关系,最大公约数为1是什么意思。
//设置cache服务器权重
Integer[] weigths = {2,3};
看代码无非就是weigths.lengt>=servers.lengt,但是跟weights数组中的值(2,3)有什么关系呢?
谢谢大家了!
2012年11月02日 00:07
目前还没有答案
相关推荐
- 客户端库:对于Java开发,常用的客户端库是memcached client for java(也称为spymemcached),它提供方便的API接口,便于Java应用程序与Memcache服务器进行通信。 - 其他依赖:在Windows环境下,可以下载预编译...
`magent`是一个简单的memcached代理,可以用来实现简单的负载均衡。安装magent(如文件`magent-0.6.tar.gz`所示),然后配置它作为客户端与多个memcache服务器之间的中间层。 ### 8. memcached升级 在文件`...
Magent是一个开源的Memcached代理服务器软件,可以用来建立和管理缓存,能够支持高可用性的集群应用。Memcached客户端程序,推荐使用memcachedclientforjava,这是因为它提供了Java开发者常用的API,方便与Java应用...
- **定义**:一款开源的Memcached代理服务器软件,用于构建高可用性的集群应用。 - **作用**:通过代理的方式提高Memcached的稳定性和性能。 - **获取方式**:访问其项目网站 (http://code.google.com/p/memagent/) ...
【描述】中提到的 "memcache 集群插件" 暗示 magent 是一个与 Memcached 相关的扩展或中间件。Memcached 是一个高性能、分布式的内存对象缓存系统,用于减轻数据库负载,提高 Web 应用程序的性能。在 Memcached 单点...
通过 Memcached 代理软件 Magent 可以构建内存集群,如一个由 10 台 4GB 内存服务器组成的集群总共可以提供 40GB 的可用内存。 3. **MongoDB**:适合大规模数据存储,依赖操作系统虚拟内存(VM)进行内存管理。为了...
2. 分布式:两者都可以实现集群,但Memcached通常采用magent进行一主多从配置,Redis则有自己原生的集群解决方案。 3. 持久化:Redis可以将数据定期保存到磁盘,支持AOF(Append Only File)和RDB(Snapshotting)两...