memcached精講第二部

老男孩之memcached精講第二部
php

1.1Memcache 服務器的安裝。
node

Linux,FreeBSD,Solaris,windows。這裏以Centos6.4爲例進行說明。mysql

軟件地址:Memcached 下載地址:
         libevent 下載地址:
         網友安裝資料:http://instance.iteye.com/blog/1691705


安裝memcached
ios

安裝libevent(c6.6)nginx

安裝環境:算法

  1. [root@lnmp tools]# tar xf libevent-1.4.13-stable.tar.gz sql

  2. [root@lnmp tools]# cd libevent-1.4.13-stable數據庫

  3. [root@lnmp libevent-1.4.13-stable]# ./configureapache

  4. [root@lnmp libevent-1.4.13-stable]# make && make installvim

  5. Centos操做系統可使用 yum直接安裝libevent

安裝memcached:

  1. [root@lnmp tools]# tar xf memcached-1.4.13.tar.gz 

  2. [root@lnmp tools]# cd memcached-1.4.13

  3. [root@lnmp memcached-1.4.13]# ./configure 

  4. [root@lnmp memcached-1.4.13]# make && make install


其餘下載地址:

http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz

http://code.google.com/p/memecached/downloads/list

提示:

memcache-2.2.5.tgz<==客戶端

memcached-1.4.13.tar.gz<==服務端軟件

啓動Memcached:

(1)配置ld.so.conf路徑防止啓動memcached時報錯

wKioL1iqo9eAaZUdAAEGh_HsQh4382.png-wh_50

(2)開機啓動memcached

[root@lnmp memcached-1.4.13]# which memcached/usr/local/bin/memcached
[root@lnmp memcached-1.4.13]# which memcached/usr/local/bin/memcached
[root@lnmp memcached-1.4.13]# memcached -d -c 10240 -p 11211 -m 16 -P /var/run/memcached.pid -u root
[root@lnmp memcached-1.4.13]# netstat -lntup | grep 11211tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      1040/memcached      tcp        0      0 :::11211                    :::*                        LISTEN      1040/memcached      udp        0      0 0.0.0.0:11211               0.0.0.0:*                               1040/memcached      udp        0      0 :::11211                    :::*                                    1040/memcached  須要查看memcached它的幫助是-h


[root@lnmp memcached-1.4.13]# memcached -h
memcached 1.4.13
-p <num>      TCP port number to listen on (default: 11211)
-U <num>      UDP port number to listen on (default: 11211, 0 is off)
-s <file>     UNIX socket path to listen on (disables network support)
-a <mask>     access mask for UNIX socket, in octal (default: 0700)
-l <addr>     interface to listen on (default: INADDR_ANY, all addresses)
              <addr> may be specified as host:port. If you don't specify
              a port number, the value you specified with -p or -U is
              used. You may specify multiple addresses separated by comma
              or by using -l multiple times
-d            run as a daemon
-r            maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num>      max memory to use for items in megabytes (default: 64 MB)
-M            return error on memory exhausted (rather than removing items)
-c <num>      max simultaneous connections (default: 1024)
-k            lock down all paged memory.  Note that there is a
              limit on how much memory you may lock.  Trying to
              allocate more than that would fail, so be sure you
              set the limit correctly for the user you started
              the daemon with (not for -u <username> user;
              under sh this is done with 'ulimit -S -l NUM_KB').
-v            verbose (print errors/warnings while in event loop)
-vv           very verbose (also print client commands/reponses)
-vvv          extremely verbose (also print internal state transitions)
-h            print this help and exit
-i            print memcached and libevent license
-P <file>     save PID in <file>, only used with -d option
-f <factor>   chunk size growth factor (default: 1.25)
-n <bytes>    minimum space allocated for key+value+flags (default: 48)
-L            Try to use large memory pages (if available). Increasing
              the memory page size could reduce the number of TLB misses
              and improve the performance. In order to get large pages
              from the OS, memcached will allocate the total item-cache
              in one large chunk.
