搜尋

首頁  >  問答  >  主體

redis叢集 - Redis 分散式快取,是如何實現多台伺服器SESSION 即時共享的

現在提到多伺服器的共享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 還是?

高洛峰高洛峰2829 天前1037

全部回覆(6)我來回復

  • 黄舟

    黄舟2017-04-24 09:14:54

    首先要先明確session和cookie的區別。瀏覽器端 存的是cookie每次瀏覽器發送請求到服務端是http 封包頭是會自動加上你的cookie訊息的。服務端拿著使用者的cookie當作key去儲存尋找對應的value(session).

    同一網域下的網站的cookie都是一樣的。所以無論幾台伺服器,無路請求分配到哪一台伺服器上同一用戶的cookie是
    不變的。也就是說cookie對應的session也是唯一的。

    只要保證多台業務伺服器存取同一個redis伺服器(或叢集)就行了。 這樣就能達到你的目的。所以你的方案二是對的

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-24 09:14:54

    既然是共享的,當然是要存放在同一個Redis裡,這其中說的就是你的第二種。

    用Redis共享Session,關鍵是Session就是部署在Redis上,就儲存在Redis中,本地不再部署檔案Session。

    回覆
    0
  • 黄舟

    黄舟2017-04-24 09:14:54

    既然用redis來共享session,本質上就意味著redis對你來講只有一個實例,但是這個實例是僅僅啟動了一個redis服務還是在多個伺服器上部署一個redis集群跟你的應用層是無關的。

    對於可靠性要求高的應用,redis肯定是部署成集群的,類似你說的方案1,但是這些redis不是孤立的,他們內部之間會有對應的通信機制已實現分片、冗餘存儲等,存取的時候也不需要限定redis的位置,例如你在A伺服器存取B上面的redis也是可以的,B上面的redis實際資料儲存又可能位於C伺服器,這一切對於應用程式(客戶端)來講都是一個黑盒子,不需要關心。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-24 09:14:54

    php.ini裡面有配置session的。設定改成redis或memcache,其他就不用管了

    回覆
    0
  • 高洛峰

    高洛峰2017-04-24 09:14:54

    個人覺得共享session只是一種共享資料的理念,將本來需要保存到session的資料遷移到redis進行保存,當然也需要像session一樣產生一個唯一的sessionID,然後傳遞給客戶端,並保存到cookie,客戶端每次要求的時候需要將改cookie一起傳送過來,然後從redis中取得對應的資料。
    其實說到共享session其實就是一個共享快取而已。

    當然我說的是理念,也許有工具可以直接將伺服器上的真正的session直接保存到redis,但是我覺得理念就是這樣的。

    回覆
    0
  • PHPz

    PHPz2017-04-24 09:14:54

    其實上面兩種方案都是可行的,首先第一種可以建構一個redis集群,來提高服務的穩定與效能,避免單點故障,導致session快取資料的遺失。第二種可以在額外的機器上另開一個redis服務,為了提高服務的穩定,可以建造一個主從。 cookie和session類似你在redis上面的key-value

    回覆
    0
  • 取消回覆