0 0

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)有什么关系呢?

谢谢大家了!

目前还没有答案

相关推荐

Global site tag (gtag.js) - Google Analytics