-D <char>     Use <char> as the delimiter between key prefixes and IDs.
              This is used for per-prefix stats reporting. The default is
              ":" (colon). If this option is specified, stats collection
              is turned on automatically; if not, then it may be turned on
              by sending the "stats detail on" command to the server.
-t <num>      number of threads to use (default: 4)
-R            Maximum number of requests per event, limits the number of
              requests process for a given connection to prevent 
              starvation (default: 20)
-C            Disable use of CAS
-b            Set the backlog queue limit (default: 1024)
-B            Binding protocol - one of ascii, binary, or auto (default)
-I            Override the size of each slab page. Adjusts max item size
              (default: 1mb, min: 1k, max: 128m)
-o            Comma separated list of extended or experimental options
              - (EXPERIMENTAL) maxconns_fast: immediately close new
                connections if over maxconns limit
              - hashpower: An integer multiplier for how large the hash
                table should be. Can be grown at runtime if not big enough.
                Set this based on "STAT hash_power_level" before a 
                restart.
-d 是以進程後臺進行 -c 是以多少爲併發 -p 以什麼端口來進行監聽 -m 指定多少內存 -P 以什麼什麼pid文件-u指定root
memcahced 相關啓動參數說明:
-p 指定memcached服務監聽的TCP端口。默認爲11211.
-m 指定memcached服務能夠緩存數據的最大內存。默認64MB(量小的時候太大內存)。
-u 運行Memcached服務的用戶
-d 做爲守護進程在後臺運行
-c 最大的併發鏈接數,默認是1024,按照服務器的併發訪問量來設定。
-vv 以very vrebose 模式啓動,調試信息和錯誤輸出到控制檯。
-P 設置保存Memcache的pid文件($$)
-l 指定監聽的服務器IP地址。
其它選項,經過"memcached -h"命令能夠顯示全部可用的選項。讀者可自行閱讀相關資料。-f 調優因子


(3) 檢查啓動結果:

[root@lnmp ~]# netstat -lntup | grep 11211
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      1850/memcached      
tcp        0      0 :::11211                    :::*                        LISTEN      1850/memcached      
udp        0      0 0.0.0.0:11211               0.0.0.0:*                               1850/memcached      
udp        0      0 :::11211                    :::*                                    1850/memcached

  啓動多個實例:

[root@lnmp ~]# memcached -d -m 16 -p 11212 -c 10240 -P /var/run/memcahed.pid -u root
[root@lnmp ~]# ps -ef | grep memcahed| grep -v grep
root         1850     1  0 23:03 ?        00:00:00 memcached -d -m 16 -p 11211 -c 10240 -P /var/run/memcahed.pid -u root

root         1866     1  0 23:12 ?        00:00:00 memcached -d -m 16 -p 11212 -c 10240 -P /var/run/memcahed.pid -u root


(  4)寫入 數據檢查結果:

      向memcached中添加數據:鍵值對

 key1->values1key2->values2
 ==============================
 管理Mysql和MC作一個對比
 Mysql insert->MC:set
 Mysql select->MC:set
 Mysql delete->MC:set


  a.經過nc寫入

 添加鍵值對的操做:printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 127.0.0.1 11211

wKiom1iqpt3T-HifAAC0oibJbJI714.png-wh_50

============>命令後面字節是10,那麼後面的就要10個字符,不然添加不成功


查看鍵值對的操做:printf "get key008 0 0 10\r\noldboy0987\r\n"|nc 127.0.0.1 11211

刪除鍵鍵值對的操做:printf "delete key008 0 0 10\r\noldboy0987\r\n"|nc 127.0.0.1 11211

wKioL1ir7EzTee26AABUh2knqJY814.png-wh_50

推薦上述測試操做memcached的方式。

 

固定的語法:printf 「set/get/delete id 0 0 字節數\r\n字節\r\n」


