LNMP安装教程链接:22-love cat 17周博客作业第2部分-构建一个LVS-DR模型的高性能集群
memcached 安装及测试效果
一、概念
memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
memcached是一套分布式的快取系统,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用。这是一套开放源代码软件,以BSD license授权协议发布。(以上概念介绍引用百度百科)
适用memcached的场景:
分布式应用。由于memcached本身基于分布式的系统,所以尤其适合大型的分布式系统。
数据库前段缓存。数据库常常是网站系统的瓶颈。数据库的大并发量访问,常常造成网站内存溢出。当然我们也可以使用Hibernate的缓存机制。但memcached是基于分布式的,并可独立于网站应用本身,所以更适合大型网站进行应用的拆分。
服务器间数据共享。举例来讲,我们将网站的登录系统、查询系统拆分为两个应用,放在不同的服务器上,并进行集群,那这个时候用户登录后,登录信息如何从登录系统服务器同步到查询系统服务器呢?这时候,我们便可以使用memcached,登录系统将登录信息缓存起来,查询系统便可以获得登录信息,就像获取本地信息一样。
不适用memcached的场景:
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源。
二、安装memcached
[root@php-server ~]# yum install -y memcached.x86_64 #yum安装memcached [root@php-server ~]# yum info memcached #列出memcached的rpm包信息 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * atomic: mirrors.neusoft.edu.cn * base: centos.ustc.edu.cn * epel: mirror01.idc.hinet.net * extras: centos.ustc.edu.cn * updates: mirrors.sina.cn * webtatic: us-east.repo.webtatic.com Installed Packages Name : memcached Arch : x86_64 Version : 1.4.24 Release : 5.el6.art Size : 200 k Repo : installed From repo : atomic Summary : High Performance, Distributed Memory Object Cache URL : http://www.memcached.org/ License : BSD Description : memcached is a high-performance, distributed memory object caching : system, generic in nature, but intended for use in speeding up dynamic : web applications by alleviating database load. #这就是为什么memcached可以减轻databases的原因 [root@php-server ~]# rpm -ql memcached #安装完memcached后,我们看下文件 /etc/rc.d/init.d/memcached #启动脚步 /etc/sysconfig/memcached #配置文件 /usr/bin/memcached #主程序文件目录位置 /usr/bin/memcached-tool #工具程序文件目录位置 /usr/share/doc/memcached-1.4.24 #后面的就不介绍了 /usr/share/doc/memcached-1.4.24/AUTHORS /usr/share/doc/memcached-1.4.24/CONTRIBUTORS /usr/share/doc/memcached-1.4.24/COPYING /usr/share/doc/memcached-1.4.24/ChangeLog /usr/share/doc/memcached-1.4.24/NEWS /usr/share/doc/memcached-1.4.24/new_lru.txt /usr/share/doc/memcached-1.4.24/protocol.txt /usr/share/doc/memcached-1.4.24/readme.txt /usr/share/doc/memcached-1.4.24/threads.txt /usr/share/man/man1/memcached.1.gz /var/run/memcached [root@php-server ~]# cat /etc/sysconfig/memcached PORT="11211" #memcached监听在哪个端口上 USER="memcached" #运行memcached进程的用户 MAXCONN="1024" #最大连接数 CACHESIZE="64" #缓存大小(实际生产不会只有64M) OPTIONS="" #其他选项 [root@php-server ~]# service memcached start #启动memcached服务 Starting memcached: [ OK ] [root@php-server ~]# netstat -tunlp |grep memcached tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 1672/memcached tcp 0 0 :::11211 :::* LISTEN 1672/memcached udp 0 0 0.0.0.0:11211 0.0.0.0:* 1672/memcached udp 0 0 :::11211 :::* 1672/memcache
三、memcached命令介绍
常用命令含义说明,如下表所示:
选项 |
含义说明 |
-d | 指定memcached进程作为一个守护进程启动 |
-m <num> | 指定分配给memcached使用的内存,单位是MB,默认为64; |
-u <username> | 运行memcached的用户 |
-l <ip_addr> | 监听的服务器IP地址,如果有多个地址的话,使用逗号分隔,格式可以为“IP地址:端口号”,例如:-l 指定192.168.0.184:19830,192.168.0.195:13542;端口号也可以通过-p选项指定 |
-p <num> | Listen on TCP port <num>, the default is port 11211. |
-c <num> | 设置最大运行的并发连接数,默认是1024 |
-R <num> | 为避免客户端饿死(starvation),对连续达到的客户端请求数设置一个限额,如果超过该设置,会选择另一个连接来处理请求,默认为20 |
-k | 设置锁定所有分页的内存,对于大缓存应用场景,谨慎使用该选项 |
-P | 保存memcached进程的pid文件 |
-s <file> | 指定Memcached用于监听的UNIX socket文件 |
-a <perms> | 设置-s选项指定的UNIX socket文件的权限 |
-U <num> | Listen on UDP port <num>, the default is port 11211, 0 is off. |
-M | 当内存使用超出配置值时,禁止自动清除缓存中的数据项,此时Memcached不可以,直到内存被释放 |
-r | 设置产生core文件大小 |
-f <factor> | 用于计算缓存数据项的内存块大小的乘数因子,The default is 1.25. |
-n | 为缓存数据项的key、value、flag设置最小分配字节数,默认是48 |
-C | Disable the use of CAS (and reduce the per-item size by 8 bytes). |
-h | 显示Memcached版本和摘要信息 |
-v | 输出警告和错误信息 |
-vv | 打印信息比-v更详细:不仅输出警告和错误信息,也输出客户端请求和响应信息 |
-i | 打印libevent和Memcached的licenses信息 |
-t <threads> | 处理用于请求的线程数,The default is 4. |
-D <char> | 用于统计报告中Key前缀和ID之间的分隔符,默认是冒号“:” |
-L | 尝试使用大内存分页(pages) |
-B <proto> | 指定使用的协议,默认行为是自动协商(autonegotiate),可能使用的选项有auto、ascii、binary。 |
-I <size> | 覆盖默认的STAB页大小,默认是1M |
-F | 禁用flush_all命令 |
-o <options> | 指定逗号分隔的选项,一般用于用于扩展或实验性质的选项 |
stats命令
STAT pid 22362 //memcache服务器的进程ID STAT uptime 1469315 //服务器已经运行的秒数 STAT time 1339671194 //服务器当前的unix时间戳 STAT version 1.4.9 //memcache版本 STAT libevent 1.4.9-stable //libevent版本 STAT pointer_size 64 //当前操作系统的指针大小(32位系统一般是32bit,64就是64位操作系统) STAT rusage_user 3695.485200 //进程的累计用户时间 STAT rusage_system 14751.273465 //进程的累计系统时间 STAT curr_connections 69 //服务器当前存储的items数量 STAT total_connections 855430 //从服务器启动以后存储的items总数量 STAT connection_structures 74 //服务器分配的连接构造数 STAT reserved_fds 20 // STAT cmd_get 328806688 //get命令(获取)总请求次数 STAT cmd_set 75441133 //set命令(保存)总请求次数 STAT cmd_flush 34 //flush命令请求次数 STAT cmd_touch 0 //touch命令请求次数 STAT get_hits 253547177 //总命中次数 STAT get_misses 75259511 //总未命中次数 STAT delete_misses 4 //delete命令未命中次数 STAT delete_hits 565730 //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 touch_hits 0 //touch命令未命中次数 STAT touch_misses 0 //touch命令命中次数 STAT auth_cmds 0 //认证命令处理的次数 STAT auth_errors 0 //认证失败数目 STAT bytes_read 545701515844 //总读取字节数(请求字节数) STAT bytes_written 1649639749866 //总发送字节数(结果字节数) STAT limit_maxbytes 2147483648 //分配给memcache的内存大小(字节) STAT accepting_conns 1 //服务器是否达到过最大连接(0/1) STAT listen_disabled_num 0 //失效的监听数 STAT threads 4 //当前线程数 STAT conn_yields 14 //连接操作主动放弃数目 STAT hash_power_level 16 // STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT expired_unfetched 30705763 STAT evicted_unfetched 0 STAT bytes 61380700 //当前存储占用的字节数 STAT curr_items 28786 //当前存储的数据总数 STAT total_items 75441133 //启动以来存储的数据总数 STAT evictions 0 //为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items) STAT reclaimed 39957976 //已过期的数据条目来存储新数据的数目 END
上面给出了各个统计项的含义说明,不再累述,stats命令有几个二级子项,说明如下表所示:
命令 | 含义说明 |
stats slabs | 显示各个slab的信息,包括chunk的大小、数目、使用情况等 |
stats items | 显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数) |
stats detail [on|off|dump] | 设置或者显示详细操作记录; 参数为on,打开详细操作记录; 参数为off,关闭详细操作记录; 参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数) |
stats malloc | 打印内存分配信息 |
stats sizes | 打印缓存使用信息 |
stats reset | 重置统计信息 |
下面的命令,我们通过表格的形式说明,如下表所示:
命令 | 用法格式 | 含义说明 | 示例 |
get | get <key>*\r\n | 用于获取缓存的数据,键为key。 | get name VALUE name 0 7 shirdrn END |
gets | gets <key>*\r\n | 用于获取缓存的数据,键为一组key。 | gets name hobby VALUE name 1 7 1234567 VALUE hobby 0 25 tenis basketball football END |
set | set <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n | 向缓存中存储数据,不管key对应的值存在与否,都设置key对应的值。 | set name 0 1800 7 shirdrn STORED get name VALUE name 0 7 shirdrn END |
touch | touch <key> <exptime> [noreply]\r\n | 更新缓存中key对应的值的过期时间。 | touch name 1800 |
delete | delete <key> [<time>] [noreply]\r\n | 给定键key,删除缓存中key对应的数据。 | delete name 60 |
add | add <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n | 向缓存中存储数据,只有key对应的值不存在时,才会设置key对应的值。 | add hobby 0 1800 10 basketball STORED get hobby VALUE hobby 0 10 |
replace | replace <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n | 覆盖一个已经存在Key及其对应的Value,替换一定要保证替换后的值的长度原始长度相同,否则replace失败。 | get name VALUE name 0 7 shirdrn END replace name 0 1800 7 youak47 STORED get name VALUE name 0 7 youak47 END |
append | append <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n | 在一个已经存在的数据值(value)上追加,是在数据值的后面追加。 | get hobby VALUE hobby 0 10 basketball END append hobby 0 1800 9 football STORED get hobby VALUE hobby 0 19 basketball football END |
prepend | prepend <key> <flags> <exptime> <bytes> [noreply]\r\n<value>\r\n | 在一个已经存在的数据值(value)上追加,是在数据值的前面追加。 | get hobby VALUE hobby 0 19 basketball football END prepend hobby 0 1800 6 tenis STORED get hobby VALUE hobby 0 25 tenis basketball football END |
incr | incr <key> <value> [noreply]\r\n | 计数命令,可以在原来已经存在的数字上进行累加求和,计算并存储新的数值。 | set active_users 0 1000000 7 1000000 STORED get active_users VALUE active_users 0 7 1000000 END incr active_users 99 1000099 |
decr | decr <key> <value> [noreply]\r\n | 计数命令,可以在原来已经存在的数字上进行减法计算,计算并存储新的数值。 | get active_users VALUE active_users 0 7 1000099 END decr active_users 3456 996643 |
flush_all | flush_all [<time>] [noreply]\r\n | 使缓存中的数据项失效,可选参数是在多少秒后失效。 | flush_all 1800 |
version | version\r\n | 返回Memcached服务器的版本信息。 | version |
quit | quit\r\n | 退出telnet终端。 | quit |
memcached默认没有认证机制,但可借助于SASL进行认证;
PHP有两种Memcached扩展,老一点的叫memcache,新一点的叫memcached:
1、php-pecl-memcache.x86_64 3.0.8-3.el6.art atomic
[root@php-server ~]# yum info php-pecl-memcache.x86_64 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * atomic: mirrors.neusoft.edu.cn * base: centos.ustc.edu.cn * epel: mirror01.idc.hinet.net * extras: centos.ustc.edu.cn * updates: mirrors.sina.cn * webtatic: us-east.repo.webtatic.com Available Packages Name : php-pecl-memcache Arch : x86_64 Version : 3.0.8 Release : 3.el6.art Size : 83 k Repo : atomic Summary : Extension to work with the Memcached caching daemon URL : http://pecl.php.net/package/memcache License : PHP Description : Memcached is a caching daemon designed especially for : dynamic web applications to decrease database load by : storing objects in memory. : : This extension allows you to work with memcached through : handy OO and procedural interfaces. : : Memcache can be used as a PHP session handler.
2、php-pecl-memcached.x86_64 2.1.0-9.el6.art atomic
[root@php-server ~]# yum info php-pecl-memcached.x86_64 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * atomic: mirrors.neusoft.edu.cn * base: centos.ustc.edu.cn * epel: mirror01.idc.hinet.net * extras: centos.ustc.edu.cn * updates: mirrors.yun-idc.com * webtatic: us-east.repo.webtatic.com Available Packages Name : php-pecl-memcached Arch : x86_64 Version : 2.1.0 Release : 9.el6.art Size : 55 k Repo : atomic Summary : Extension to work with the Memcached caching daemon URL : http://pecl.php.net/package/memcached License : PHP and MIT Description : This extension uses libmemcached library to provide API for communicating : with memcached servers. : : memcached is a high-performance, distributed memory object caching system, : generic in nature, but intended for use in speeding up dynamic web : applications by alleviating database load. : : It also provides a session handler (memcached).
libmemcached 是一个 memcached 的库,客户端库,C 和 C++ 语言实现的客户端库,具有低内存占用率、线程安全、并提供对memcached功能的全面支持,下面我们安装libmemcached.x86_64:
[root@php-server ~]# yum install -y libmemcached.x86_64 [root@php-server ~]# rpm -ql libmemcached #不一一举例,只举例memstat /usr/bin/memaslap /usr/bin/memcapable /usr/bin/memcat /usr/bin/memcp /usr/bin/memdump /usr/bin/memerror /usr/bin/memexist /usr/bin/memflush /usr/bin/memparse /usr/bin/memping /usr/bin/memrm /usr/bin/memslap /usr/bin/memstat /usr/bin/memtouch /usr/lib64/libhashkit.so.2 /usr/lib64/libhashkit.so.2.0.0 /usr/lib64/libmemcached.so.11 /usr/lib64/libmemcached.so.11.0.0 /usr/lib64/libmemcachedprotocol.so.0 /usr/lib64/libmemcachedprotocol.so.0.0.0 /usr/lib64/libmemcachedutil.so.2 /usr/lib64/libmemcachedutil.so.2.0.0 /usr/share/doc/libmemcached-1.0.18 /usr/share/doc/libmemcached-1.0.18/AUTHORS /usr/share/doc/libmemcached-1.0.18/COPYING /usr/share/doc/libmemcached-1.0.18/ChangeLog /usr/share/doc/libmemcached-1.0.18/README /usr/share/doc/libmemcached-1.0.18/THANKS /usr/share/doc/libmemcached-1.0.18/TODO /usr/share/man/man1/memaslap.1.gz /usr/share/man/man1/memcapable.1.gz /usr/share/man/man1/memcat.1.gz /usr/share/man/man1/memcp.1.gz /usr/share/man/man1/memdump.1.gz /usr/share/man/man1/memerror.1.gz /usr/share/man/man1/memexist.1.gz /usr/share/man/man1/memflush.1.gz /usr/share/man/man1/memparse.1.gz /usr/share/man/man1/memping.1.gz /usr/share/man/man1/memrm.1.gz /usr/share/man/man1/memslap.1.gz /usr/share/man/man1/memstat.1.gz /usr/share/man/man1/memtouch.1.gz [root@php-server ~]# memstat --help memstat v1.0 Output the state of a memcached cluster. Current options. A '=' means the option takes a value. --args= Argument for statistics --version Display the version of the application and then exit. --help Display this message and then exit. --quiet stderr and stdin will be closed at application startup. --verbose Give more details on the progression of the application. --binary Switch to binary protocol. --debug Provide output only useful for debugging. --server-version Memcached daemon software version --servers= List which servers you wish to connect to. --analyze= Analyze the provided servers. --username= Username to use for SASL authentication --password= Password to use for SASL authentication [root@php-server ~]# memstat --servers=127.0.0.1 Server: 127.0.0.1 (11211) pid: 1672 uptime: 3347 time: 1471763883 version: 1.4.24 libevent: 1.4.13-stable pointer_size: 64 rusage_user: 0.042993 rusage_system: 0.055991 curr_connections: 10 total_connections: 14 connection_structures: 11 reserved_fds: 20 cmd_get: 0 cmd_set: 0 cmd_flush: 0 cmd_touch: 0 get_hits: 0 get_misses: 0 delete_misses: 0 delete_hits: 0 incr_misses: 0 incr_hits: 0 decr_misses: 0 decr_hits: 0 cas_misses: 0 cas_hits: 0 cas_badval: 0 touch_hits: 0 touch_misses: 0 auth_cmds: 0 auth_errors: 0 bytes_read: 9754 bytes_written: 1435 limit_maxbytes: 67108864 accepting_conns: 1 listen_disabled_num: 0 threads: 4 conn_yields: 0 hash_power_level: 16 hash_bytes: 524288 hash_is_expanding: 0 malloc_fails: 0 bytes: 0 curr_items: 0 total_items: 0 expired_unfetched: 0 evicted_unfetched: 0 evictions: 0 reclaimed: 0 crawler_reclaimed: 0 crawler_items_checked: 0 lrutail_reflocked: 0
LB Cluster保持会话的方法:
session sticky session cluster session server
四、为php安装memcached扩展
php有两个版本的memcached客户端,这里介绍memcached这个是新版的客户端是基于libmemcached,所以必须要安装libmemcached,命令为:
[root@php-server ~]# yum install -y php-pecl-memcached.x86_64 [root@php-server ~]# ll /usr/lib64/php/modules/ #将memcached.so信息添加到php.ini total 5980 -rwxr-xr-x 1 root root 241589 Jun 10 00:34 curl.so -rwxr-xr-x 1 root root 3153493 Jun 10 00:34 fileinfo.so -rwxr-xr-x 1 root root 42480 Feb 11 2016 igbinary.so -rwxr-xr-x 1 root root 150412 Jun 10 00:34 json.so -rwxr-xr-x 1 root root 147183 Jun 10 00:34 mcrypt.so -rwxr-xr-x 1 root root 86984 Aug 2 2013 memcached.so -rwxr-xr-x 1 root root 861233 Jun 10 00:34 phar.so -rwxr-xr-x 1 root root 1428036 Jun 10 00:34 zip.so [root@php-server ~]# wget [root@php-server ~]# tar -xvf memcache-2.2.7.tgz [root@php-server ~]# cd memcache-2.2.7 [root@php-server memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/opt/application/php/bin/php-config [root@php-server memcache-2.2.7]# make;make install [root@php-server memcache-2.2.7]# vim /etc/php.ini #修改php.ini配置文件 extension_dir = "/opt/application/php/lib/php/extensions/no-debug-non-zts-20131226/" extension = "memcache.so" [root@php-server memcache-2.2.7]# service php-fpm restart Gracefully shutting down php-fpm . done Starting php-fpm done 或者: [root@php-server memcache-2.2.7]# cp /opt/application/php/lib/php/extensions/no-debug-non-zts-20131226/* /opt/application/php/lib/php/extensions/ [root@php-server memcache-2.2.7]# vim /etc/php.ini extension = "memcache.so"
打开php探针网页:
测试memcached
[root@php-server ~]# telnet 192.168.2.214 11211 STAT pid 20439 —— Memcached 进程的ID STAT uptime 179982 —— 进程运行时间 STAT time 1471773767 ——当前时间 STAT version 1.4.24 STAT libevent 1.4.13-stable STAT pointer_size 32 STAT rusage_user 21.916668 STAT rusage_system 40.576831 STAT curr_connections 11 STAT total_connections 329 STAT connection_structures 23 STAT reserved_fds 20 STAT cmd_get 2363348 —— 总共获取数据的次数(等于 get_hits + get_misses ) STAT cmd_set 279971 —— 总共设置数据的次数 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 2286284 —— 命中了多少次数据,也就是从 Memcached 缓存中成功获取数据的次数 STAT get_misses 77064 —— 没有命中的次数 STAT delete_misses 30803 STAT delete_hits 48876 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 574591015 STAT bytes_written 4353057466 STAT limit_maxbytes 67108864 —— 总的存储大小,默认为 64M STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 262144 STAT hash_is_expanding 0 STAT bytes 4717345 —— 当前所用存储大小 STAT curr_items 5654 STAT total_items 58461 STAT expired_unfetched 17 STAT evicted_unfetched 0 STAT evictions 0 STAT reclaimed 49 END
用python测试memcached
[root@php-server ~]# more python-memcached.py #!/usr/bin/env python import memcache mc = memcache.Client(['127.0.0.1:11211'], debug=1) mc.set("some_key", "Some value") value = mc.get("some_key") print value mc.set("another_key", 3) mc.delete("another_key") mc.set("key", "1") # note that the key used for incr/decr must be a string. mc.incr("key") mc.decr("key") [root@php-server ~]# python python-memcached.py Some value
还可以用memadmin工具
原创文章,作者:zuoyang1990,如若转载,请注明出处:http://www.178linux.com/38301