Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解

今天部署memcache集群,参考下文,顺利部署成功。

memcached:http://memcached.org/ 
libevent:
http://libevent.org/ 
#下载包 
cd /opt 
wget 
https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz 
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz 
#安装libevent 
tar zxvf libevent-2.0.21-stable.tar.gz 
cd libevent-2.0.21-stable 
./configure --prefix=/opt/libevent 
make 
make install 
#测试 
ls -al /opt/libevent/lib | grep libevent 
#安装memcached 
tar zxvf memcached-1.4.15.tar.gz 
cd memcached-1.4.15 
./configure --prefix=/opt/memcached --with-libevent=/opt/libevent/ 
make 
make install 
#测试 
ls -al /opt/mem* 
#启动 
/opt/memcached/bin/memcached -d -u root -m 512 127.0.0.1 -p 11211 
#查看memcache的进程号 
ps -ef | grep memcached 
#多线程 
在安装的时候必须打开:./configure --enable-threads 
安装完之后,启动的时候看看帮助信息有没有这条: 
-t <num>       number of threads to use, default 4 
如果存在该选项,说明已经支持了线程,就可以在启动的时候使用 -t 选项来启动多线程 
然后启动的时候必须加上你需要支持的线程数量: 
/opt/memcached/bin/memcache/bin/memcached -t 1024 
#memcached命令的参数 
/opt/memcached/bin/memcached -d -u root -m 512 127.0.0.1 -p 11211 
/opt/memcached/bin/memcached -d -m 200 -u root -l 192.168.1.91 -p 11211 -c 1000 -P /tmp/memcached.pid 
相关解释如下: 
-d选项是启动一个守护进程, 
-m是分配给Memcache使用的内存数量,单位是MB,这里是200MB 
-u是运行Memcache的用户,如果当前为 root 的话,需要使用此参数指定用户。 
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.1.91 
-p是设置Memcache监听的端口,我这里设置了12301,最好是1024以上的端口 
-c选项是最大运行的并发连接数,默认是1024,这里设置了1000 
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid 
#停止Memcache进程 
# kill `cat /tmp/memcached.pid` 
也可以启动多个守护进程,但是端口不能重复 
#-d参数 
-d install 安装memcached 
-d uninstall 卸载memcached 
-d start 启动memcached服务 
-d restart 重启memcached服务 
-d stop 停止memcached服务 
#查看启动的memcache服务 
netstat -lp | grep memcached 
#查看memcache的进程 
ps -ef | grep memcached

 

 

memcached 启动参数


-p 指定端口号(默认11211)  
-U <num> UDP监听端口 (默认: 11211, 0 时关闭) 
-s <file>     用于监听的UNIX套接字路径(禁用网络支持)
-a <mask>     UNIX套接字访问掩码,八进制数字(默认:0700)
-m 指定最大使用内存大小(默认64MB)   
-t 线程数(默认4)   
 
-l <ip_addr> 绑定地址 (默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问) 
-d start 启动memcached服务   
-d restart 重起memcached服务   
-d stop|shutdown 关闭正在运行的memcached服务   
-u <username> 绑定使用指定用于运行进程 <username>  (只有root用户可以使用这个参数)
-P <file> 将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与 -d 一起使用
-m 最大内存使用,单位MB。默认64MB   
-M 内存耗尽时返回错误,而不是删除项   
-c 最大同时连接数,默认是1024 
-f 块大小增长因子,默认是1.25 
-n <bytes>最小分配空间,key+value+flags默认是48
 
-k锁定所有内存页。注意你可以锁定的内存上限。
              试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。
              (不是前面的 -u <username> 参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)
-v 提示信息(在事件循环中打印错误/警告信息。)
-vv 详细信息(还打印客户端命令/响应)
-vvv 超详细信息(还打印内部状态的变化)
-h 打印这个帮助信息并退出。
-i  打印memcached和libevent的许可。
-L 尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。
              为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。
-D <char>     使用 <char> 作为前缀和ID的分隔符。
              这个用于按前缀获得状态报告。默认是":"(冒号)。
              如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启。
-t <num>      使用的线程数(默认:4)
-R 每个连接可处理的最大请求数。
-C 禁用CAS。
-b 设置后台日志队列的长度(默认:1024)
-B 绑定协议 - 可能值:ascii,binary,auto(默认)
-I 重写每个数据页尺寸。调整数据项最大尺寸。
 
常用组合:
/usr/local/memcached/bin/memcached -d -m 256 -p 11211 -u www -l 127.0.0.1
 

方式一:

memcached -d start -u nobody -m 1024 -p 11211-c 2048 -P /tmp/memcached.pid



当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题。

有这么一段文字来描述“Memcached集群”

Memcached如何处理容错的?

不处理!:) 在memcached节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效,应对的措施完全取决于用户。节点失效时,下面列出几种方案供您选择:

* 忽略它! 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。

* 把失效的节点从节点列表中移除。做这个操作千万要小心!在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓存数据不可用!因为哈希参照的节点列表变化了,大部分key会因为哈希值的改变而被映射到(与原来)不同的节点上。

* 启动热备节点,接管失效节点所占用的IP。这样可以防止哈希紊乱(hashing chaos)。

根据上面的说法,Memcached其中一个节点失效以后,memcached本身是没有任何策略维持失效转发的,这对于大型系统是一个无法接受的事实。

举例说明:

在客户端连接的部分写入多个服务器端的ip地址,客户端将会自动的把缓存数据分布的放在每个不同的机器上,如图所示:

缺陷说明:

