Memcached內存緩存技術

Memcached是什麼,有什麼做用?

Memcached是一個開源的、高性能的內存緩存軟件,從名稱上看Mem就是內存的意思,而Cache就是緩存的意思。
Memcached經過在事先規劃好的內存空間中臨時緩存數據庫中的各種數據,以減小業務直接對數據庫的訪問,從而減輕數據庫的訪問壓力和網站集羣的響應速度。

Memcached服務在企業集羣架構中應用場景

1.做爲數據庫的前端緩存應用php

完整緩存(易):例如商品分類,以及商品信息,可實現放到內存裏,而後再對外提供數據訪問。這個被稱之爲預熱。用戶訪問時能夠只讀取memcached緩存,不讀取數據庫了。html

熱點緩存(難):須要前端程序配合。只緩存熱點的數據,即緩存常常被訪問的數據。先預熱基礎數據,而後再動態更新。程序先讀取緩存,若是緩存裏沒有對應的數據,程序再去讀取數據庫,而後程序把讀到的數據放入緩存。前端

特殊說明:
若是碰到電商秒殺等高併發的業務,必定要事先預熱,或者其餘思想實現,例如:秒殺只是獲取資格,而不是瞬間秒殺到手商品。若是數據更新,要同時觸發緩存更新,防止給用戶過過時數據。

2.做爲集羣的session會話共享存儲ios

優勢:速度比files塊,能夠解決共用session問題
缺點:不能持久化,只能單點部署,多點數據沒法同步,即便用hash分配節點,也會有session丟失

 Memcached服務在不一樣企業業務應用場景中的工做流程

1.當web程序須要訪問後端數據庫獲取數據時會優先訪問Memcached內存緩存,若是緩存中有數據就直接獲取返回前端服務及用戶,若是沒有數據(未命中),再由程序請求後端的數據庫服務器,獲取到對應的數據後,除了返回給前端服務及用戶數據外,還會把數據放到Memcached內存中進行緩存,等待下次被訪問。Memcahced內存始終是數據庫的擋箭牌,從而大大的減輕數據庫的訪問壓力,提升整個網站架構的響應速度,提高了用戶體驗。nginx

2.當程序更新,修改或刪除數據庫中已有的數據時,會同時發送請求通知Memcached已經緩存過的同一個ID內容的舊數據失效,從而保證Memcahce中的數據和數據庫中的數據保持一致。若是是在高併發場合,除了通知Memcached過時的緩存失效外,還會經過相關機制,使得在用戶訪問新數據前,經過程序預先把更新過的數據推送到memcached中緩存起來,這樣能夠減小數據庫的訪問壓力,提高memcached中緩存的命中率。web

3.數據庫插件能夠在寫入更新數據庫後,自動拋給MC緩存起來,自身不Cache算法

Memcached服務分佈式集羣如何實現?

1.程序端實現sql

程序加載全部mc的ip列表,經過對key作hash(一致性哈希),從而映射到某一臺mc,相同的key永遠映射到同一臺的mc。 Hash就是將任意長度的輸入轉化成固定長度的輸出。
一致性哈希的目的:不但保證每一個對象只請求一個對應的服務器,同時保證當某個節點宕機,緩存服務器的更新從新分配比例降到最低。
2.負載均衡器實現:由負載均衡器來作hash
 
特殊說明:memcached集羣和web服務集羣是不同的,全部memcached數據總和纔是數據庫的數據。每臺memcached只有一部分數據。

Memcached服務特色及工做原理是什麼?

a.節點之間相互獨立
b.數據是以key/value對形式存在的
c.C/S模式架構,C語言編寫,總共代碼2000多行
d.異步I/O模型,使用libevent事件通知機制
e.所有數據放入內存,無持久性設計,重啓服務數據丟失  (缺點)
f.當內存中緩存的數據容量達到啓動時設定的內存值時,自動使用LRU算法刪除過時的緩存數據
g.能夠對存儲的數據設置過時時間,這樣過時後數據自動被清除,服務自己不會監控過時,而是在訪問的時候查看key的時間戳判斷是否過時
h.memcached內存分配機制是對特定的內存進行分塊,再把多個塊分爲組

Memcached內存管理機制原理

malloc的全稱是memory allocation,中文叫動態內存分配,當沒法知道內存具體位置的時候,想要綁定真正的內存空間,就須要用到動態的分配內存。
早期的memcached內存管理方式是經過malloc分配的內存,使用完後經過free來回收內存。這種方式容易產生內存碎片並下降操做系統對內存的管理效率。加劇操做系統內存管理器的負擔,最壞的狀況下,會致使操做系統比memcached進程自己還慢,爲了解決上述問題,Slab Allocator內存分配機制就產生了
如今的memcached就是利用Slab Allocation機制來分配和管理內存。
Slab Allocation機制原理是按照預先規定的大小,將分配給memcached的內存分割成特定長度的內存塊chunk,再把 尺寸相同的內存塊分紅組(chunks slab class),這些內存塊不會釋放,能夠重複利用。

