Memcached集群

来源:互联网 发布:永宏官网plc编程软件 编辑:程序博客网 时间:2024/06/03 13:09

尽管Memcached是分布式缓存服务器,但服务端并没有提供分布式功能,各服务节点之间无法实现数据的复制和备份。下面介绍Memcached的两种集群方式

1.多个Memcached实例实现集群

     由多个memcached实例组成的集群方式,可以在一定程度上缓解单点故障问题,如果一个节点出现故障,该故障节点上的数据会丢失,客户端会自动连接到其他节点,客户端从数据库读取数据并保存到新的memcached节点上。

     该集群方式的缺点是:如果系统的并发量比较大,在出现节点故障后,有可能搞垮数据库。

JAVA连接多实例Memcached的代码如下:

package com.memecached;import com.danga.MemCached.MemCachedClient;import com.danga.MemCached.SockIOPool;public class MemcachedClusters {private  static MemCachedClient memCachedClient = new MemCachedClient();// 设置与缓存服务器的连接池static {// 服务器列表和其权重String[] servers = { "192.168.74.129:11211", "192.168.74.129:11212" };Integer[] weights = { 1,2 };// 获取socke连接池的实例对象SockIOPool pool = SockIOPool.getInstance();// 设置服务器信息pool.setServers(servers);pool.setWeights(weights);// 设置初始连接数、最小和最大连接数以及最大处理时间pool.setInitConn(5);pool.setMinConn(5);pool.setMaxConn(250);pool.setMaxIdle(1000 * 60 * 60 * 6);// 设置主线程的睡眠时间pool.setMaintSleep(30);// 设置TCP的参数,连接超时等pool.setNagle(false);pool.setSocketTO(3000);pool.setSocketConnectTO(0);// 初始化连接池pool.initialize();}public static void main(String[] args) {int totalCount = 100;for (int i = 0; i < totalCount; i++) {memCachedClient.set("username"+i, "张三");}System.out.println(memCachedClient.stats());}}

2.使用magent实现Memcached集群

下载magent

http://download.csdn.net/detail/zxlxiaoyi/6846659

安装magent

[root@zookeeper_slave_01 softwares]# tar zxvf magent-0.5.tar.gz -C /soft_install/magent-0.5/[root@zookeeper_slave_01 magent-0.5]# sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile

ketama.h在开头加入

#ifndef SSIZE_MAX# define SSIZE_MAX      32767#endif

 

[root@zookeeper_slave_01 magent-0.5]# makegcc -Wall -O2 -g  -c -o magent.o magent.cgcc -Wall -O2 -g  -c -o ketama.o ketama.cgcc -Wall -O2 -g -o magent magent.o ketama.o -levent -lm –lm

启动memcached

[root@zookeeper_slave_01 bin]# ./memcached -p 11211 -d -u root -m 64 -c 1024 –vvv[root@zookeeper_slave_01 bin]# ./memcached -p 11212 -d -u root -m 512 -c 1024 –vvv

启动magent: 两master服务器形成的集群

[root@zookeeper_slave_01 magent-0.5]# ./magent -u root -n 51200 -l 192.168.74.129 -p 12000 -s 192.168.74.129:11211 -s 192.168.74.129:11212[root@zookeeper_slave_01 magent-0.5]# ps -ef|grep magentroot      2828     1  0 00:10 ?        00:00:00 ./magent -u root -n 51200 -l 192.168.74.129 -p 12000 -s 192.168.74.129:11211 -s 192.168.74.129:11212

查看magent的状态,并写入数据,telnet192.168.74.129 12000

statsmemcached agent v0.4matrix 1 -> 192.168.74.129:11211, pool size 0matrix 2 -> 192.168.74.129:11212, pool size 0ENDset key1 0 0 1aSTOREDset key2 0 0 1bSTOREDset key3 0 0 1cSTORED

查看11211 memcached,telnet 192.168.74.129 11211



查看11212 memcached,telnet192.168.74.129 11212



可以看到,在双master memcached服务器下,magent会将数据分散到各个master服务器.

关闭magent,以master/slave的方式启动magent

[root@zookeeper_slave_01 magent-0.5]# kill -9 2828[root@zookeeper_slave_01 magent-0.5]# ps -ef|grep magentroot      2997  2607  0 01:00 pts/0    00:00:00 grep magent[root@zookeeper_slave_01 magent-0.5]# ./magent -u root -n 51200 -l 192.168.74.129 -p 12000 -s 192.168.74.129:11211 -b 192.168.74.129:11212[root@zookeeper_slave_01 magent-0.5]# ps -ef|grep magentroot      2999     1  0 01:00 ?        00:00:00 ./magent -u root -n 51200 -l 192.168.74.129 -p 12000 -s 192.168.74.129:11211 -b 192.168.74.129:11212

查看magent的状态,并写入数据,telnet 192.168.74.129 12000

查看master,telnet192.168.74.129 11211

查看slave,telnet192.168.74.129 11212

可以看出,master memcached服务器11211上的数据同步到slave memcached服务器11212.

关闭master memcached服务器11211

root      2783     1  0 00:02 ?        00:00:00 ./memcached -p 11211 -d -u root -m 64 -c 1024 -vvvroot      2999     1  0 01:00 ?        00:00:00 ./magent -u root -n 51200 -l 192.168.74.129 -p 12000 -s 192.168.74.129:11211 -b 192.168.74.129:11212root      3051  3041  0 01:19 pts/3    00:00:00 grep 11211[root@zookeeper_slave_01 ~]# kill -9 2783

再查看magent的状态,并添加数据

查看slave,telnet192.168.74.129 11212

可以看出,master挂掉后,magent会启动slave作为master.


 

0 0