memcached

memcached介紹

memcached是一款開源的、高性能的純內存緩存服務軟件。Mem是內存的意思,cache是緩存的意思,ddaemon的意思。

memcache 是項目名稱,也是一款軟件,其架構是C/S架構。

memcached官網:http://memcached.org/

memcache優點

1、於用戶來講,用戶訪問網站更快了,體驗更好了。

2、對網站來說,數據庫壓力降低了。只有當內存沒有數據時纔會去請求數據庫。第一次寫入的數據也會請求數據庫。一般公司沒有預熱,只有當用戶讀取過數據庫纔會放到Memcached中。

3、提升了網站的併發訪問,減少服務器數量。

Memcached在企業中使用場景

1、作爲數據庫的前端緩存應用

當數據庫(mysql)承受不了大併發的請求時,可以將數據緩存到內存中(緩存數據庫),然後就可以解決作爲數據庫的前端緩存最大目的:減少數據庫被大量訪問的壓力

2、作爲集羣后端的session會話保持

session存儲在文件,數據庫,memcache,或內存等的服務端上,

cookie  存放在客戶端瀏覽器上。

session是一個存在服務器上的類似於一個散列表格的文件。裏面存有我們需要的信息,在我們需要用的時候可以從裏面取出來。

session依賴cookie存在,請求客戶端到達服務端後,服務端會隨機生成一個字符串,作爲該用戶的標識,該字符串通過cookie返回給客戶端,客戶端瀏覽器會以該字符串爲key放到session id裏面,隨機字符串的key裏面可以先沒有值。如果用戶再次提交,請求信息中的用戶名密碼等用戶信息保存在隨機字符串的value中,請求到達服務端,用戶名密碼正確,隨機字符串會被授權,提一個標記給到sessionid中的隨機字符串的value中,證明該用戶已經是登錄狀態,客戶端再次帶着該隨機字符串訪問服務端,服務端會知道該用戶已經登錄不需驗證,直接返回請求的信息。

sessioncookie區別

  1cookie數據存放在用戶的瀏覽器上,session數據存儲在服務器上

  2cookie在本地的瀏覽器中,可以被提取分析,安全性差。爲了安全,登錄賬戶等信息可以緩存在session中。

  3session會在一定時間內保存在服務器上,訪問量增大會給服務器帶來壓力,可以使用緩存工具,如memcache

3、網站開發如何判斷用戶信息

  最開始的技術方法:服務器在你的瀏覽器中寫一個cookies,這個cookies就包含了你的用戶名及登錄信息。因爲cookies是存儲在本地瀏覽器中,所以第三方工具很容易盜取cookies信息。

最開始:

cookies   cookies名字:內容(用戶名,登錄信息)

改進後:

本地瀏覽器存放:

cookies   cookies名字:內容(session id 編號)

服務器存放:

session   session id:內容(用戶名,登錄信息)

主流使用場景:cookies + session

4session共享的不同解決方案

1)session文件提供NFS共享

 2)session文件提供rsync  scp共享

3)session的內容存放在數據庫(mysql)中,所有的機器都可以通過ipport讀取

 4)session的內容存放在緩存數據庫中,所有的機器都可以通過ipport讀取

   好處:利用斷電、重啓丟失數據的特性。定時清理數據;提高併發

5memcache原理優點

  啓動Memcached時,根據指定的內存大小參數,會被分配一個內存空間。當我們讀取數據庫的各類業務數據後,數據會同吋放入Memcached緩存中,,下一次用戶請求同樣的數據,程序直接去Memcached取數據返回給用戶。

優點:

  ①對於用戶來講,用戶訪問網站更快了,體驗更好了。#

  ②對網站來說,數據庫壓力降低了。只有當內存沒有數據時纔會去請求數據庫。第一次寫入的數據 也會請求數據庫。一般公司沒有預熱,只有用戶讀取過數據庫纔會放到Memcached中。

③提升了網站的併發訪問,減少服務器數最。

Memcached分佈式緩存集羣  

memcached天生不支持分佈式集羣,需要通過程序支持分佈式存儲

Memcached分佈式緩存集羣的特點

1. 所有MC服務器內存的內容都是不一樣的。這些服務器內容加起來接近數據庫的容量。比如1T的數據庫,一臺緩存數據庫的內存沒有那麼大,因此分成10臺緩存服務器。

