現在提到多伺服器的共享session,幾乎都是回答用redis。
對於redis實作幾台伺服器共享session,不是很理解。
假如一個網站分別部署在A B C 3 台伺服器上,他們的程式碼都是相同的。 用戶在存取的過程中是隨機切換到其他伺服器
,使用redis來共享session,那麼是這3台伺服器是如何實現session 即時共享的?
方案一:
A B C 三台伺服器上每台伺服器都部署session,PHP 直接連本台伺服器的 127.0.0.1 的REDIS進行操作SESSION,透過本地REDIS進程他們相互的配置好了相互的共享機制?所以就實作了三台伺服器SESSION即時共享
方案二:
將REDIS 另外的部署到第四台伺服器D, A B C 三台伺服器上的PHP設定連接的REDIS是這台D伺服器。那就實現了統一的SESSION 即時共享,這樣看似不正確。
很疑惑Redis SESSION 即時分享到底是如何實現的?
這三台伺服器的PHP 都是連接到本地的127.0.0.1 6379 的REDIS 還是?
首先要先明確session和cookie的區別。瀏覽器端 存的是cookie每次瀏覽器發送請求到服務端是http 封包頭是會自動加上你的cookie訊息的。服務端拿著使用者的cookie當作key去儲存尋找對應的value(session).
同一網域下的網站的cookie都是一樣的。所以無論幾台伺服器,無路請求分配到哪一台伺服器上同一用戶的cookie是
不變的。也就是說cookie對應的session也是唯一的。
只要保證多台業務伺服器存取同一個redis伺服器(或叢集)就行了。 這樣就能達到你的目的。所以你的方案二是對的
既然是共享的,當然是要存放在同一個Redis裡,這其中說的就是你的第二種。
用Redis共享Session,關鍵是Session就是部署在Redis上,就儲存在Redis中,本地不再部署檔案Session。
既然用redis來共享session,本質上就意味著redis對你來講只有一個實例,但是這個實例是僅僅啟動了一個redis服務還是在多個伺服器上部署一個redis集群跟你的應用層是無關的。
對於可靠性要求高的應用,redis肯定是部署成集群的,類似你說的方案1,但是這些redis不是孤立的,他們內部之間會有對應的通信機制已實現分片、冗餘存儲等,存取的時候也不需要限定redis的位置,例如你在A伺服器存取B上面的redis也是可以的,B上面的redis實際資料儲存又可能位於C伺服器,這一切對於應用程式(客戶端)來講都是一個黑盒子,不需要關心。
php.ini裡面有配置session的。設定改成redis或memcache,其他就不用管了
個人覺得共享session只是一種共享資料的理念,將本來需要保存到session的資料遷移到redis進行保存,當然也需要像session一樣產生一個唯一的sessionID,然後傳遞給客戶端,並保存到cookie,客戶端每次要求的時候需要將改cookie一起傳送過來,然後從redis中取得對應的資料。
其實說到共享session其實就是一個共享快取而已。
當然我說的是理念,也許有工具可以直接將伺服器上的真正的session直接保存到redis,但是我覺得理念就是這樣的。
其實上面兩種方案都是可行的,首先第一種可以建構一個redis集群,來提高服務的穩定與效能,避免單點故障,導致session快取資料的遺失。第二種可以在額外的機器上另開一個redis服務,為了提高服務的穩定,可以建造一個主從。 cookie和session類似你在redis上面的key-value