b.經過telnet寫入

  1. root@localhost ~]# telnet 192.168.1.200 11211

  2. Trying 192.168.1.200...

  3. Connected to 192.168.1.200.

  4. Escape character is '^]'.

  5. set user01 0 0 6

  6. abcdef

  7. STORED

  8. get user01

  9. VALUE user01 0 6

  10. abcdef

  11. END


  1. [root@localhost ~]# telnet 192.168.1.200 11211

  2. Trying 192.168.1.200...

  3. Connected to 192.168.1.200.

  4. Escape character is '^]'.

  5. set k 0 0 1

  6. v

  7. STORED

  8. get k

  9. VALUE k 0 1

  10. v

  11. END

  12. delete k

  13. DELETED

  14. get k

  15. END


  16. stats  

  17. STAT pid 1850

  18. STAT uptime 4893

  19. STAT time 1427819110

  20. STAT version 1.4.13

  21. STAT libevent 1.4.13-stable

  22. STAT pointer_size 64

  23. STAT rusage_user 0.041993

  24. STAT rusage_system 0.487925

  25. STAT curr_connections 10

  26. STAT total_connections 12

  27. STAT connection_structures 11

  28. STAT reserved_fds 20

  29. STAT cmd_get 4

  30. STAT cmd_set 3

  31. STAT cmd_flush 0

  32. STAT cmd_touch 0

  33. STAT get_hits 3

  34. STAT get_misses 1

  35. STAT delete_misses 0

  36. STAT delete_hits 1

  37. STAT incr_misses 0

  38. STAT incr_hits 0

  39. STAT decr_misses 0

  40. STAT decr_hits 0

  41. STAT cas_misses 0

  42. STAT cas_hits 0 命中

  43. STAT cas_badval 0

  44. STAT touch_hits 0

  45. STAT touch_misses 0

  46. STAT auth_cmds 0

  47. STAT auth_errors 0

  48. STAT bytes_read 131

  49. STAT bytes_written 153

  50. STAT limit_maxbytes 16777216

  51. STAT accepting_conns 1

  52. STAT listen_disabled_num 0

  53. STAT threads 4

  54. STAT conn_yields 0

  55. STAT hash_power_level 16

  56. STAT hash_bytes 524288


  57. 這個是查看狀態。

  58. 能夠這樣子進行監控寫腳本。

  59. [root@localhost ~]# printf "stats\r\noldboy\r\n"|nc 192.168.1.200 11211 | grep hit

  60. STAT get_hits 3

  61. STAT delete_hits 1

  62. STAT incr_hits 0

  63. STAT decr_hits 0

  64. STAT cas_hits 0

  65. STAT touch_hits 0

  66. Memcached狀態查看:

  67. stats 總體

  68. stats setting 能夠查看一些memcached設置 例如:線程數。。。一些參數是什麼。

  69. stats slabs 查看slabs相關狀況

  70. stats items 查看Items相關狀況

  71. stats sizes 查看存在的Items 個數和大小

  72. stats cachedump 查看key value

  73. stats reset 清理統計數據

關閉memcached:

先測試插入數據

[root@localhost ~]# printf "set L001 0 0 6\r\noldboy\r\n"|nc 192.168.1.200 11211
STORED
[root@localhost ~]# printf "get L001 0 0 6\r\n"
get L001 0 0 6


一重啓就會消失

[root@lnmp ~]# kill 1850
[root@lnmp ~]# kill 1866
[root@lnmp ~]# memcached -d -m 16 -p 11212 -c 10240 -P /var/run/memcahed.pid -u root
[root@localhost ~]# printf "get L001 0 0 6\r\n" |nc 192.168.1.200 11211