Memcached服務器端中保存着slab class中空閒chunk個數的列表,根據該列表選擇chunk,而後將數據緩存於其中。當有數據存入時,Memcached根據接收到的數據大小,分配一個能存下這個數據的最小內存塊chunk。可是缺點在於因爲分配的chunk大小是固定的,因此會有部分空間被浪費。數據庫

避免浪費的辦法是,預先計算出應用存入的數據大小或把同一業務類型的數據存入一個Memcached服務器中,確保存入的數據大小相對均勻。同時使用-f<factor> chunk size growth factor增加因子來劃分chunk大小,進行調優。各組之間chunk的大小按照factor對應倍數遞增,factor的默認值是1.25。vim

同時slab allocator還有重複使用已分配的chunk的做用。也就是說,分配到的chunk不會釋放,而是重複利用,用新數據替換舊數據。

Slab主要術語:
Page:分配給Slab的內存空間
Chunk:內存塊
Slab Class:多個特定大小的chunk組成的組,通常也叫slabs

Memcached的刪除原理與刪除機制

Memcached主要的刪除機制是LRU(最近最少用)算法,加上item過時失效。當您存數據到memcached中,能夠指定該數據在緩存中能夠呆多久。若是memcached內存不夠用,過時的數據會優先被替換,接着輪到最老的未被使用的數據。在某些狀況下(完整緩存),若是不想用LRU算法,能夠經過-M參數啓動Memcached,這樣memcached內存耗盡也不會刪除,寧願報錯也不刪除。

Memcached服務端與客戶端的安裝部署與使用測試

#安裝memcached前須要安裝libevent
yum install libevent-devel nc -y
#源碼安裝memcahced
cd /server/tools
wget http://memcached.org/files/memcached-1.4.24.tar.gz
tar xf memcached-1.4.24.tar.gz
cd memcached-1.4.24
./configure --prefix=/application/memcached-1.4.24
make
make install
ln -s /application/memcached-1.4.24/ /application/memcached

#啓動一個Mem實例
/application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192 # 分配的內存 端口 後臺 用戶 最大併發鏈接數
lsof -i :11211
ps -ef | grep memcached | grep -v grep
root       2984      1  0 23:10 ?        00:00:00 /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192

#能夠啓動多個Mem實例
/application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192
ps -ef | grep memcached | grep -v grep
root       2984      1  0 23:10 ?        00:00:00 /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192
root       3036      1  0 23:16 ?        00:00:00 /application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192
 
#加入開機啓動
echo "/application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192" >> /etc/rc.local
echo "/application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192" >> /etc/rc.local

#測試服務端是否正常
[root@nagios tools]# printf "set key1 0 0 5\r\npeter\r\n" | nc 127.0.0.1 11211
STORED
[root@nagios tools]# printf "get key1\r\n" | nc 127.0.0.1 11211
VALUE key1 0 5
peter
END
[root@nagios tools]# printf "delete key1\r\n" | nc 127.0.0.1 11211
DELETED

#客戶端php插件memcache安裝
cd /server/tools/
wget http://pecl.php.net/get/memcache-2.2.7.tgz
tar xf memcache-2.2.7.tgz
cd memcache-2.2.7
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config
make
make install
Installing shared extensions:     /application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
ls -l /application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
total 244
-rwxr-xr-x 1 root root 246696 Sep  1 22:51 memcache.so

vim /application/php/lib/php.ini

; http://php.net/extension-dir
 extension_dir = "/application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/"
 extension=memcache.so

/application/php/sbin/php-fpm -t
pkill php-fpm
/application/php/sbin/php-fpm
ps -ef | grep php-fpm

#http://10.0.0.23/test_info.php

 

#鏈接測試
vim op_mem.php
<?php
        $memcache = new Memcache;
        $memcache->connect('172.16.1.23',11211) or die ("Could not connect Mc server");
        $memcache->set('key','oldboy book');
        $get=$memcache->get('key');
        echo $get;
?>

/application/php/bin/php op_mem.php
oldboy book

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

vim /application/php/lib/php.ini

1458 [Session]
1459 ; Handler used to store/retrieve data.
1460 ; http://php.net/session.save-handler
1461 session.save_handler = memcache           #修改session存儲方式
1462
1463 ; Argument passed to save_handler.  In the case of files, this is the path
1464 ; where data files are stored. Note: Windows users have to change this
1465 ; variable in order to use PHP's session functions.
1466 ;
1467 ; The path can be defined as:
1468 ;
1469 session.save_path = "tcp://172.16.1.23:11211"    #修改session存儲路徑
       
pkill php-fpm
/application/php/sbin/php-fpm

#http://10.0.0.23/test_info.php

 

session同步的多種方式

a. lb層能夠作會話保持,例如:
     lvs -p
     nginx ip_hash
     haproxy cookie insert
     PHP,JAVA均可以用
b. 軟件層,能夠作session複製,例如
     tomcat resin couchbase
c. session共享
      memcache或者其餘nosql工具,PHP經常使用這個
