memcached部署
第1章 memcached
1 memcached前言
1.1 memcached誕生的原因
2003年誕生了memcached
Web1.0 2005以前 企業提供內容為主。
Web2.02005-2012 企業只提供平臺,用戶參與上傳下載內容。
memcached 內存緩存軟件,內存比磁盤快。
傳統場景中,多數web應用都將數據保存在關系型數據庫中(如mysql),web服務器從中讀取數據並在瀏覽器中顯示。但是隨著數據量增大,訪問的集中,關系型數據庫的負擔就會加重,響應緩慢,導致網站打開延遲等問題,影響用戶體驗。
1.2 memcached的作用
解決高並發訪問的問題,減輕傳統數據庫mysql的壓力。
不關註數據可靠性,只關心高並發讀寫
使用memcached的重要目的是通過自身內存中緩存關系型數據庫的查詢結果,減少數據庫被訪問的次數,提高動態web應用的速度,提高網站架構的並發能力和可擴展性。
memcached服務的運行工作原理:通過事先規劃好的系統內存空間中臨時緩存數據庫中的各類數據,以達到減少前端業務服務對數據庫的直接高並發訪問,從而提升大規模網站集群中動態服務的並發能力。
生產場景中的memcached服務一般用來保存網站中被經常讀取的對象或數據,就像客戶端瀏覽器會把經常訪問的網頁緩存起來,通過內存緩存來存取對象或數據要比磁盤存取快很多,因為磁盤是機械的。
2 memcached的特點與工作機制
2.1 memcached的特點
協議簡單。
采用的是基於文本行的協議,能通過Telnet/nc等命令直接操作memcached服務存取數據。
支持epoll/kqueue異步I/O模型,使用libevent作為事件處理通知機制。
采用key/value鍵值形式存在。
全內存緩存,效率高。
memcached管理內存的方式非常高效,即全部的數據都存放於memcached服務預先分配好的內存中,無持久化存儲的設計,和系統的物理內存一樣,當重啟memcached或系統時,memcached內存中的數據就會丟失。
如果希望重啟後,數據依然能保存,那麽就可以采用redis這樣的持久性內存緩存系統。
可支持分布式集群。
memcached沒有向
memcached工作原理與機制
memcached是一套類似於C/S模式架構的軟件,在服務器端啟動memcached守護進程,可以指定監聽本地的IP地址,端口號,並發訪問連接數,以及分配了多少內存來處理客戶端請求。
socket事件處理機制
數據存儲機制
內存管理機制
多線程處理機制
2.2memcached常見用途工作流程
網站讀取memcached數據時的工作流程
web程序首先檢查客戶端請求的數據是否在memcached緩存中存在,如果存在,直接把請求的數據返回給客戶端,此時不再請求後端數據庫。
如果請求的數據在memcached緩存中不存在,則程序會去請求數據庫服務,把從數據庫中取到的數據返回給客戶端,同時把新取到的數據緩存一份到memcached緩存中。
2.3.網站更新memcached數據時的工作流程
具體流程如下:
當程序更新或刪除數據時,會首先處理後端數據庫中的數據。
在處理後端數據庫中數據的同時,也會通知memcached,告訴他對應的舊數據失效,從而保證memcached中緩存的數據始終和數據庫中一致,這個數據一致性非常重要,也是大型網站分布式緩存集群最頭疼的問題所在。
如果是在高並發讀寫場合,除了要程序通知memcached過期的緩存失效外,還可能要通過相關機制,例如在數據庫上部署相關程序(如在數據庫中設置觸發器使用UDFs),實現當數據庫有更新時就把數據庫更新到memcached服務中,這樣一來,客戶端在訪問新數據時,因預先把更新過的數據復制到memcached中緩存起來了,所以可以減少第一次查詢數據庫帶來的訪問壓力,提升memcached中緩存的命中率,甚至新浪門戶網站還會把持久化存儲redis做成mysql數據庫的從庫,實現真正的主從復制。
2.4.memcached在企業中的應用場景
數據庫前端的緩存。
讀數據:
開發程序從邏輯上,首先訪問(讀)memcahced,如果沒有數據在訪問mysql。
寫數據:
如果寫數據,那麽再寫數據庫的同時,把數據寫入到memcached,或者寫入到mysql的同時,由mysql復制到memcached。
Linux運維角色:
搭建memcached服務,提供服務(使用信息問開發)
1.3.2.2 集群後端的共享會話session。
session門票。如果網站內有了這個門票,就可以瀏覽任意頁面。
解決共享會話方案
1、nginx的調度算法ip_hash(缺點:導致負載不均)
2、通過memcahced做共享會話。
3、cookies(放在用戶瀏覽器端)。
優點,可以大並發,缺點:容易篡改,不安全。
參考內容:
http://oldboy.blog.51cto.com/2561410/1331316
http://oldboy.blog.51cto.com/2561410/1323468
第2章 memcached服務安裝
2.1 安裝livevent及連接memcached工具nc
2.1.1 準備環境及libevent安裝
[[email protected] ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[[email protected] ~]# uname -r
2.6.32-642.el6.x86_64
[[email protected] ~]# uname -m
x86_64
[[email protected] ~]#
yum install libevent-devel -y
rpm -qa libevent-devel
2.1.2 安裝memcached
yum install memcached -y
rpm -qa memcached
2.1.3 啟動memcached服務
[[email protected] ~]# memcached -m 16m -c2048 -u root -p 11211 -d
[[email protected] ~]# netstat -lntp|grepmemcache
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 4026/memcached
tcp 0 0 :::11211 :::* LISTEN 4026/memcached
2.1.3.1memcached啟動命令相關參數說明
2.1.4 向memcached中寫入數據並檢查
2.1.4.1向memcached中寫入數據實戰
通過Telnet命令寫入數據
安裝Telnet工具
yum install telnet nc -y
telnet 127.0.0.1 11211
通過Telnet向memcached中寫入數據。
[[email protected] ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
set k1 0 0 6
oldboy
STORED
get k1
VALUE k1 0 6
oldboy
END
delete k1
DELETED
get k1
END
通過printf配合nc向memcached中寫入數據,命令如下:
printf "set key008 0 06\r\noldboy\r\n"|nc 127.0.0.1 11211
printf "set key008 0 010\r\noldboy0987\r\n"|nc 127.0.0.1 11211
通過printf配合nc向memcached中刪除數據,命令如下
printf "delete key008 0 06\r\noldboy\r\n"|nc 127.0.0.1 11211
2.2 客戶端軟件安裝
php所在服務器上安裝memcache客戶端,程序才能訪問到memcached。
2.2.1 解壓編譯安裝
tar zxf memcache-2.2.5.tgz
cd memcache-2.2.5
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config
make
make install
cd ../
ls -l/application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
註意:有時候make安裝時會出現下面的錯誤,這時候執行make clean即可
2.2.1.1make、clean、distclean的用法講解
makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因為 makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。
makefile帶來的好處就是--“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,VisualC++的nmake,Linux下GNU的make.可見,makefile都成為了一種在工程方面的編譯方法。
make
根據Makefile文件編譯源代碼、連接、生成目標文件、可執行文件。
make clean
清除上次的make命令所產生的object文件(後綴為“.o”的文件)及可執行文件。
make install
將編譯成功的可執行文件安裝到系統目錄中,一般為/usr/local/bin目錄。
make dist
產生發布軟件包文件(即distribution package)。這個命令將會將可執行文件及相關文件打包成一個tar.gz壓縮的文件用來作為發布軟件的軟件包。
它會在當前目錄下生成一個名字類似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。
make distcheck
生成發布軟件包並對其進行測試檢查,以確定發布包的正確性。這個操作將自動把壓縮包文件解開,然後執行configure命令,並且執行make,來確認編譯不出現錯誤,最後提示你軟件包已經準備好,可以發布了。
make distclean
類似make clean,但同時也將configure生成的文件全部刪除掉,包括Makefile文件。
2.2.2 配置PHP訪問memcached
配置:
vim /application/php/lib/php.ini ##最後一行追加兩行下面內容
extension_dir = "/application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/"
extension = memcache.so
重啟Php
pkill php-fpm
/application/php/sbin/php-fpm
2.2.3 編寫測試memcached服務的PHP腳本
[[email protected] php]# cat/application/nginx/html/blog/a.php
<?php
phpinfo();
?>
通過頁面:blog.etiantian.org/a.php檢查mc的配置情況。
搜索memcache頁面內容,如果有結果,表示成功。
補充:開發php訪問memcached代碼
<?php
$memcache = new Memcache;
$memcache->connect(‘10.0.0.51‘, 11211) or die ("Could notconnect Mc server");
$memcache->set(‘key‘, ‘oldboy book‘);
$get= $memcache->get(‘key‘);
echo $get;
?>
2.3 通過memcached php工具展示memcached狀態信息
2.3.1 部署memcached php 工具
因為這個軟件時基於PHP程序的,因此需要有PHP環境才行。
2.3.2 采用IP或解析好的域名進行訪問
第3章 memcached內存管理
3.1 memcached內存管理機制深入剖析
malloc全稱memory allocation,中文名稱動態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態分配內存。早期的memcached內存管理是通過malloc分配的內存實現的,使用完通過free來回收。
3.1.1 slab內存管理機制(重點)
現在的memcached是利用slab allocation機制來分配和管理內存的。過程如下:
提前將大內存分配大小為1MB的若幹個slab,然後針對每個slab再進行小對象填充,這個小對象稱為chunk,避免大量重復的初始化和清理,減輕了內存管理器的負擔。
slab allocation內存分配的原理:按著預先規定的大小,將分配給memcached服務的內存預先分割成特定長度的內存塊(chunk),再把尺寸相同的內容塊分成組(chunk slab class),這些內存塊不會釋放,可以重復利用。
新增數據對象存儲時,因為memcached服務器中保存著slab內空閑的chunk的列表,他會根據該列表選擇chunk,然後將數據緩存其中。當有數據存入時,memcached根據接受到的數據的大小,選擇最適合數據大小的slab 分配一個能存下這個數據的最小內存塊(chunk)
1.1.1slab內存管理機制的特點
提前分配大內存slab 1MB,再進行小對象填充chunk。
避免大量重復的初始化和清理,減輕內存管理器負擔。
避免頻繁malloc/free內存分配導致的碎片。
內存管理機制小結:
mc的早期內存管理機制為malloc(動態內存分配)
malloc(動態內存分配)產生內存碎片,導致操作系統性能下降。
slab 內存分配機制可以解決內存碎片的問題。
memcached服務的內存預先分割成特定長度的內存塊,稱為chunk,用於緩存數據的內存空間或內存塊,相當於磁盤的block,只不過磁盤的每一個block都是相等的,而chunk只有在同一個slab class內才是相等的。
slab class 指特定大小(1MB)的包含多個chunk的集合或組,一個memcached包含多個slab class,每個slab class 包含多個相同大小的chunk。
slab機制也有缺點,如chunk的空間會有浪費。
memcached slab allocator內存管理機制的缺點
chunk 存儲item浪費空間
slab 尾部剩余空間
memcached的過期檢測與刪除機制
memcached懶惰檢測對象過期機制
memcached不會主動檢測item對象是否過期,而是在進行get操作時檢查item對象是否過期及是否應該刪除。
因為不會主動加測item對象是否過期,自然不會釋放已經分配給對象的內存空間了,除非為添加的數據設定過期時間或內存緩存滿了,在數據過期後,客戶端不能通過key取出他的值,其存儲空間將被重新利用。
mcached使用的這種策略為懶惰檢測對象過期策略,即自己不監控存入的key/value對是否過期,而是在獲取key值時查看記錄的時間戳,從而檢查key/value對空間是否過期,這種策略不會再過期檢查上浪費CPU資源。
3.1.2.2memcached懶惰刪除對象機制
當刪除item對象時,一般不會釋放內存空間,而是做刪除標記,將指針放入slot回收插槽,下次分配的時候直接使用。
memcached在分配空間時,會優先使用已經過期的key/value對空間,若分配的內存空間占滿,memcached就會使用LRU算法來分配空間,刪除最近很少使用的key/value對,從而將其空間分配給新的key/value對。
memcached刪除機制小結:
q 不主動監測item對象是否過期, 而是在get時才會檢查item對象是否過期以及是否應該刪除。
q 當刪除item對象時,一般不釋放內存空間,而是做刪除標記,將指針放入slot回收插槽,下次分配的時候直接使用。
q 當內存空間滿的時候,將會根據LRU算法把最近很少使用的item對象刪除。
q 數據存入可以設定過期時間,但是數據過期不會立即刪除,而是在get時檢查item對象是否過期以及是否應該刪除。
q 如果不希望系統使用LRU算法清除數據,可以使用-M參數。
Memcached就會使用LRU算法來分配空間,刪除最近最少使用的key/value對,從而將其空間分配給新的key/value對。
網站緩存:squid,nginx,varnish
緩存圖片、視頻等。 緩解後端存儲系統的壓力
NOSQL庫:Redis,Memcached,MongoDB,HBase,Cassandra
Memcached 緩存數據庫的數據
Redis:除了當內存用,還可以放到磁盤
1、緩存功能
2、輔助存儲數據(好友關註、粉絲、投票)
MongoDB 可以直接放數據
本文出自 “寫個博客騙錢” 博客,請務必保留此出處http://dadonggg.blog.51cto.com/12672150/1949297
memcached部署