业务使用的原memcached机器过保故障,需要在新机器上部署memcached服务,同时设置相关网络策略限制,保护缓存数据安全。
整个通过编译安装方式搭建服务的过程非常简单,异常的可能性不大,主要是服务启动后的验证,一个是通过telnet连接到新机器的1121端口然后输入相关命令验证,一个是安装php扩展,通过php脚本进行验证。
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
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
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 ## 默认是可以找到相关配置,如果找不到需要指定 �Cwith-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
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
-p <num> 设置TCP端口号(默认不设置为: 11211)
-U <num> UDP监听端口(默认: 11211, 0 时关闭)
-l <ip_addr> 绑定地址(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
-d 以daemon方式运行
-u <username> 绑定使用指定用于运行进程<username>
-m <num> 允许最大内存用量,单位M (默认: 64 MB)
-P <file> 将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与-d 一起使用
-c 选项是最大运行的并发连接数
telnet ip 11211
五种基本 memcached 命令:
set add replace get delete
set,add,replace是用于操作存储在memcached中的键值对的标准修改命令。
语法: command <key> <flags> <expiration time> <bytes><value>
参数 用法
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 <key>
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
开发说明文档: 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代码:
<?php error_reporting(off); $mc = new Memcached(); $mc->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); ?>
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)交流,一同进步,一同成长。