使用Memcached實現Session共享
由於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中,值得研究。
如果我們使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- memcached-session-manager session共享Session
- Tomcat通過Memcached實現session共享的完整部署記錄TomcatSession
- 分散式中使用 Redis 實現 Session 共享(上)分散式RedisSession
- 分散式中使用 Redis 實現 Session 共享(中)分散式RedisSession
- 分散式中使用 Redis 實現 Session 共享(下)分散式RedisSession
- 通過redis實現session共享RedisSession
- Springsession+redis實現session共享SpringGseSessionRedis
- PHP實現多伺服器session共享之memcache共享PHP伺服器Session
- 快速實現 Tomcat 叢集 Session 共享TomcatSession
- memcache連線php以及實現session共享PHPSession
- Spring Session實現Session共享下的坑與建議SpringSession
- 用Nginx實現Session共享的均衡負載NginxSession負載
- SpringBoot2.x 整合Spring-Session實現Session共享Spring BootSession
- Tomcat利用MSM實現Session共享方案解說TomcatSession
- session 共享Session
- Shiro+Redis實現tomcat叢集session共享RedisTomcatSession
- 使用memorycache作為session共享配置Session
- Nginx搭建Tomcat9叢集並實現Session共享NginxTomcatSession
- memcached 分散式實現原理分散式
- SpringBoot整合SpringDataReids和SpringSession實現Session共享Spring BootGseSession
- memcached分散式原理與實現分散式
- Session分散式共享 = Session + Redis + NginxSession分散式RedisNginx
- session共享問題???Session
- Tomcat通過Redis實現session共享的完整部署記錄TomcatRedisSession
- Session實現原理Session
- Memcached 與 Redis 實現的對比Redis
- memcached與redis實現的對比Redis
- Memcached 分散式快取實現原理分散式快取
- nginx Win下實現簡單的負載均衡(2)站點共享SessionNginx負載Session
- Nginx+Tomcat+Redis實現負載均衡、資源分離、session共享NginxTomcatRedis負載Session
- 使用python實現memcached的啟動服務指令碼rcPython指令碼
- 使用SSH+session+mysql實現購物車SessionMySql
- php跨域共享sessionPHP跨域Session
- Memcached筆記——(三)Memcached使用總結筆記
- 教你用Magent實現Memcached叢集
- LVS負載均衡下session共享的實現方式-持久化連線負載Session持久化
- Cloud Foundry Session Affinity(Sticky Session)的實現CloudSession
- Web--Session共享問題WebSession