操做memcahed命令語法:

  1. set     key 0   0   10

  2. <command name><key><flags><exptime><bytes>\r\n

  3. 命令        標記    過時時間  字節數 

  4. <command name> setadd,或者 repalce   -<command name>

  5. # set 意思是「存儲此數據」

  6. # add 意思是 「存儲此數據,只在服務器*未*保留此鍵值的數據時」

  7. # replace意思是「存儲此數據,只在服務器*曾*保留此鍵值的數據時」

  8. #<key> 是接下來的客戶端索要求儲存的數據的鍵值

  9. #<flags>是在取回內容時,與數據和發送塊一同保存服務器上的任意16位無符號×××(用十進制來書寫)。客戶端能夠用它做爲「位域」來儲存一些特定的信息;它對服務器是不透明的。

  10. #<exptime>是終止時間。若是爲0,該項永不過時(雖然他可能被刪除,以便爲其餘緩存項目騰出位置)。若是非0(Unix時間戳或當前時刻的秒偏移),到達終止時間後,客戶端沒法在獲取這項內容。

  11. #<bytes> 是隨後的數據區塊的字節長度,不包括用於份野的「\r\n」。它能夠是0(這時後面跟隨一個空的數據區塊)。

  12. 在這一行之後,客戶端發送數據區塊。

  13. #<data block>\r\n

  14. -<data block>是大段的8位數據,其長度由前面的命令行的<bytes>指定。


  15. 發送命令行和數據塊之後,客戶端等待回覆,可能的回覆以下:

  16. -「STORED\r\n

  17. -NOT_S1

代表成功

代表數據沒有被存儲,但不是由於發生錯誤。這一般覺得這add或者replace命令條件不成立,或者,項目已經位列刪除隊列(參考後文的」delete「命令)。

1.2.2關閉memcached

pkill memcahed
netstat -lntup | grep 11211
kill `cat /var/run/11211.pid`
ps -ef|grep memcached|grep -v grep |awk '{print $2}' |xagrs kill


企業工做場景中如何配置memcached?

在企業實際工做中通常是開發人員提出要求,說要部署一個memcached緩存。

咱們運維接到了需求,內存指定多大是根據業務有多少數據要緩存來肯定業務重要性,進而採起負載均衡,分佈式架構,最後肯定併發鏈接數。

實際的部署,通常就是安裝memcached服務端,把服務啓動,並確保客戶訪問上就O了,客戶端PHP安裝都安裝好了。

初入公司,瞭解業務,瞭解架構,加緩存。

思想:給公司或提出方法前,要寫好方案。

1.2.3安裝memcached的客戶端

如下安裝PHPLNMP的環境,要求頁面能出來phpinfo,才能繼續操做

wKiom1i04ASAsKtrAADmFFO28Sw230.png-wh_50

php的memcached模塊(memcache客戶端)編譯安裝

本文以php程序爲例,講解安裝memcache的php的客戶端及memcache的擴展在

http://pecl.php.net/packpage/memcache選擇想要下載的Memcache版本。這裏以memcache-2.2.5版本爲例來安裝PHP的Memcache擴展:JAVA程序同樣須要客戶端(resin,tomcat),但不會像php同樣編譯。在客戶端php的服務器上:

一、解壓縮並編譯安裝。

wKiom1i07VDz0zE-AAEQ1fh3LO8451.png-wh_50

memcache.so的路徑

安裝完後會有相似這樣的提示:

[root@lnmp lib]# cd /application/php/lib/
[root@lnmp lib]# grep mem php.ini
;Maximum amount of memory a script may consume (128MB)
;http://php.net/memory-limit
memory_limit = 128M
;If this parameter is set to Off, then memory leaks will not be shown (on
;http://php.net/report-memleaks
report_memleaks = On
;enabled, registering these variables consumes CPU cycles and memory each time
;Enable / Disable collection of memory usage statistics by mysqlnd which can be
;http://php.net/mysqlnd.collect_memory_statistics
mysqlnd.collect_memory_statistics = Off
;A default size of the shared memory segment
;sysvshm.init_mem = 10000

wKioL1i079qht93-AAC9NswH58E631.png-wh_50

2.修改php.ini文件

wKioL1i08A6wu_C4AACYHuQ19hA052.png-wh_50

3.重啓apache服務使php的配置生效

wKioL1i08EHwHb3HAACAcRjhfr0727.png-wh_50

若是是nginx則:

wKioL1i08HTiWwrHAAFEmb99rqY954.png-wh_50

4)打開瀏覽器訪問phpinfo頁面,出現以下內容表示memcache客戶端安裝成功

