如何運用PHP+REDIS解決負載均衡後的session共享問題
一、為什麼要使用Session共享?
稍大一些的網站,通常都會有好幾個伺服器,每個伺服器執行著不同功能的模組,使用不同的二級域名,而一個整體性強的網站,使用者系統是統一的,即一套使用者名稱、密碼在整個網站的各個模組中都是可以登入使用的。各個伺服器共享使用者資料是比較容易實現的,只需要在後端放個資料庫伺服器,各個伺服器透過統一介面對使用者資料進行訪問即可。但還存在一個問題,就是使用者在這個伺服器登入之後,進入另一個伺服器的別的模組時,仍然需要重新登入,這就是一次登入,全部通行的問題,對映到技術上,其實就是各個伺服器之間如何實現共享 SESSION 資料的問題。
二、瞭解session工作原理
在解決問題之前,先來了解一下 PHP SESSION 的工作原理。在客戶端(如瀏覽器)登入網站時,被訪問的 PHP 頁面可以使用 session_start() 開啟 SESSION,這樣就會產生客戶端的唯一標識 SESSION ID(此 ID 可透過函式 session_id() 獲取/設定)。SESSION ID 可以透過兩種方式保留在客戶端,使得請求不同的頁面時,PHP 程式可以獲知客戶端的 SESSION ID;一種是將 SESSION ID 自動加入到 GET 的 URL 中,或者 POST 的表單中,預設情況下,變數名為 PHPSESSID;另一種是透過 COOKIE,將 SESSION ID 儲存在 COOKIE 中,預設情況下,這個 COOKIE 的名字為 PHPSESSID。這裡我們主要以 COOKIE 方式進行說明,因為應用比較廣泛。
服務端透過客戶端傳遞的session_id區分使用者,用來標記使用者的登入狀態。
使用者再次傳送請求的時候,把服務端返回的session_id透過cookie[或者URL傳參]的形式傳遞到服務端,這樣服務端就可以區分出來具體操作的使用者。
三、如何解決負載均衡之後的session共享問題?
1.不使用session,換作cookie
把session改成cookie,就能避開session的一些弊端。【安全性較低】
2.資料庫記錄下session資訊
使用資料庫記錄session資訊,session的使用頻率比較高,如果存在資料庫中,頻繁的讀取會對資料庫產生較大的壓力,網站效能瓶頸一般都存在資料庫.
3.負載均衡的時候使用ip_hash演算法進行分發
使用ip_hash可能會導致某一臺伺服器負載較大。如果某段時間內伺服器進入了很多固定IP代理的請求 [代理] ,如果代理IP的負載過高就會導致ip_hash對應的伺服器負載壓力過大,這樣ip_hash就失去了負載均衡的作用了。
4.對session檔案進行同步
使用同步工具對session檔案進行同步,保證負載伺服器的session檔案都是一致的,這種做法雖然可以解決session共享的問題,同樣的內容會存在多個伺服器上,而且部分伺服器存在的session檔案可能從開始到結束完全沒有使用到,浪費了伺服器的資源。 【rsync,inotify-tools等】
5.使用memcache或者redis儲存session資訊 [建議]
相比檔案取資訊,從記憶體取資料速度要快很多,而且在多個伺服器需要共用 session 時會比較方便,將這些伺服器都配置成使用同一組 memcached 伺服器就可以,減少了額外的工作量。其缺點是 session 資料都儲存在 memory 中,一旦當機,資料將會丟失。但對 session 資料來說並不是嚴重的問題。
四、PHP+REDIS解決session共享問題
1、session預設儲存是php.ini中配置的
//session儲存方式 session.save_handler = files //session儲存路徑 N表示按照分級儲存 session.save_path = "N;/path"
注:session.save_path = "2;/data/session_tmp"代表將session檔案分成兩級存放,即/data/session_tmp/4/b /sess_4b1e384ad74619bd212e236e52a5a174If,取前兩位字元,但是php並不生成目錄,需要自己手工生成。
//session儲存的目錄 session.save_path = "d:/wamp/tmp" php自帶函式session_save_path //是否自動開啟session session.auto_start = 0
2、設定session儲存方式為redis
(1) 修改完成之後重啟php-fpm,nginx改php.ini配置檔案
session.save_handler = redis session.save_path = “tcp://127.0.0.1:6379″
(2) 透過ini_set設定
ini_set(“session.save_handler”,”redis”); ini_set(“session.save_path”,”tcp://127.0.0.1:6379″);
有密碼設定
ini_set(“session.save_path”,”tcp://127.0.0.1:6379?auth=redisauthkey″);
(3) 具體實現
<?php //如果未修改php.ini下面兩行註釋去掉 //ini_set('session.save_handler', 'redis'); //ini_set('session.save_path', 'tcp://127.0.0.1:6379'); session_start(); $_SESSION['sessionid'] = 'this is session content!'; echo $_SESSION['sessionid']; echo '<br/>'; $redis = new redis(); $redis->connect('127.0.0.1', 6379); $redis->auth( ‘redisauthkey’ ); //redis用session_id作為key並且是以string的形式儲存 echo $redis->get('PHPREDIS_SESSION:' . session_id()); ?>
3、透過session_id建立自己的一套session機制
藉助session_id建議一套自己的機制,原理可以參考session儲存機制。
-
使用者第一次請求時候,給使用者下發session_id。
-
之後請求都要帶上session
-
使用者登入之後把使用者資訊存在redis,藉助session_id表示。
好處就是:把自己的一套session機制抽象為類,如果之後session不存在redis,後期可以直接透過修改類檔案解決問題。
作者:齊亞威
來源:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69918724/viewspace-2655279/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用tengine解決負載均衡的session問題負載Session
- 負載均衡伺服器session共享的解決方案 (轉載)負載伺服器Session
- 用Nginx實現Session共享的均衡負載NginxSession負載
- nginx 負載均衡 使用ip_hash方式解決session問題 測試Nginx負載Session
- 玩轉spring boot——負載均衡與session共享Spring Boot負載Session
- lvs 負載均衡遇到的一個問題. (問題解決)負載
- db4o適合負載均衡應用下的問題解決嗎負載
- 針對負載均衡叢集中的session解決方案的總結負載Session
- 一個負載均衡的問題負載
- 用 Redis 解決 NodeJS 多程式無法共享 session 的問題RedisNodeJSSession
- nginx Win下實現簡單的負載均衡(2)站點共享SessionNginx負載Session
- nginx+php負載均衡叢集環境中的session共享方案梳理NginxPHP負載Session
- Flume高可用負載均衡問題負載
- LVS負載均衡下session共享的實現方式-持久化連線負載Session持久化
- 關於用Java做叢集和負載均衡的問題Java負載
- Nginx+Tomcat+Redis實現負載均衡、資源分離、session共享NginxTomcatRedis負載Session
- 這些負載均衡都解決哪些問題?服務、閘道器、NGINX負載Nginx
- session共享問題???Session
- 關於 apache + tomcat 的負載均衡問題ApacheTomcat負載
- 負載均衡詳解負載
- NoSQL中負載均衡系統如何解決熱點問題,提高可用性?SQL負載
- DNS解析常見問題:如何為網站配置負載均衡?DNS網站負載
- 如何巧妙著運用「位運算」來解決問題?
- Nginx負載均衡詳解Nginx負載
- API Server 負載均衡問題被解決 | 雲原生生態週報 Vol. 40APIServer負載
- apache2.2+tomcat6負載均衡問題ApacheTomcat負載
- windows第七層負載均衡 基於IIS的ARR負載均衡詳解Windows負載
- 負載均衡負載
- Web--Session共享問題WebSession
- Tomcat 共享session問題TomcatSession
- 簡單瞭解負載均衡負載
- 禁用 COOKIE 後如何訪問 SESSION 問題CookieSession
- gRPC負載均衡(客戶端負載均衡)RPC負載客戶端
- gRPC負載均衡(自定義負載均衡策略)RPC負載
- 負載均衡的迷惑負載
- CDN和負載均衡的基本瞭解負載
- 解決Oracle資料庫遷移後的伺服器負載效能問題JSOracle資料庫伺服器負載JS
- 運維講堂:LVS負載均衡模式與F5負載均衡盤點運維負載模式