tlinux(CentOS)下memcached 安装与使用

0x00 背景

 业务使用的原memcached机器过保故障,需要在新机器上部署memcached服务,同时设置相关网络策略限制,保护缓存数据安全。
整个通过编译安装方式搭建服务的过程非常简单,异常的可能性不大,主要是服务启动后的验证,一个是通过telnet连接到新机器的1121端口然后输入相关命令验证,一个是安装php扩展,通过php脚本进行验证。


0x01 准备

memcached是一个高性能分布式的内存对象缓存系统, 通常被用于降低数据库加载压力以提高动态web应用的响应速度。
 
官网: http://memcached.org/ ,目前最新版本为v1.4.24 release notes (2015-4-25)
 下载地址: http://www.memcached.org/files/memcached-1.4.24.tar.gz

 依赖文件:
 libevent2.0.22:http://libevent.org/ 
 https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz

0x02 安装

   1. 安装依赖libevent

cd /data/zk-install
wget -O libevent-2.0.22-stable.tar.gz https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz
tar -zxf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable
./configure
make&& make install

 2.安装memcached

cd /data/zk-install  
wget -O memcached-1.4.24.tar.gz  http://www.memcached.org/files/memcached-1.4.24.tar.gztar zxvf memcached-1.4.24.tar.gz 
cd memcached-1.4.24 ./configure 
## 默认是可以找到相关配置,如果找不到需要指定 –with-libevent=libevent编译安装路径 make; make install

 3.启动memcached服务

/usr/local/bin/memcached -d -u root -l  10.175.97.99 -m 2048 -p 12121
##绑定内网地址;指定root用户运行memcached;允许分配最大内存2G,指定服务端口为11211

4.安全加固

IPT=`whereis iptables|awk '{ print $2 }'`#begin$IPT  -F  ETH1_TCP
#acl
$IPT -A ETH1_TCP -p tcp -s ip1 --dport 11211 -j ACCEPT
$IPT -A ETH1_TCP -p tcp -s ip2 --dport 11211 -j ACCEPT
$IPT -A ETH1_TCP -p tcp --dport 11211 -j DROP
$IPT  -A  ETH1_TCP -p tcp -j ACCEPT
IPT=`whereis iptables|awk '{ print $2 }'`#begin$IPT  -F  ETH1_UDP#acl$IPT -A ETH1_TCP -p udp --dport 11211 -j DROP
$IPT -A ETH1_TCP -p udp -s  ip1  --dport 11211 -j ACCEPT
$IPT -A ETH1_TCP -p udp -s ip2 --dport 11211 -j ACCEPT
$IPT -A ETH1_TCP -p udp --dport 11211 -j DROP
$IPT  -A  ETH1_UDP -p udp -j ACCEPT

0x03  使用

1. 启动Memcache 常用参数