2. 通過在客戶端(Web)程序或者MC的負載均衡器上用HASH算法,讓同一內容都分配到一個MC服務器。

3. 普通的HASH算法對於節點宕機會帶來大量的數據流動(失效),可能會引起雪崩效應。

4. 一致性HASH可以讓節點宕機對節點的數據流動(失效)降到最低。

普通的hash算法

先將key處理爲一個32位字符串,取前8位,在經過hash計算處理成整數並返回,然後映射到其中一臺服務器這樣得到其中一臺服務器的配置,利用這個配置完成分佈式部署。在服務器數量不發生變化的情況下,普通hash分佈可以很好的運作,當服務器的數量發生變化,問題就來了。試想,增加一臺服務器,同一個key經過hash之後,與服務器取模的結果和沒增加之前的結果肯定不一樣,這就導致了,之前保存的數據丟失。

一致性哈希算法

優點:在分佈式的cache緩存中,其中一臺宕機,遷移key效率最高

將服務器列表進行排序,根據mHash($key) 匹配相鄰服務器

一致性hash算法將數據流動降到最低

安裝memcached服務

1、安裝libevent及連接memcached工具nc

[root@mysql-server ~]# rpm -qa libevent libevent-devel nc
libevent-1.4.13-4.el6.x86_64
[root@mysql-server ~]# yum install libevent libevent-devel nc –y
[root@mysql-server ~]# rpm -qa libevent libevent-devel nc
libevent-devel-1.4.13-4.el6.x86_64
nc-1.84-24.el6.x86_64
libevent-1.4.13-4.el6.x86_64

2、安裝memcached

[root@mysql-server ~]# yum install memcached -y
[root@mysql-server ~]# rpm -aq memcached      
memcached-1.4.4-5.el6.x86_64

也可以編譯安裝高版本的

Memcached服務的基本管理

1、啓動memcached

[root@mysql-server ~]# which memcached
/usr/bin/memcached
[root@mysql-server ~]# memcached -m 16m -p 11211 -d -u root -c8192  #啓動第一個實例
[root@mysql-server ~]# lsof -i:11211
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
memcached 12185 root   26u  IPv4  60172      0t0  TCP *:memcache (LISTEN)
memcached 12185 root   27u  IPv6  60173      0t0  TCP *:memcache (LISTEN)
memcached 12185 root   28u  IPv4  60176      0t0  UDP *:memcache
memcached 12185 root   29u  IPv6  60177      0t0  UDP *:memcache
[root@mysql-server ~]# ps -ef|grep memcached|grep -v grep
root      12185      1  0 17:44 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c8192

也可以啓動多實例

[root@mysql-server ~]# memcached -m 16m -p 11212 -d -u root -c8192   #啓動第二個實例
[root@mysql-server ~]# ps -ef|grep memcached|grep -v grep        
root      12185      1  0 17:44 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c8192
root      12196      1  0 17:47 ?        00:00:00 memcached -m 16m -p 11212 -d -u root -c8192

2memcached 啓動命令相關參數

參數詳解:

 

-p <num>      監聽的TCP端口(默認: 11211)

-U <num>      監聽的UDP端口(默認: 11211, 0表示不監聽)

-s <file>     用於監聽的UNIX套接字路徑(禁用網絡支持)

