http://dev.mysql.com/doc/refman/5.0/en/index.html
http://tw2.php.net/manual/en/book.memcache.php
Memcached
introduction
在一般的IT環境下,如果要擴增程式的使用人數,最大的問題會卡在程式的執行速度,經常存取的資訊,如果使用mysql做為後端存取的資料庫,速度就會變得慢,因為資訊的存取,必須透過執行sql語法,取得資料庫內相關的資料,而拖慢執行速度。
memcached是一個簡單的、具有高度伸縮性的key-based快取,快取來源不受限制,他也是一個備份的RAM,可以讓應用程式進行非常快速地存取,要使用memcached,必須在一台或多台主機上執行memcached,讓使用者共享快取內儲存的物件,因為每台主機都是使用RAM儲存資訊,存取的速度遠遠快過從硬碟上進行資訊的存取,這樣的話,相對於從資料庫存取資料,效能的增進是非常明顯的。快取只是容納資訊的空間,你可以在快取內儲存任何資料,如果儲存的是複雜的資料結構,可以在資料存進快取前,先進行複雜的資料庫操作,再將資料放進快取中,可以大幅減少mysql server的負擔。
使用memcached的一般性作法是修改應用程式,讓應用程式改為從memcached讀取資料,如果需要的資訊不在memcached裡頭,程式就改由mysql讀取資料,再將資料寫入memcached裡頭,以後如果要存取相同資料,就可以發揮memcached資料快速存取的優勢。
在memcached的架構中,所有的client可以送出key與任何一台memcached伺服器連繫,在這個架構中,每個client可以與圖中的任何伺服器連繫,在client上,當送出要求時,key會先被hash,這個hash值會被用來選取memcached伺服器,memcached伺服器由client決定,可以使程式維持輕量化。
當client送出key時,會執行同一套演算法,相同的key,會產生相同的hash值,同一部memcached伺服器就會被選為資料來源,使用這個方法,快取資料被分散放置在所有的memcached伺服器上,而這些快取資訊可以被所有的client存取,結果就是,以記憶體做為資料儲存處的分散式快取,這類型的快取尤其適合複雜的資料結構,存取速度遠遠快過直接從資料庫存取資料。
在memcached伺服器中的資料永遠不會放在磁碟上,記憶體中的快取可以從後端的資料庫(mysql)取得資料,如果memcached伺服器當掉了,可以改為由mysql取得資料,當然,速度會變得比較慢。
Installing memcached
在ubuntu上安裝memcached非常輕鬆,只要輸入下面這道指令,再按enter就安裝好了
apt-get install memcached
memcached的啟動
在ubuntu上啟動memcached伺服器
/etc/init.d/memcached start
參數配置
參考/etc/memcached.conf設定檔的說明會更清楚
-u 執行身份
-m 記憶體容量(快取容量,單位為MB)
-p 指定port
-d 以daemon方式執行
-t 指定執行緒的數量
-l 指定執行的網路介面
memcached deployment
memcached有許多不同的佈署方式及策略,正確的佈署方式取決於你的應用程式及環境,當在系統中佈署memcached,你必須考量下列的注意事項
*memcached只是一項快取機制,如果資料很重要,在存取的過程中不能因為漏失,再從不同的地方存取,就不能使用memcached。
*memcached沒有內建的安全機制,至少,你必須確定,memcached伺服器只能在內部網路存取,而且memcached伺服器使用的port不能被外部網路存取。如果memcached含有敏感性資料,這些資料在存進memcached前要先被加密。
*memcached不提供復原機制,因為memcached之間沒有任何的溝通協定,如果一台memcached故障了,你必須將這台memcached從列表中移除,再重新載入資料,再將資料寫入另一台memcached伺服器中,
*如果client及memcached分別在不同的機器上,資料傳送延遲性如果造成問題,可以把memcached服務移到client端的機器上。
*key的長度是由memcached伺服器決定,預設的最大長度是250byte
*只使用一台memcached絕不是一個好的想法,尤其是服務多個client時,最少提供二台
memcached,才可以恰當地管理機器當機的狀況,如果可以的話,應該多建置幾台memcached
伺服器。當增加或移除memcached伺服器時,key/value的配置及hash值就會受到影響,如果要避免這些問題,必須研究memcached的hash type。
Memory allocation within memcached
當你第一次啟動memcached伺服器,memcached參數指定的記憶體數量不會自動配置給memcached,相反地,當開始將資料存進memcached的快取時,才會進行記憶體的分配。
當你開始將資料存在快取中,memcached不會為每個存入快取的資料一一配置記憶體空間,而是一次配置一個區塊,以進行記憶體空間的有效利用,避免快取資料過期時,造成記憶體空間配置的零碎化。
memcached裡頭的快取記憶體配置,以page為單位,每一page預設是1M,一個或多個page組成一個slab。
當memcached啟動時,不會進行slab及page的配置,只有當資料存進快取時,才會在page中切出適當大小的chunk,把資料存進chunk中,每一個chunk,會儲存一筆資料的value跟key,而page中每筆chunk的大小都必須一樣。
例如,memcached啟動時,有一筆資料的大小是800k,須要存入快取,這時就會建立一個slab,這個slab中page的chunk大小就是1M,一個page就只有一個chunk。
如果存入快取的資料是250K,那麼,就會建立一個slab,這個slab會再建立一個page,這個page會再切成4個大小相同的chunk。如果還有6筆250K的資料要存入快取,這個slab會再建立第二個相同的page進行資料的儲存。
資料如果超過1M,由於chunk預設是不能超過一M,而且資料必須塞進chunk中,因此超過一M的資料就會無法存入快取當中。
Using namespaces
memcached是非常簡單的key/value型式的儲存系統,無法自動將資料進行分類,例如,如果你使用mysql資料表傳回的id當做存入memcached快取的key時,就有可能有二筆由mysql資料表傳回的資料,雖然內容不同,id卻相同,存入快取時這二筆資料就會相互覆蓋,造成資料讀取的錯誤。
一些程式的API會在資料存入快取時,自動建立命名空間,實務上,這些命名空間,只是在存取資料時,在key前加上區別的字串。
你可以自己實做命名空間,只要存取快取資料時,在key前加上自定的字串就可以了,如加上”user_”字串。
Data Expiry
memcached快取資料的過期有二種狀況,如果要插入新的資料到快取中,但是沒有適當地slab可以存資料時,最近最少使用的資料會被移除,以騰出空間讓新的資料存入。
這個方法可以確保被移除的資料,是不再被使用的,或是已經很久不被使用的,但如果memcached的快取容量,比正常狀況使用時小很多時,你就會看到很多尚在使用的資料被移除了。
啟動memcached時啟用 -M參數,會在記憶體不足時發出警告,而不是自動刪除舊有的資料。
第二種快取過期的狀況,是直接刪除快取資料,或是設定資料過期的時間。
一種典型的應用就是設定使用者儲存的session資料,快取過期的時間。
在php中使用memcached
api的安裝
apt-get install php5-memcache
程式範例
程式名稱:a.php
class Test{
public $model;
public $color;
}
$test=new Test();
$test->model='bmw';
$test->color='red';
$cache=new Memcache();
$cache->connect('localhost',11211);
$cache->set('car',$test);
程式名稱:b.php
class Test{
public $model;
public $color;
}
connect('localhost',11211);
$car=$cache->get('car');
echo $car->model;
echo “\n”;
echo $car->color;
echo “\n”;
跑完a.php程式後,再跑b.php,就會跑出下面的結果
bmw
red
程式中物件的二個屬性都是經由serialize後,由a.php存在快取中,如果其他的程式要取用這二個屬性,只要有快取的key值,就可以得到這個物件的屬性。
1 則留言:
我看了幾篇文章, 裏面有提到 32bit OS 的限制, memory 只能用到 2G, 是否我裝了 win2008 server 64bit 版本, 就可以使用超過 2G 的 memory?
ps. 我目前安裝的是 1.2.6 的 32bit memcacheD
張貼留言