1. 程式人生 > >memcached部署

memcached部署

緩存 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沒有向

    mysql那樣的主從復制方式,分布式memcached集群的不同服務器之間是互不通信的,每一個節點都獨立存取數據,並且數據內容不一樣。通過對web應用端的程序設計或通過支持hash算法的負載均衡軟件,可以讓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

  1. 寫數據:

如果寫數據,那麽再寫數據庫的同時,把數據寫入到memcached,或者寫入到mysql的同時,由mysql復制到memcached

Linux運維角色:

搭建memcached服務,提供服務(使用信息問開發)

1.3.2.2 集群後端的共享會話session

session門票。如果網站內有了這個門票,就可以瀏覽任意頁面。

解決共享會話方案

1nginx的調度算法ip_hash(缺點:導致負載不均)

2、通過memcahced做共享會話。

3cookies(放在用戶瀏覽器端)。

優點,可以大並發,缺點:容易篡改,不安全。

參考內容:

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.1memcached中寫入數據實戰

  1. 通過Telnet命令寫入數據

安裝Telnet工具

yum install telnet nc -y

telnet 127.0.0.1 11211

通過Telnetmemcached中寫入數據。

[[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

  1. 通過printf配合ncmemcached中寫入數據,命令如下:

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配合ncmemcached中刪除數據,命令如下

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.1makecleandistclean的用法講解

makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因為 makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。

makefile帶來的好處就是--“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphimake,VisualC++nmake,LinuxGNUmake.可見,makefile都成為了一種在工程方面的編譯方法。

make

根據Makefile文件編譯源代碼、連接、生成目標文件、可執行文件。

make clean

清除上次的make命令所產生的object文件(後綴為.o的文件)及可執行文件。

make install

將編譯成功的可執行文件安裝到系統目錄中,一般為/usr/local/bin目錄。

make dist

產生發布軟件包文件(即distribution package)。這個命令將會將可執行文件及相關文件打包成一個tar.gz壓縮的文件用來作為發布軟件的軟件包。

它會在當前目錄下生成一個名字類似“PACKAGE-VERSION.tar.gz”的文件。PACKAGEVERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKEPACKAGE, 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機制來分配和管理內存的。過程如下:

  1. 提前將大內存分配大小為1MB的若幹個slab,然後針對每個slab再進行小對象填充,這個小對象稱為chunk,避免大量重復的初始化和清理,減輕了內存管理器的負擔。

slab allocation內存分配的原理:按著預先規定的大小,將分配給memcached服務的內存預先分割成特定長度的內存塊(chunk,再把尺寸相同的內容塊分成組(chunk slab class),這些內存塊不會釋放,可以重復利用。


  1. 新增數據對象存儲時,因為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部署