-a <mask>     UNIX套接字訪問掩碼,八進制數字(默認:0700

-l <ip_addr>  監聽的IP地址。(默認:INADDR_ANY,所有地址)

-d            作爲守護進程來運行

-r            最大核心文件限制

-u <username> 設定進程所屬用戶。(只有root用戶可以使用這個參數)

-m <num>      所有slab class可用內存的上限,以MB爲單位。(默認:64MB

              (譯者注:也就是分配給該memcached實例的內存大小。)

-M            內存用光時報錯。(不會刪除數據)

-c <num>      最大併發連接數。(默認:1024

-k            鎖定所有內存頁。注意你可以鎖定的內存上限。

              試圖分配更多內存會失敗的,所以留意啓動守護進程時所用的用戶可分配的內存上限。

              (不是前面的 -u <username> 參數;在sh下,使用命令"ulimit -S -l NUM_KB"來設置。)

-v            提示信息(在事件循環中打印錯誤/警告信息。)

-vv           詳細信息(還打印客戶端命令/響應)

-vvv          超詳細信息(還打印內部狀態的變化)

-h            打印這個幫助信息並退出

-i            打印memcachedlibevent的許可

-P <file>     保存進程ID到指定文件,只有在使用 -d 選項的時候纔有意義

-f <factor>   不同slab class裏面的chunk大小的增長倍率。(默認:1.25

              (譯者注:每個slab class裏面有相同數量個slab page,每個slab page裏面有chunk,且在當前slab class內的chunk大小固定。

              而不同slab class裏的chunk大小不一致,具體差異就是根據這個參數的倍率在增長,直到分配的內存用盡。)

-n <bytes>    chunk的最小空間(默認:48

              (譯者注:chunk數據結構本身需要消耗48個字節,所以一個chunk實際消耗的內存是n+48)

-L            嘗試使用大內存頁(如果可用的話)。提高內存頁尺寸可以減少"頁表緩衝(TLB"丟失次數,提高運行效率。

              爲了從操作系統獲得大內存頁,memcached會把全部數據項分配到一個大區塊。

-D <char>     使用 <char> 作爲前綴和ID的分隔符

              這個用於按前綴獲得狀態報告。默認是":"(冒號)

              如果指定了這個參數,則狀態收集會自動開啓;如果沒指定,則需要用命令"stats detail on"來開啓。

-t <num>      使用的線程數(默認:4

-R            每個連接可處理的最大請求數

-C            禁用CAS

-b            設置後臺日誌隊列的長度(默認:1024

-B            綁定協議 - 可能值:ascii,binary,auto(默認)

-I            重寫每個數據頁尺寸。調整數據項最大尺寸

3、向memcached中寫入數據並檢查

[root@mysql-server ~]# printf "set key1 0 0 6\r\noldboy\r\n"|nc 127.0.0.1 11211
STORED    #出現STORED表示成功添加key1及對應的數據


如果set命令的字節是6,那麼後面就要6個字符。否則插入數據會失敗

[root@mysql-server ~]# printf "set key2 0 0 5\r\noldboy\r\n"|nc 127.0.0.1 11211 
CLIENT_ERROR bad data chunk
ERROR

通過printf配合ncmemcached中讀取數據

[root@mysql-server ~]# printf "get key1\r\n"|nc 127.0.0.1 11211
VALUE key1 0 6
oldboy
END

通過printf配合ncmemcached中刪除數據

[root@mysql-server ~]# printf "delete key1\r\n"|nc 127.0.0.1 11211  
DELETED
[root@mysql-server ~]# printf "get key1\r\n"|nc 127.0.0.1 11211  
END

4、通過telnetmemcached中寫入數據

[root@mysql-server ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set user01 0 0 7    #寫入數據
oldgirl
STORED
get user01        #瀏覽
VALUE user01 0 7
oldgirl
END
delete user01       #刪除
DELETED
get user01
END
quit
Connection closed by foreign host.
如果輸入字符錯了,可以通過ctrl+backspace刪除


5、操作memcached相關命令的語法

圖片.png

6、關閉memcached

單實例關閉

[root@mysql-server ~]# killall memcached或者pkill memcached
[root@mysql-server ~]# ss -lnt |grep 11211

多實例關閉

[root@mysql-server ~]# memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid
[root@mysql-server ~]# memcached -m 16m -p 11212 -d -u root -c 8192 -P /var/run/11212.pid
[root@mysql-server ~]# ps -ef|grep memcache|grep -v grep
root      12264      1  0 23:42 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid
root      12271      1  0 23:42 ?        00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192 -P /var/run/11212.pid
[root@mysql-server ~]# kill `cat /var/run/11211.pid`
[root@mysql-server ~]# lsof -i:11211
[root@mysql-server ~]# lsof -i:11212
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
memcached 12271 root   26u  IPv4  60796      0t0  TCP *:11212 (LISTEN)
memcached 12271 root   27u  IPv6  60797      0t0  TCP *:11212 (LISTEN)
memcached 12271 root   28u  IPv4  60800      0t0  UDP *:11212
memcached 12271 root   29u  IPv6  60801      0t0  UDP *:11212
[root@mysql-server ~]# ps -ef|grep memcache|grep -v grep|awk '{print $2}'|xargs kill

memcached應用管理

1、通過命令管理

amemcached服務是否異常的監控腳本

b)通過nc命令查看memcached服務的運行狀態信息

[root@mysql-server ~]# printf "stats\r\n"|nc 127.0.0.1 11211

c)也可通過telnet監聽端口,執行stats命令查看

[root@mysql-server ~]# telnet  127.0.0.1 11211             
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats   
STAT pid 12321
STAT uptime 161
STAT time 1525362977
STAT version 1.4.4
…(略)


memcached狀態命令的說明

stats        統計memcached的各種信息

stats setting  查看一些memcached的設置信息,例如:線程數

stats slabs    查看slabs相關情況,例如:chunksize長度

stats items    查看items相關情況

stats sizes    查看items個數和大小

stats reset    清理統計數據

 

memcached狀態信息詳細說明

STAT pid 20487               ## memcache 進程PID

STAT uptime 1977637         ## memcache啓動以來,服務器運行秒數

STAT time 1461202739       ## 服務器當前unix時間戳

STAT version 1.4.21      ## memcache 服務器版本

STAT libevent 1.4.13-stable      ## libevent 版本

STAT pointer_size 64      ##  架構(32 64 位)

STAT rusage_user 150.835069      ## 進程累計用戶時間

STAT rusage_system 249.086133      ## 進程累計系統時間

STAT curr_connections 10      ## 當前打開連接數

STAT total_connections 5509      ## memcache啓動以來,打開的連接總數

STAT connection_structures 11      ## 服務器分配的連接結構數

STAT reserved_fds 40      ##

STAT cmd_get 8913248      ## memcache啓動以來,執行get命令總數

STAT cmd_set 123382      ## memcache啓動以來,執行set命令總數

STAT cmd_flush 0      ## memcache啓動以來,執行flush命令總數

STAT cmd_touch 0      ## memcache啓動以來,執行touch_all命令總數

STAT get_hits 8913074      ## memcache啓動以來,get命中次數

STAT get_misses 174      ## memcache啓動以來,get未命中次數

STAT delete_misses 0      ## memcache啓動以來,delete未命中次數

STAT delete_hits 0      ## memcache啓動以來,delete命中次數

STAT incr_misses 0      ## memcache啓動以來,incr未命中次數

STAT incr_hits 0      ## memcache啓動以來,incr命中次數

STAT decr_misses 0      ## memcache啓動以來,decr未命中次數

STAT decr_hits 0      ## memcache啓動以來,decr命中次數

STAT cas_misses 0      ## memcache啓動以來,cas未命中次數

STAT cas_hits 0      ## memcache啓動以來,cas命中次數

STAT cas_badval 0      ## 使用擦拭次數

STAT touch_hits 0      ## memcache啓動以來,touch命中次數

STAT touch_misses 0      ## memcache啓動以來,touch未命中次數

STAT auth_cmds 0      ##

STAT auth_errors 0      ##

STAT bytes_read 111225505      ## memcached服務器從網絡讀取的總的字節數

STAT bytes_written 3621054898      ## memcached服務器發送到網絡的總的字節數

STAT limit_maxbytes 33554432      ## memcached服務緩存允許使用的最大字節數(分配的內存數)

STAT accepting_conns 1      ## 目前接受的鏈接數

STAT listen_disabled_num 0      ##

STAT threads 8      ## 被請求的工作線程的總數量

STAT conn_yields 0      ## 連接操作主動放棄數目

STAT hash_power_level 16      ##

STAT hash_bytes 524288      ##

STAT hash_is_expanding 0      ##

STAT malloc_fails 0      ##

STAT bytes 384154      ## 存儲item字節數(當前存儲佔用的字節數)

STAT curr_items 856      ## item個數(當前存儲的數據總數)

STAT total_items 123382      ## item總數(啓動以來存儲的數據總數)

STAT expired_unfetched 0      ##

STAT evicted_unfetched 0      ##

STAT evictions 0      ## LRU釋放的對象數目。爲了給新的數據項目釋放空間,從緩存移除的緩存對象的數目。比如超過緩存大小時根據LRU算法移除的對象,以及過期的對象

STAT reclaimed 0      ## 已過期的數據條目來存儲新數據的數目

STAT crawler_reclaimed 0      ##

STAT lrutail_reflocked 0      ##

 

2、通過memadmin php工具展示狀態信息

下載 memadmin-1.0.12.tar.gz

tar xf memadmin-1.0.12.tar.gz

mv memadmin /application/nginx/html/blog/

瀏覽地址:http://xxxxxxx/memadmin/

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章