memcached介紹
memcached是一款開源的、高性能的純內存緩存服務軟件。Mem是內存的意思,cache是緩存的意思,d是daemon的意思。
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中,證明該用戶已經是登錄狀態,客戶端再次帶着該隨機字符串訪問服務端,服務端會知道該用戶已經登錄不需驗證,直接返回請求的信息。
session和cookie區別
1、cookie數據存放在用戶的瀏覽器上,session數據存儲在服務器上
2、cookie在本地的瀏覽器中,可以被提取分析,安全性差。爲了安全,登錄賬戶等信息可以緩存在session中。
3、session會在一定時間內保存在服務器上,訪問量增大會給服務器帶來壓力,可以使用緩存工具,如memcache等
3、網站開發如何判斷用戶信息
最開始的技術方法:服務器在你的瀏覽器中寫一個cookies,這個cookies就包含了你的用戶名及登錄信息。因爲cookies是存儲在本地瀏覽器中,所以第三方工具很容易盜取cookies信息。
最開始:
cookies cookies名字:內容(用戶名,登錄信息)
改進後:
本地瀏覽器存放:
cookies cookies名字:內容(session id 編號)
服務器存放:
session session id:內容(用戶名,登錄信息)
主流使用場景:cookies + session
4、session共享的不同解決方案
1)session文件提供NFS共享
2)session文件提供rsync scp共享
3)將session的內容存放在數據庫(mysql)中,所有的機器都可以通過ip:port讀取
4)將session的內容存放在緩存數據庫中,所有的機器都可以通過ip:port讀取
好處:利用斷電、重啓丟失數據的特性。定時清理數據;提高併發
5、memcache原理優點
啓動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
2、memcached 啓動命令相關參數
參數詳解:
-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 打印memcached和libevent的許可
-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配合nc從memcached中讀取數據
[root@mysql-server ~]# printf "get key1\r\n"|nc 127.0.0.1 11211 VALUE key1 0 6 oldboy END
通過printf配合nc從memcached中刪除數據
[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、通過telnet向memcached中寫入數據
[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相關命令的語法
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、通過命令管理
a)memcached服務是否異常的監控腳本
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/