d. 高併發場景:例如門戶網站用cookies或cookies配合session把用戶級會話信息緩存在用戶本地。高併發的場景cookies的效率比session要好不少

 MEMCACHED服務的狀態信息的獲取,例如:命中率

1.經過memcache命令
printf "stats\r\n" | nc 127.0.0.1 11211     #Memcached各類狀態信息
STAT pid 41346                              #PID
STAT uptime 4759                            #服務已運行秒數
STAT time 1505572559                        #服務當前UNIX時間戳
STAT version 1.4.24                         #Memcached版本
STAT libevent 1.4.13-stable                 #libevent版本
STAT pointer_size 64                        #操做系統指針大小
STAT rusage_user 0.121981                   #進程累計用戶時間
STAT rusage_system 0.112982                 #進程累計系統時間
STAT curr_connections 10                    #當前鏈接數
STAT total_connections 14                   #服務運行以來總鏈接數
STAT connection_structures 11               #服務分配的鏈接結構數量
STAT reserved_fds 20                        #內部使用的FD數
STAT cmd_get 1                              #get請求次數
STAT cmd_set 1                              #set請求次數
STAT cmd_flush 0                            #flush請求次數
STAT cmd_touch 0                            #touch請求次數
STAT get_hits 1                             #get命中次數
STAT get_misses 0                           #get未命中次數
STAT delete_misses 0                        #delete未命中次數
STAT delete_hits 1                          #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                           #cas使用擦拭次數
STAT touch_hits 0                           #touch命中次數
STAT touch_misses 0                         #touch未命中次數
STAT auth_cmds 0                            #認證命令處理次數
STAT auth_errors 0                          #認證命令失敗次數
STAT bytes_read 53                          #讀取總字節數
STAT bytes_written 45                       #寫入總字節數
STAT limit_maxbytes 16777216                #分配內存總大小(字節)
STAT accepting_conns 1                      #接受新的鏈接
STAT listen_disabled_num 0                  #失效的監聽數
STAT threads 4                              #當前線程數
STAT conn_yields 0                          #鏈接操做主動放棄數目
STAT hash_power_level 16                    #hash表等級
STAT hash_bytes 524288                      #hash表大小
STAT hash_is_expanding 0                    #hash表正在擴展
STAT malloc_fails 0                         #分配內存失敗的數目
STAT bytes 0                                #已過時但未獲取的對象數目
STAT curr_items 0                           #當前的對象數目
STAT total_items 1                          #當前存儲佔用的字節數
STAT expired_unfetched 0                    #已過時但未獲取的對象數目
STAT evicted_unfetched 0                    #已驅逐但未獲取的對象數目
STAT evictions 0                            #LRU釋放的對象數目
STAT reclaimed 0                            
STAT crawler_reclaimed 0                    
STAT crawler_items_checked 0                    
STAT lrutail_reflocked 0
END

[root@nagios ~]# printf "stats settings\r\n" | nc 127.0.0.1 11211     #Memcached設置信息
[root@nagios ~]# printf "stats slabs\r\n" | nc 127.0.0.1 11211        #查看slabs相關信息
[root@nagios ~]# printf "stats items\r\n" | nc 127.0.0.1 11211        #查看items相關信息
[root@nagios ~]# printf "stats sizes\r\n" | nc 127.0.0.1 11211        #查看items的大小和個數
[root@nagios ~]# printf "stats reset\r\n" | nc 127.0.0.1 11211        #清理統計數據

#訪問測試
[root@nagios nginx]# printf "stats\r\n" | nc 127.0.0.1 11211 | grep get
STAT cmd_get 1
STAT get_hits 1
STAT get_misses 0

[root@nagios nginx]# printf "get key1\r\n" | nc 127.0.0.1 11211
END

[root@nagios nginx]# printf "stats\r\n" | nc 127.0.0.1 11211 | grep get
STAT cmd_get 2
STAT get_hits 1
STAT get_misses 1

2.經過Memcached管理工具Memadmin展現

#Memadmin是基於PHP和JQuery的Memcached管理監控工具
cd /server/tools
wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz
tar xf memadmin-1.0.12.tar.gz
mv memadmin /application/nginx/html/www/

#http://10.0.0.88/memadmin

 

經過Nagios監控Memcached

1.監控指標:

端口

命名率

響應時間

模擬用戶存取

2.Nagios插件開發

#模擬用戶進行存取,測試memcached的狀態
vim check_mc.sh
[ $# -ne 2 ] && {
     echo "$0 ip port"
     exit
}
#!/bin/bash
ServerIP=$1
ServerPort=$2
cmd="nc $ServerIP $ServerPort"
printf "delete key\r\n" | $cmd > /dev/null 2>&1
sleep 1
printf "set key 0 0 5\r\npeter\r\n" | $cmd > /dev/null 2>&1
if [ `printf "get key\r\n" | $cmd | grep peter | wc -l` -eq 1 ];then
    echo "mc is alive."
    exit 0
else
    echo "mc is dead."
    exit 2
fi

[root@nagios ~]# sh check_mc.sh 127.0.0.1 11211
mc is alive.
相關文章
相關標籤/搜索