wKiom1i08KWxXBW8AAHTwQqprBE529.png-wh_50

5.編寫測試PHP腳本

php程序鏈接memcached測試

wKioL1i08NKRxwJUAAIJaNYnYPg990.png-wh_50

New多個對象鏈接不通的memcached.

wKioL1i08QCCrw_eAADW7NXSXKA377.png-wh_50

做業:

wKiom1i08T_imFLTAAFN8rT1vEY478.png-wh_50

1.3.2集羣中的session共享存儲

http://oldboy.blog.51cto.com/2561410/1331316

1.3.3如何實現集羣中的session共享存儲實戰

wKioL1i08ZfAgp85AABvZxuZv9g492.png-wh_50

  1. vim /applications/php/lib/php.ini

  2. 把上面的參數給改掉。

  3. 保存,而後從新啓動PHP,/applications/php/lib/php-fpm 重啓新啓動的命令

1.4Memcached分佈式集羣

前面已經介紹過,Memcached的分佈式使用經過客戶端的程序庫來實現的,下面舉例描述其工做流程。Tokyo_Tyrant(持久化存儲)

3.經過程序實現URL一致性HASH

wKioL1i08evCpGr7AAGCIiIjK1k705.png-wh_50

假設有node一、node二、node3三臺Memcached服務器,應用程序套實現保存名爲"tokyo"、"tokyo1""tokyo2""tokyo3"的數據如圖所示:

wKiom1i08h7hx6C4AADLMfq9CHM363.png-wh_50

圖上方Memcached中存入數據的初始狀態

向Memcached中存入"tokyo",將"tokyo"傳給客戶端程序後,客戶端實現的算法就會根據這個"鍵"來決定保存數據的Memcached服務器,選定服務器後,就命令該服務器保存"tokyo"及其值,以下圖:

wKiom1i08suwM2JCAADUSyuKvO8350.png-wh_50

一樣,存入"tokyo1"、"tokyo2"和"tokyo3"的過程都是先經過客戶端的算法選擇服務器在保存數據。

接下來獲取保存數據。獲取保存的key/value對時也要將要獲取的鍵"toyko"傳遞給函數庫。函數庫經過與存取數據操做相同的算法,根據"鍵"來選擇服務器。只要使用的算法相同,就能肯定存入在哪一臺服務器,而後發送get命令。只要數據沒有由於某些緣由被刪除,就能得到保存的值如圖:

wKioL1i08wmCaMpbAAEgzJp9yZ8601.png-wh_50

圖上Memcached中存入"tokyo"的過程

 將不一樣的鍵保存到不一樣的服務器上,就實現Memcached的分佈式算法。部署多臺Memcached服務器時,鍵分散保存到這些服務器上,當某臺Memcahed服務器發生故障沒法鏈接時,只要分散到這臺服務機器上key/values對不能訪問,其餘key/value對不受影響。

 目前有兩種分佈式算法使用的最多,一種是根據餘數來計算分佈,另一種是根據一致性哈希算法來計算分佈。根據餘數分佈式算法實現求得鍵的整數哈希值,再除以以服務器臺數,根據餘數來選擇將鍵存放到哪臺服務器上。這種方法雖然計算簡單,效率很高,但在服務器增長或減小時,會致使幾乎全部的緩存失敗,因此在大規模部署中,不多使用這個種方法,通常採用一致性HASH算法,原理如圖下首先算出Memcached服務器(節點)的哈希值,並將其分散到0~2的32次方的圓上,而後用一樣的方法算出存儲數據的鍵的哈希值並映射到圓上,而後從數據映射到位置開始順時針查找,將數據保存到查找到的第一個服務器上。若是超過232仍然找不到服務器,就會將數據保存到第一臺Memcached服務器上。

