您的位置:首页 > 数据库 > Memcache

一、Linux下安装搭建Memcached集群环境

2017-02-16 21:54 656 查看
【转载自】http://blog.csdn.net/ldl22847/article/details/45559169

由于项目需要,需要搭建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:

wget http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz
tar zxvf libevent-1.4.9-stable.tar.gz

cd libevent-1.4.9-stable/

./configure --prefix=/usr

make && make install

cd ../

  2、编译安装Memcached:

wget http://danga.com/memcached/dist/memcached-1.2.6.tar.gz
tar zxvf memcached-1.2.6.tar.gz

cd memcached-1.2.6/

./configure --with-libevent=/usr

make && make install

cd ../

  3、编译安装magent:

mkdir magent

cd magent/

wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
tar zxvf magent-0.5.tar.gz

/sbin/ldconfig

sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile

make

cp magent /usr/bin/magent

cd ../

前面的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

 

并不影响取值。

  不过如果备用服务器也死了的话,就无力了,

  到此测试结束咯
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: