使用Memcached實現Session共享

denniswwh發表於2010-10-21
由於Cookie是儲存的使用者客戶端的,安全性存在問題,為保證使用者資料的安全性,我們必須使用Session機制來儲存使用者登入後的一些資訊。
如果我們使用LVS對Apache實現負載均衡,就無法保證使用者每次都能被分配到同一臺Apache Server上,以取到自己的Session,雖然LVS可以加-p引數來保證客戶端每次都被分配到同一臺Apache Server上,但這種方式存在一些弊端,比如必須設定一個保持時間,如果時間太長了,LVS就需要快取大量資訊,時間太短了,又不能保證使用者每次被分配到同一臺Server上,而且這種方式也不易實現Session的冗餘備份。
因此,我們需要Session共享,也就是說每臺Apache都可以訪問到所有的Session,這樣使用者被分配到哪臺Server就不重要了。
Session共享主要有多種實現方式:
 Session複製。Apache可以實現把Session同步到其他Server上去,但這種技術太複雜,而且影響效能,佔用記憶體,所以不推薦使用。
 Session集中儲存。儲存介質可以是NFS檔案系統、資料庫、Memcached,從效能上考慮,當然是Memcached最好,推薦使用。[@more@]1.3 實現
1.3.1 安裝Memcached
Memcached是基於libevent實現的,所以要首先確保已經安裝libevent。
安裝libevent
tar zxvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure --prefix=/usr
make && make install
安裝Memcached
tar zxvf memcached-1.4.4.tar.gz
cd memcached-1.4.4
./configure --prefix=/usr/local/memcached --with-libevent=/usr
make && make install
啟動Memcached

/usr/local/memcached/bin/memcached -d -m 10 -u root -l 192.168.0.9 -p 11211 -c 256 -P /tmp/memcached.pid
1.3.2 安裝PHP擴充套件pecl::memcache
pecl install memcache
或原始碼安裝
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
phpize
./configure
make && make install

將 php.ini 中 extension=memcache.so 開啟,重啟一下 apache,檢視 phpinfo 中的 "Registered save handlers" 會有"files user memcache" 這3個可用。

另外,基於libmemached的php擴充套件在pecl釋出了,叫pecl::memcached,效能上可能會更好。
1.3.3 配置Memcached儲存Session
修改配置檔案,在 php.ini 中全域性設定
session.save_handler = memcache
session.save_path = "tcp://192.168.0.9:11211"
或者某個目錄下的 .htaccess :
php_value session.save_handler "memcache"
php_value session.save_path "tcp://192.168.0.9:11211"
再或者在某個一個應用中:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://192.168.0.9:11211");
使用多個 memcached server 時用逗號","隔開,並且和 Memcache::addServer() 文件中說明的一樣,可以帶額外的引數"persistent"、"weight"、"timeout"、"retry_interval" 等等,類似這樣的:":port1?persistent=1&weight=2,:port2" 。
1.3.4 測試
session_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "

";
print $_SESSION['TEST3'];
print "

";
print session_id();
?>

可以直接用sessionid 去 memcached 裡查詢一下:
telnet 192.168.0.9 11211
get 19216821213c65cedec65b0883238c278eeb573e077
得到
TEST|i:1177556731;TEST3|i:1177556881;
這樣的結果,說明session 正常工作

用Memcached來儲存 session 在讀寫速度上會比檔案快很多,而且在多個伺服器需要共用session時會比較方便,將這些伺服器都配置成使用同一組Memcached伺服器就可以,減少了額外的工作量。缺點是 session 資料都儲存在 memory 中,持久化方面有所欠缺,但對 session 資料來說也不是很大的問題,如果要持久化資料,也可以使用新浪開發的MemcacheDB或日本人開發的Tokyo tyrant+Tokyo Cabinet。
另外,如何解決Memcached的單點故障問題,有以下幾個方案:
 使用上面提到的Memcache::addServer增加多臺Memcached,但這樣只能達到一臺出故障之後,另外一臺可以使用,但每臺Memcached的資料是獨立的,不共享,不復制,出故障的資料丟失了。
 使用Memcached的一個補丁應用repcached,可以實現multi master replication和asynchronous data repliacation,並且支援原來Memcached的所有命令。不過這個應用只支援Memcached1.2.x版本。
 使用Tokyo tyrant+Tokyo Cabinet(簡稱TT+TC)。TT相容Memcached協議,可以直接替換使用,TT支援replication,可以實現故障轉移,TC則為TT提供持久化。
TT+TC是日本最大的社交類網站開發的開源應用,並已成功應用在mixi.jp中,值得研究。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/124805/viewspace-1040164/,如需轉載,請註明出處,否則將追究法律責任。

相關文章