使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通過redis實現session共享RedisSession
- 快速實現 Tomcat 叢集 Session 共享TomcatSession
- SpringBoot2.x 整合Spring-Session實現Session共享Spring BootSession
- session 共享Session
- Nginx搭建Tomcat9叢集並實現Session共享NginxTomcatSession
- Tomcat通過Redis實現session共享的完整部署記錄TomcatRedisSession
- session共享問題???Session
- memcached分散式原理與實現分散式
- nginx Win下實現簡單的負載均衡(2)站點共享SessionNginx負載Session
- Cloud Foundry Session Affinity(Sticky Session)的實現CloudSession
- 教你用Magent實現Memcached叢集
- Tomcat中的session實現TomcatSession
- 多個 Laravel 與 Lumen session 共享LaravelSession
- spring-session-data-redis共享方案SpringSessionRedis
- Tomcat通過自帶的Cluster方式實現Session會話共享環境操作記錄TomcatSession會話
- PHP 會話(Session)如何實現使用者登陸功能PHP會話Session
- 利用Nginx+tomcat實現memcached的資源接管NginxTomcat
- 使用mono-repo實現跨專案元件共享Mono元件
- Spring Boot 2 + Redis 處理 Session 共享Spring BootRedisSession
- 使用 python 實現簡單的共享鎖和排他鎖Python
- Shiro許可權管理框架(二):Shiro結合Redis實現分散式環境下的Session共享框架Redis分散式Session
- Java Servlet session實現登入退出JavaServletSession
- 分散式系統Session 實現方式分散式Session
- 許可權處理 - 用redis實現分散式session~ (cookie && session )Redis分散式SessionCookie
- 共享辦公室租賃,實現資源共享
- ArgoWorkflow教程(三)---使用 Artifacts 實現步驟間檔案共享Go
- 基於 Session 實現簡訊登入Session
- 另類用法 hyperf/session 實現 API tokenSessionAPI
- Oracle Session每日統計功能實現XLAMOracleSession
- Memcached安裝與使用例項
- 使用memcache.php監控memcachedPHP
- Vuex如何實現資料共享Vue
- Memcached
- 正確理解memcached,才能更好的使用
- C#:使用HttpWebRequest後保持Session,再使用一個HttpWebRequest實現瀏覽、下載等效果C#HTTPWebSession
- 如何在多臺 Web 伺服器上共享 sessionWeb伺服器Session
- Windows下安裝 和使用Memcached,附memcached-win64-1.4.4-14安裝包Windows
- Python中使用共享變數+訊號量實現程序間的實時通訊Python變數
- .Net Core 使用SessionSession