-p  设置TCP端口号(默认不设置为: 11211)
-U  UDP监听端口(默认: 11211, 0 时关闭) 
-l  绑定地址(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
-d 以daemon方式运行
-u  绑定使用指定用于运行进程
-m  允许最大内存用量,单位M (默认: 64 MB)
-P  将PID写入文件,这样可以使得后边进行快速进程终止, 需要与-d 一起使用
-c 选项是最大运行的并发连接数

2. 连接

telnet ip 11211


3. 基本命令

五种基本 memcached 命令:

set
add
replace
get
delete

set,add,replace是用于操作存储在memcached中的键值对的标准修改命令。

语法:
command    

参数 用法

key key 用于查找缓存值
flags 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes 在缓存中存储的字节点
value 存储的值(始终位于第二行)
附录相关说明:set set 命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。set 命令:set userId 0 0 512345STORED

如果使用 set 命令正确设定了键值对,服务器将使用单词 STORED 进行响应。
add 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。

使用 add 命令的标准交互:set userId 0 0 512345STOREDadd userId 0 0 555555NOT_STOREDadd companyId 0 0 3564STORED
replace 仅当键已经存在时,replace 命令才会替换缓存中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到一条 NOT_STORED 响应。
下面是使用 replace 命令的标准交互:replace accountId 0 0 567890NOT_STOREDset accountId 0 0 567890STOREDreplace accountId 0 0 555555STORED

最后两个基本命令是 get 和 delete。这些命令相当容易理解,并且使用了类似的语法,如下所示:
command 
get get 命令用于检索与之前添加的键值对相关的值。您将使用 get 执行大多数检索操作。
下面是使用 get 命令的典型交互:set userId 0 0 512345STOREDget userIdVALUE userId 0 512345ENDget bobEND使用一个键来调用get,如果这个键存在于缓存中,则返回相应的值。如果不存在,则不返回任何内容。
delete 最后一个基本命令是 delete。delete 命令用于删除 memcached 中的任何现有值。您将使用一个键调用delete,如果该键存在于缓存中,则删除该值。如果不存在,则返回一条NOT_FOUND 消息。
下面是使用 delete 命令的客户机服务器交互:set userId 0 0 598765STOREDdelete bob
NOT_FOUNDdelete userId
DELETEDget userIdEND可以在 memcached 中使用的两个高级命令是 gets 和 cas。gets 和cas 命令需要结合使用。您将使用这两个命令来确保不会将现有的名称/值对设置为新值(如果该值已经更新过)。我们来分别看看这些命令。
 gets 
gets 命令的功能类似于基本的 get 命令。两个命令之间的差异在于,gets 返回的信息稍微多一些:64 位的整型值非常像名称/值对的 “版本” 标识符。
下面是使用 gets 命令的客户机服务器交互:set userId 0 0 512345STOREDget userIdVALUE userId 0 512345ENDgets userIdVALUE userId 0 5 412345END考虑 get 和 gets 命令之间的差异。gets 命令将返回一个额外的值 — 在本例中是整型值 4,用于标识名称/值对。如果对此名称/值对执行另一个set 命令,则gets 返回的额外值将会发生更改,以表明名称/值对已经被更新。清单 6 显示了一个例子:
stats stats 命令的功能正如其名:转储所连接的 memcached 实例的当前统计数据。在下例中,执行 stats 命令显示了关于当前 memcached 实例的信息:
STAT pid 22459 进程ID
STAT uptime 1027046 服务器运行秒数
STAT time 1273043062 服务器当前unix时间戳
STAT version 1.4.4 服务器版本
STAT pointer_size 64 操作系统字大小(这台服务器是64位的)
STAT rusage_user 0.040000 进程累计用户时间
STAT rusage_system 0.260000 进程累计系统时间
STAT curr_connections 10 当前打开连接数
STAT total_connections 82 曾打开的连接总数
STAT connection_structures 13 服务器分配的连接结构数
STAT cmd_get 54 执行get命令总数
STAT cmd_set 34 执行set命令总数
STAT cmd_flush 3 指向flush_all命令总数
STAT get_hits 9 get命中次数
STAT get_misses 45 get未命中次数
STAT delete_misses 5 delete未命中次数
STAT delete_hits 1 delete命中次数
STAT incr_misses 0 incr未命中次数
STAT incr_hits 0 incr命中次数
STAT decr_misses 0 decr未命中次数
STAT decr_hits 0 decr命中次数
STAT cas_misses 0 cas未命中次数
STAT cas_hits 0 cas命中次数
STAT cas_badval 0 使用擦拭次数
STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 15785 读取字节总数
STAT bytes_written 15222 写入字节总数
STAT limit_maxbytes 1048576 分配的内存数(字节)
STAT accepting_conns 1 目前接受的链接数
STAT listen_disabled_num 0 STAT threads 4 线程数
STAT conn_yields 0STAT bytes 0 存储item字节数
STAT curr_items 0 item个数
STAT total_items 34 item总数
STAT evictions 0 为获取空间删除item的总数
flush_all flush_all 是最后一个要介绍的命令。这个最简单的命令仅用于清理缓存中的所有名称/值对。如果您需要将缓存重置到干净的状态,则 flush_all 能提供很大的用处。下面是一个使用 flush_all 的例子:set userId 0 0 555555STOREDget userIdVALUE userId 0 555555ENDflush_all
OKget userIdEND

4.PHP程序中调用memcached服务

  开发说明文档: http://php.net/manual/zh/intro.memcached.php
  memcache PHP扩展:http://pecl.php.net/package/memcache
  下载地址:http://pecl.php.net/get/memcache-3.0.8.tgz

PHP环境说明:

PHP版本:php-5.4.43PHP路径:/usr/local/php/bin/phpize  /usr/local/php/bin/php-configPHP扩展路径:/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525

注意事项:

如果libmemcached被安装在一个非标准路径,使用--with-libmemcached-dir=DIR 来指定路径,DIR就是libmemcached安装时的prefix参数。这个路径需要包含文件include/libmemcached/memcached.h。

如果要支持压缩就需要zlib。对于非标准安装的zlib库,使用--with-zlib-dir=DIR 来指定zlib安装路径,DIR就是zib安装时的prefix参数。

session处理器的支持默认是开启的。如果要关闭它,使用选项--disable-memcached-session 。

 下载安装memcache php扩展:

cd /data/zk-install
wget -O memcache-3.0.8.tgz http://pecl.php.net/get/memcache-3.0.8.tgztar -zxf memcache-3.0.8.tgz cd memcache-3.0.8
/usr/local/php/bin/phpize  
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir
make;make install

 
PHP调用memcache代码:

addServer("10.175.97.99", 11211); 

$mc->set("User", "qunyingliu"); 
$mc->set("Sex", "male"); 

$arr = array( 
    $mc->get("User"), 
    $mc->get("Sex") 
); 
var_dump($arr); 
?>

 

5.常见问题答疑

  Q1:编译安装memcached过程中找不到libevent库地址?
  A:可以在编译安装libevent指定安装目录,在编译安装memcached通过参数--with-libevent=(编译libevent时指定的地址)

 Q2:集群方案如何搭建?
 A:可以考虑,magent is a simple but useful proxy program for memcached servers.
 官网地址:https://code.google.com/archive/p/memagent/

如有其他问题,欢迎RTX(qunyingliu)交流,一同进步,一同成长。