多臺服務(wù)器之間共享PHP的session數(shù)據(jù)

通過設(shè)置session_save_handle 為redis或者memcache,將session保存的位置進(jìn)行修改。

php.ini里的配置:


image.png

這個(gè)項(xiàng)目一開始就設(shè)計(jì)的“很大”,考慮了很多負(fù)載均衡方面的東西,比如采用[nginx]將[php]的請求分?jǐn)偟饺舾蓚€(gè)運(yùn)行php fastcgi的獨(dú)立服務(wù)器中。這樣的設(shè)計(jì)除了在每個(gè)php fastcgi服務(wù)器中要保存一份程序的拷貝以外,還有一個(gè)亟待解決的問題。由于php fastcgi進(jìn)程分別運(yùn)行在不同的服務(wù)器上,默認(rèn)的,php的session數(shù)據(jù)是在各個(gè)服務(wù)器上分別存放的,這樣的話,如果在某一次php請求過后,nginx將php請求發(fā)送到了另外集群中的另外一臺php fastcgi服務(wù)器,那么就會導(dǎo)致session的丟失。經(jīng)過一系列考慮,項(xiàng)目組決定采用一臺獨(dú)立memcached服務(wù)器來存儲整個(gè)項(xiàng)目的php session數(shù)據(jù),再通過改寫php的session處理函數(shù)來對memcached服務(wù)器進(jìn)行數(shù)據(jù)讀寫,然后解決各個(gè)php fastcgi中session不同步的問題。

項(xiàng)目背景基本上就是上面說的那些,下面大概說說相關(guān)的網(wǎng)絡(luò)環(huán)境,然后進(jìn)入具體的配置、實(shí)現(xiàn)過程:

1、nginx服務(wù)器一臺,IP地址:172.16.236.208 入口機(jī)器
2、php fastcgi服務(wù)器兩臺,IP分別為:172.16.236.210,172.16.236.211 負(fù)載機(jī)器
3、memcached服務(wù)器一臺,IP為:172.16.236.220 共享數(shù)據(jù)

為了簡化操作過程,上面的環(huán)境僅僅是達(dá)到項(xiàng)目需求的假設(shè),實(shí)際項(xiàng)目中還有許多額外的處理。

首先,修改nginx虛擬主機(jī)配置,將php的請求分發(fā)到各個(gè)php fastcgi服務(wù)器去,

第二步,為php fastcgi服務(wù)器安裝php-memcache擴(kuò)展

啰嗦一句,這一步其實(shí)只需在一臺服務(wù)器上進(jìn)行,其他php fastcgi的配置其實(shí)可以偷懶,就是將之前編譯好的memcache.so拷貝到需要配置的服務(wù)器中,然后修改php.ini可以加載這個(gè)擴(kuò)展即可。

第三步,修改項(xiàng)目php源代碼,使php的session存取使用memcached。
之前沒有認(rèn)真去讀php的手冊,先是自己寫session的handler,然后又碰到一些奇怪的問題。最后在php官方的memcache說明中找到了最簡單的辦法,其實(shí)只要在調(diào)用session_start()之前執(zhí)行如下代碼:

$host = '172.16.236.220' ; 
$port = '11211' ; 
$session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10, tcp://$host1:$port1"; 
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);

其中host是memcached服務(wù)器的ip地址,port是memcached監(jiān)聽的端口。使用多個(gè) memcached server 時(shí)用逗號","隔開,并且和 Memcache::addServer() 文檔中說明的一樣,可以帶額外的參數(shù)"persistent"、"weight"、"timeout"、"retry_interval" 等等,類似這樣的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。

測試數(shù)據(jù):

<?php 
session_start(); 
if (!isset($_SESSION['TEST'])) { 
$_SESSION['TEST'] = time(); 
} 
$_SESSION['TEST3'] = time(); 
print $_SESSION['TEST']; 
print "<br><br>"; 
print $_SESSION['TEST3']; 
print "<br><br>"; 
print session_id(); //19216821213c65cedec65b0883238c278eeb573e077 
?> 
可以直接用sessionid 去 memcached 里查詢一下: 
telnet 172.16.236.220 11211 
get 19216821213c65cedec65b0883238c278eeb573e077 

得到 
TEST|i:1177556731;TEST3|i:1177556881; 
這樣的結(jié)果,說明session 正常工作 

使用memcached的優(yōu)缺點(diǎn)
1.用Memcached來存儲 session 在讀寫速度上會比文件快很多,而且在多個(gè)服務(wù)器需要共用session時(shí)會比較方便,將這些服務(wù)器都配置成使用同一組Memcached服務(wù)器就可以,減少了額外的工作量。缺點(diǎn)是 session 數(shù)據(jù)都保存在 memory 中,持久化方面有所欠缺,但對 session 數(shù)據(jù)來說也不是很大的問題,如果要持久化數(shù)據(jù),也可以使用新浪開發(fā)的MemcacheDB或日本人開發(fā)的Tokyo tyrant+Tokyo Cabinet。

單點(diǎn)故障問題的解決
2.另外,如何解決Memcached的單點(diǎn)故障問題,有以下幾個(gè)方案:
? ①使用上面提到的Memcache::addServer增加多臺Memcached,但這樣只能達(dá)到一臺出故障之后,另外一臺可以使用,但每臺Memcached的數(shù)據(jù)是獨(dú)立的,如果不共享不復(fù)制,出故障的數(shù)據(jù)就丟失了。
? ②使用Memcached的一個(gè)補(bǔ)丁應(yīng)用repcached,可以實(shí)現(xiàn)multi master replication和asynchronous data repliacation等故障轉(zhuǎn)移的功能,并且支持原來Memcached的所有命令。不過這個(gè)應(yīng)用只支持Memcached1.2.x版本。
? ③使用Tokyo tyrant+Tokyo Cabinet(簡稱TT+TC)。TT兼容Memcached協(xié)議,可以直接替換使用,TT支持replication,可以實(shí)現(xiàn)故障轉(zhuǎn)移,TC則為TT提供持久化。
TT+TC是日本最大的社交類網(wǎng)站mixi.jp開發(fā)的開源應(yīng)用,并已成功應(yīng)用在mixi.jp中,值得研究。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容