如果其中一个缓存节点的机器down机,那么客户端存入的缓存数据将会丢失一部分,就是图中红色字体描述的“Losed 33% Cache Data”,也就是说那部分数据彻底没有了!如果是用户的关键性信息那么就玩大了,如图所示:

 

解决方案:采用缓存代理服务器

采用 Magent 缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存服务器,缓存代理服务器可以连接多台Memcached机器,如下图所示,配件清单如下:

Magent代理服务器:2台,分别为 192.168.1.2:12000、192.168.1.3:12000

Memcached主服务器:3台,分别为 192.168.1.4:11211、192.168.1.5:11211、192.168.1.6:11211 

Memcached备服务器:2台,分别为 192.168.1.5:11211、192.168.1.6:11211

 

搭建Memcahced服务器

在 192.168.1.4、192.168.1.5、192.168.1.6、192.168.1.7、192.168.1.8 上分别编译安装并运行Memcached ,

参考:CentOS6.3编译安装Memcached

 

搭建Magent代理服务器

在 192.168.1.2、192.168.1.3 上分别 编译安装 magent [CSDN下载 Magent]

#编译安装安装magent到 /usr/local/ 下

1 cd /usr/local/
2 mkdir ./magent
3 cd ./magent
4 wget -c http://memagent.googlecode.com/files/magent-0.6.tar.gz
5 tar xzvf ./magent-0.6.tar.gz
6 /sbin/ldconfig
7 sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
8 make
9 cp ./magent /usr/bin/magent

注意:编译的过程中遇到了好几处错误,错误解决过程,请参考

CentOS6.3编译安装Memcached集群分布式缓存代理Magent-0.6出错汇总

 

magent命令详解:

  -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

在 192.168.1.2、192.168.1.3 上分别运行 magent:

1 magent -u root -n 51200 -l 192.168.1.2 -p 12000 -s 192.168.1.4:11211 -s 192.168.1.5:11211 -s 192.168.1.6:11211 -b 192.168.1.7:11211 -b 192.168.1.8:11211

 

测试缓存数据的分布情况:

以前,我们用PHP连接多台Memcached服务器,做分布式缓存时,参考代码如下:

1 $memcache new Memcache;
2 $memcache->addServer('localhost', 11211);
3 $memcache->addServer('localhost', 11212);
4 $memcache->addServer('localhost', 11213);
5 for ($i = 0; $i < 1000; $i++)
6 {
7     $memcache->set($i$i, 0, 1000);
8 }

现在,代码还是那段代码,只不过连接的主机不是Memcached服务器了,而是 Magent代理服务器,给 addServer()方法传参时,传入的是Magent主机IP与端口!测试代码如下:

01 $mem new \Memcache();
02  
03 $host '192.168.1.2';
04 $port '12000 ';
05 $mem->connect($host$port);
06  
07 $key1 'snsgou1';
08 $value1 '1';
09 $mem->add($key1$value1);
10  
11 $key2 'snsgou2';
12 $value2 '2';
13 $mem->add($key2$value2);
14  
15 $key3 'snsgou3';
16 $value3 '3';
17 $mem->add($key3$value3);
18  
19 $key4 'snsgou4';
20 $value4 '4';
21 $mem->add($key4$value4);
22  
23 $key5 'snsgou5';
24 $value5 '5';
25 $mem->add($key5$value5);
26  
27 $key6 'snsgou6';
28 $value6 '6';
29 $mem->add($key6$value6);

说明:

1、PHP连接magent,把缓存key1交给magent,magent根据自身的配置参数,再加上一定的哈希算法,会计算出key1存在3台主Memcached服务器的某一台上,然后以同样的算法,将key1也在2台备用的Memcached服务器中的某一台上,再存一份数据。即,主服务器是分布式存储的,同时,从服务器也是分布式存储的;

2、在PHP获取缓存数据key1时,magent一旦得知数据所存的那台主Memcached服务器挂掉了,它就会转向从备用的Memcached服务器中获取数据。注意:服务器的定位选择算法跟存的时候是一样的。

3、有个缺陷,当 down 掉的那台主Memcached服务器重新恢复正常后,Memcahed里是没有数据的,即数据全部丢失,但此时 备用的Memcached服务器 又不会将数据同步到 主服务器

4、通过Memcached管理软件MemAdmin点击下载)去查看上述数据分布情况,如下:

192.168.1.4 存有 snsgou6,snsgou3
192.168.1.5 存有 snsgou4,snsgou1
192.168.1.6 存有 snsgou5,snsgou2
192.168.1.7 存有 snsgou5,snsgou3,snsgou1
192.168.1.8 存有 snsgou4,snsgou6,snsgou2

5、PHP连接代理的时候,最好每次随机性只连一台,这样,一旦某台代理挂了(即连不上),可切换连另外一台代理服务器。而随机性地去连,又保证了一定的负载均衡。

6、本来我打算通过修改配置文件php.ini,使PHP系统的会话(Session)通过Magent代理保存到Memcached服务器中,修改方式参考:PHP如何将session保存到memcached中?如何分布式保存PHP session

但是呢,把Mangent代理服务器IP及端口贴到php.ini后(已重启了相关服务器),发现会话根本没保存到Memcached中,即PHP底层不识别Magent代理,郁闷!!!

 

 

 

参考:

http://www.javabloger.com/article/memcached-cluster-error-msag.html

magent编译安装及常见错误

magent做memcached集群

[张宴]Memcached的代理服务器软件:magent使用小记[原创]

magent 配置问题详解

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值