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 //當前操作系統的指針大?。?2位系統一般是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.www58058.com/38301