由于项目需要,需要搭建memcached集群环境,遂开始调研相关技术
网络上有不少linux下安装memcached的教程,对于我这个linux零基础的来说,想立马在linux下安装memcached,似乎还是有点阻碍。参照了不少网络教程,安装过程中总是会出错,特别是在安装magent的时候,总是会报错,而相关教程中,很少提及如何解决报错问题,经过两天的折腾,终于摸索并解决了所有的报错问题,遂整理了一套“傻瓜”式的安装过程,避免安装过程中的报错
----------------------------------------------------------------------------------------------------------------------------------------
什么是Memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
Memcached基于一个存储键/值对的HashMap,它并不提供冗余(复制其HashMap条目),当某个服务器停止运行或崩溃了,所有存放在服务器上的键/值对都将丢失。但目前Memcached的客户端和代理程序可以提供多服务器的并联方式,可以提供一定的处理能力。
Memcached与其他分布式缓存的区别
Memcached与其它常用的分布式缓存(例如EhCache、OSCache、JBoss Cache)最主要的区别在于Memcached采用集中式缓存方式(即一台或多台缓存服务器为所有应用系统提供缓存能力),自身不提供集群能力,不提供缓存复制功能;而其他分布式缓存系统采用分布式缓存方式,各个应用系统内部提供数据缓存的能力,多个缓存间采用组播或点对点的方式进行缓存同步。
在性能上来看,Memcached比其它分布式缓存系统低一半以上(未考虑大量数据在其它缓存系统进行复制的影响);但从管理方面来看,Memcached的缓存采用集中管理的模式,应用系统可以水平扩展,而其它分布式缓存在水平扩展的同时,必须同时调整缓存复制策略,一旦应用服务器节点大量扩展,对于缓存服务器间的数据复制将成几何数增加。
----------------------------------------------------------------------------------------------------------------------------------------
环境:CentOS release 6.3
搭建memcached集群环境,先要安装gcc
# yum -y install gcc
在root目录下创建soft_hhf目录
# cd /root/
# mkdir soft_hhf
1.编译安装libevent
# cd /root/soft_hhf/
# wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
# tar -xvf libevent-2.0.21-stable.tar.gz
# cd libevent-2.0.21-stable
# ./configure --prefix=/usr
# make&&make install
# cd ../
2.编译安装Memcached
# cd /root/soft_hhf/
# wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
# tar -xvf memcached-1.4.15.tar.gz
# cd memcached-1.4.15/
# ./configure --with-libevent=/usr
# make&&make install
# cd ../
安装完成后会把memcached放到 /usr/local/bin/memcached
3.编译安装magent-0.6到/usr/local/下(推荐安装magent-0.5稳定版本,下面有说明 日期:2013.01.04)
# cd /usr/local
# mkdir magent
# cd magent/
# wget http://memagent.googlecode.com/files/magent-0.6.tar.gz
# tar zxvf magent-0.6.tar.gz
# vi ketama.h
在开头加入
#ifndef SSIZE_MAX
# define SSIZE_MAX 32767
#endif
# vim Makefile (magent-0.6版本)
LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a 改为 LIBS = -lrt /usr/lib64/libevent.a /usr/lib64/libm.a
CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64) 改为 CFLAGS = -lrt -Wall -g -O2 -I/usr/local/include $(M64)
# vim Makefile (magent-0.5版本)
CFLAGS = -Wall -O2 -g 改为 CFLAGS = -lrt -Wall -O2 -g
# cp /usr/lib/libevent.a /usr/lib64
# ln -s /usr/lib64/libm.so /usr/lib64/libm.a
# /sbin/ldconfig
# sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
# make
# cp magent /usr/bin/magent
# cd ../
测试memcached是否安装成功:
1.启动一个memcached进程
# memcached -m 1 -u root -d -l 192.168.1.151 -p 11211
2.查看是否启动成功了
# ps aux|grep memcached
显示两行 root,则说明安装成功了,如下所示:
root 11952 0.0 0.0 331112 1104 ? Ssl 15:09 0:00 memcached -m 1 -u root -d -l 192.168.1.151 -p 11211
root 11959 0.0 0.0 103240 796 pts/1 S+ 15:09 0:00 grep memcached
测试magent是否安装成功:
1.启动一个magent进程
# magent -u root -n 51200 -l 192.168.1.151 -p 12000 -s 192.168.1.151:11211
2.查看是否启动成功了
# ps aux|grep magent
显示两行 root,则说明安装成功了,如下所示:
root 11720 0.0 0.0 10972 588 ? Ss 13:51 0:00 magent -u root -n 51200 -l 192.168.1.151 -p 12000 -s 192.168.1.151:11211 -s 192.168.1.151:11212 -b 192.168.1.151:11213
root 11974 0.0 0.0 103240 792 pts/1 R+ 15:12 0:00 grep magent
注: 之前的安装过程中,我总是只显示一行:root 11974 0.0 0.0 103240 792 pts/1 R+ 15:12 0:00 grep magent,但是执行magent命令又不报错,可是查看magent进程,老是没有,老是启动不起来,其实还是magent没有安装成功,所以这边必须要看到两行,才能说明启动成功。
好了,如果你顺利安装成功,那就恭喜你了,可以继续深入学习memached的相关知识了
对于安装过程中的报错问题,我会在下一篇文章中整理出来,供自己以后查阅
接着就是进行测试学习了,首先确保telnet服务安装了
查看telnet是否安装
查看telnet客户端是否安装:
# rpm -q telnet
若无安装,则执行:
# yum -y install telnet
查看telnet服务端是否安装:
# rpm -q telnet-server
若无安装,则执行:
# yum -y install telnet-server
注:刚测试发现magent-0.6虽是最新版本,但是还存在问题,不稳定,第二次访问magent始终会堵塞在那里,只能set一个值。测试了magent-0.5是稳定版本,没有出现只能set一个值的现象,遂推荐安装magent-0.5版本
----------------------------------------------------------------------------------------------------------------------------------------
magent是一款开源的Memcached代理服务器软件,其项目网址为:http://code.google.com/p/memagent/
magent is a simple but useful proxy program for memcached servers.
It features:
keeps connections to memcached servers
supports following memcached commands
get gets
delete
incr decr
add set replace prepend append
cas
event-driven by using libevent library
supports ketama algorithm
backup servers farm
unix domain socket
Usage:
-h this message
-u uid
-g gid
-p port, default is 11211. (0 to disable tcp support)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip and port
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is 4096
-D do not go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. default is off
-i number, max keep alive connections for one memcached server, default is 20
-v verbose
Changelog:
2010/4/14: memcached agent 0.6
add connection keepalive handler
bug fix, more robust, more debug messages
Examples:
magent -s 10.1.2.1 -s 10.1.2.2:11211 -b 10.1.2.3:14000 -v
Notes:
current magent's speed is about 80% of memcached's. finding way to speed it up(not good)
adding backup server does no harm to magent's performance. (good)
magent's cpu usage is less than memcached's and has very little memory usage. (good)
magent + memcached 集群测试
1、编译安装libevent:
2、编译安装Memcached:
3、编译安装magent:
前面的3步就跳过了,接着测试magent +memcached的强大功能
环境说明: centeros 5.4(虚拟机) IP:192.168.128.133
测试客户端:xp
先在133上面开5个memcached端口
依次执行
memcached -m 1 -u root -d -l 192.168.128.133 -p 10001
memcached -m 1 -u root -d -l 192.168.128.133 -p 10002
memcached -m 1 -u root -d -l 192.168.128.133 -p 10003
memcached -m 1 -u root -d -l 192.168.128.133 -p 10004
memcached -m 1 -u root -d -l 192.168.128.133 -p 10005
先看看是否启动监听端口成功
ps -ef | grep memcached
发现结果6行,最后一行是执行这个查看命令的 说明成功
接着启动magent 设置启动参数 -u当然是启动账号 -n是最大连接数,-l是magent监听的IP -p是magent监听的端口
后面的格式依次是 -s IP:端口 代表是主服务器 然后指定IP:端口的格式
-b IP:端口的意思是 备用服务器,
这里我设置了10001,10002,10003 为主Memcached服务器
10004,10005 为memcached备份服务器
magent -u root -n 51200 -l 192.168.128.133 -p 12000 -s 192.168.128.133:10001 -s 192.168.128.133:10002 -s 192.168.128.133:10003 -b 192.168.128.133:10004 -b 192.168.128.133:10005
执行命令后 可以先查看是否启动成功
ps -ef | grep magent
出现2行 OK,继续
在XP客户端上测试
直接连接magent 端口 12000
telnet 192.168.128.133 12000
执行stats
说明magent 里面已经负载了3个memcached 端口
接着我们继续set
set key1 0 0 1
1
STORED
set key2 0 0 1
2
STORED
set key3 0 0 1
3
STORED
好了 依次设置了3个key ,这里说明下参数 <command name> <key> <flags> <exptime> <bytes>\r\n
详细的解释大家请看:http://blog.zol.com.cn/737/article_736087.html
既然设置了3个key,我们来读取看
执行命令get key1 get key2 get key3
依次返回了
到此,一个缓存写入已经存取的过程就完成了,但是我们要了解其中的过程呀,哈哈
然后我们直接登陆memcached的端口get数据看 它是怎么样保存的
先telnet 192.168.128.133 10001
执行stats
STAT pid 7496
STAT uptime 894
STAT time 1319202978
STAT version 1.2.6
STAT pointer_size 32
STAT rusage_user 0.000000
STAT rusage_system 0.001999
STAT curr_items 1
STAT total_items 1
STAT bytes 54
STAT curr_connections 3
STAT total_connections 4
STAT connection_structures 4
STAT cmd_get 1
STAT cmd_set 1
STAT get_hits 1
STAT get_misses 0
STAT evictions 0
STAT bytes_read 36
STAT bytes_written 32
STAT limit_maxbytes 1048576
STAT threads 1\STAT threads 1\
说明10001只缓存了1个key
我们看是存的哪一个
get key1
VALUE key1 0 1
1
END
OK存的key1
再telnet 192.168.128.133 10002
直接
get key1
END
get key2
VALUE key2 0 1
2
END
get key3
END
get key4
END
get key5
END
说明10002上缓存的key2啊,
这样不难看出10003上应该是缓存的key3了
试试
telnet 192.168.128.133 10003
然后
get key1
END
get key2
END
get key3
VALUE key3 0 1
3
END
get key4
END
get key5
END
到此 知道了magent是根据自己的算法 把要缓存的内容依次分发到后端的memcached的,至于具体的算法就不知道了,我个人认为应该是依次分发的吧,当然此memcached存活的前提下,
知道了主服务器是分发负载的,不知道备用服务器是不是这样,
进telnet 192.168.128.133 10004
依次
get key1
END
get key2
VALUE key2 0 1
2
END
get key3
END
get key4
END
get key5
END
发现 备用服务10004 并没有全部缓存3个key,就是之前的key1 key2 key3
再进 telnet 192.168.128.133 10005
get key1
VALUE key1 0 1
1
END
get key2
END
get key3
VALUE key3 0 1
3
END
get key4
END
get key5
END
看来备用服务器也是实现了负载啊,哈哈,估计算法还是跟主服务器的一样吧,
然后我把主服务器的10001 10002 10003的进程全部kill了
root 7496 1 0 21:01 ? 00:00:00 memcached -m 1 -u root -d -l 192.168.128.133 -p 10001
root 7498 1 0 21:01 ? 00:00:00 memcached -m 1 -u root -d -l 192.168.128.133 -p 10002
root 7500 1 0 21:01 ? 00:00:00 memcached -m 1 -u root -d -l 192.168.128.133 -p 10003
kill 7496 7498 7500
再在magent的端口上get key1
VALUE key1 0 1
1
END
get key2
VALUE key2 0 1
2
END
get key3
VALUE key3 0 1
3
END
并不影响取值。
不过如果备用服务器也死了的话,就无力了,
到此测试结束咯