wKioL1i080nwgl-bAALPLq2v1OU376.png-wh_50

當須要添加一臺Memcached服務器時,因爲保存鍵的服務器的個數發生了變化,所以餘數結果也會發生巨大的變化,幾乎全部的鍵都找不到以前存入的服務器,致使全部的緩存失效。但在採用一致性哈希算法時,添加服務器後,只有在圓上增長服務器地點的逆時針方向的第一臺服務器上的鍵會受到影響如圖下所示:

wKiom1i084qDtQHJAAMJ_N-3PWk296.png-wh_50

wKiom1i089WjBZHoAAHedgm5kcw089.png-wh_50

 一致性哈希算法對數據的存儲是不均勻的,但能夠最大限度的減小緩存的失效量。在大規模部署的Memcached時,容災和擴容必定要使用一致性哈希算法,以確保再出現故障或容量問題時減小對數據庫的影響。

持久化儲存工具:

1)memcachedb

wKioL1i09CLg4cOzAAIelXBlrKs947.png-wh_50

wKiom1i09FfBKblDAACzxLYuizE841.png-wh_50

2.TOKYO tyrant(2000萬)

TOKYO tyrant:它是日本最大的SNS社交萬展mixijp開發的Tokyo Cabinet key-value數據庫網絡接口,它擁有Memcache的兼容協議,也也能夠經過HTTP協議進行數據交換。對任何原有Memcached客戶端來說能夠將Tokyo Tyrant當作是一個Memcached,可是,它的數據是能夠持久化存儲的。Tokyo Tyrant 具備故障轉移,日誌文件體積小,大數據量下表現出色等優點,詳見:

http://blog.s135.com/post/362.htm

wKioL1i09J7zxbWeAATUhj8sUrM565.png-wh_50

3.HandlerSocket(Mysql插件)

http://database.51cto.com/art/201105/261741htm



分佈式memcached集羣

1.一致性HASH算法分享。

2.Nginx HASH適合Mc。(mc的代理模塊這樣的,tengine 一致性HASH模塊)。

1.5Memcached管理

1.5.1經過端口管理Memcached

(1)經過在命令行執行telnet ip port 方式能夠登陸到Memcached


(2)命令直接操做,nc這樣的命令。

若是寫腳本經過nc檢查端口並監控memcache服務能夠用下面的方法:

a.memcached監控腳本:

wKioL1i09RKgu30zAAIYWlWvVv0151.png-wh_50


b.經過nc查看memcached狀態

wKiom1i09UPwO-2QAAD96jHi1gw103.png-wh_50

c.安裝memadmin管理客戶端


上傳到lnmp的服務器上上傳到nginx下面的服務器下面,而後在進行解壓就好了

而後在uri的地方寫上memadmin

wKioL1i09a3Bk3DkAAK4kOHmYp8987.png-wh_50

wKiom1i09dLxi77pAAGZE3kzBF8543.png-wh_50

1.6Memcached的監控

部署好Memcached以後,須要對Memcached的使用狀況進行跟蹤:監控Memcached的狀態信息,內存使用狀況,hit/miss值是多少。經過對Memcached監控不只能馬上了解Memcached出現問題,還可以利用狀態信息來分析業務數據的增加併爲將來的容量規劃提供依據。

監控Memcached的工具不少,當前的經常使用監控工具備:memcache.php,Nagios和cacti,下面分別對三種監控方法進行介紹

1.6.1利用memcache.php對單臺memcached進行監控

利用php進行監控室最簡單的監控方法,只要機器上支持PHP環境便可。這種監控的執行過程是:

把這個文件放到能夠訪問的目錄下而後對這個memcache.php文件進行修改,下載此文件地址以下:

http://livebookmark.net/memcachephp/memcachephp.zip

相關文章
相關標籤/搜索