1. 程式人生 > >tomcat+nginx 分散式叢集 redis實現session共享

tomcat+nginx 分散式叢集 redis實現session共享

一、理解session、cookie首先要明確session和cookie的區別。瀏覽器端 存的是cookie每次瀏覽器發請求到服務端是http 報文頭是會自動加上你的cookie資訊的。服務端拿著使用者的cookie作為key去儲存裡找對應的value(session).

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

只要保證多臺業務伺服器訪問同一個redis伺服器(或叢集)就行了。二、為什麼要共享session?        我們使用單臺Tomcat的時候不會有共享sesssion的疑慮,只要使用Tomcat的預設配置即可,session即可儲存在Tomcat上。
但是隨著業務的擴大,增加Tomcat節點構成Tomcat叢集大勢所趨,分散式帶來了增加更大規模併發請求的優勢,但是也隨之到來了一個問題,每個Tomcat只儲存來訪問自己的請求產生的session,如果Tomcat-A已經為客戶端C建立了會話session,那麼Tomcat-B並不知道客戶端已與叢集中的Tomcat-A產生了會話,在訪問時就會為C再建立一份session,如果是基於session的驗證會話許可權的介面(如使用者登入認證後才可訪問的資料介面),將會導致在訪問叢集中不同節點的時候重複認證。session的不共享導致原來的會話管理機制在Tomcat叢集中無法工作。所以,如果有一個Tomcat叢集都能訪問的公共session存取區就好了,基於這個概念,我們想到了使用Redis來做這個session公共存取區,這樣子的話就有一個統一管理回話的地方了。回看我們上文提到的例子,如果Tomcat-A已經為客戶端C建立了會話session,這個session資訊會直接儲存在公共的Redis裡面,那麼Tomcat-B就可以到公共session儲存區裡獲得已為C產生的session,這樣的結果是叢集的公共session存取區在邏輯上就像一個tomcat的內部session存取區一樣了。
三、解決1、如果在Tomcat6或Tomcat7下部署,直接將以下jar檔案到Tomcat的lib下即可:commons-pool2-2.2.jarjedis-2.5.2.jartomcat-redis-session-manage-tomcat7.jar2、配置tomcat配置檔案conf/context.xml<ValveclassName="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /><ManagerclassName="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost"             <!--Redis地址 -->

    port="6379"                  
<!-- Redis埠 -->
    password="123456"            
<!-- Redis密碼 -->
    database="0"                 
<!-- 儲存Session的Redis庫編號 -->
    maxInactiveInterval="60"     
<!-- Session失效的間隔(秒) -->
    />
這樣一來我們的tomcat即可把session的管理交由我們配置的redis來處理。需要注意的是,如果在Tomcat8下按照上述部署,會在啟動時報錯,筆者檢視過原因,是tomcat-redis-session-manager最後更新的年代相隔較久,程式碼中使用的Tomcat api出現了過時刪去的情況,在Tomcat8下會出現問題,如果想在Tomcat8下使用,需要自行對過時的api進行修改,替換成新的Tomcat api。(以上即可解決session共享問題,第四點是關於redis叢集,使系統更穩定的設定)四、基於sentinel的redis叢集搭建

上文介紹的方法其實已經可以搭建一個完整的Tomcat叢集了,如果系統想要一個更安全可靠的環境,那麼nginx其實也可以做叢集,這裡略去不說,我們想要說的是redis叢集。

上面我們已經說到redis是session的公共儲存區,如果redis不幸掛掉的話將會導致致命的問題,因為無session源可取,Tomcat中有session讀取的介面會直接報錯。所以搭建一個redis叢集還是很有必要的,幸好redis對分散式HA的搭建支援得很好,原生即有一套sentinel哨兵機制即可用。

以sentinel模式啟動的redis例項起到了監控者的作用,redis叢集以master-slave的模式啟動,訊息不再直接發給redis例項,而是發給sentinel,由sentinel同步至所有的redis例項,如果出現redismaster例項掛掉的情況,會由sentinel發現,根據配置還可以由sentinel自己組成的叢集去選舉產生新的master,新的master將會承擔起作用,起到了災難自動回恢復的作用。

這裡來說一下sentinel叢集的配置:
我們使用兩個redis例項來組成master-slave,需要三個sentinel組成哨兵叢集來監控兩個redis例項,在master出現問題的時候選舉產生新的master。
路徑假設如下:
redis1
redis2
sentinel1
sentinel2
sentinel3

配置redis1/redis.conf為master:

    bind 127.0.0.1
    port 6379

配置redis2/redis.conf為redis1的slave:

    bind 127.0.0.1
    port 6379
    slaveof <redis1_ip> 6379

配置sentinel1/redis-sentinel.conf

    port 26379    
    sentinel monitor mymaster <redis1_ip> 6379 2

指定redis1為master,slave資訊會在啟動後被sentinel監聽到並自動寫入到配置檔案中,因此不需要手動寫入,最後的quorum表示當有2個sentinel判斷master掛掉的時候即可選舉slave為新的master。

sentinel2sentinel3配置相同。

這樣之後啟動redis和sentinel叢集,即可構建一個高可用的redis叢集。可以嘗試一下把redis1這個master掛掉,sentinel就會探查到並且在2個sentinel都探查到的時候即會選舉產生新的master:

# +monitor master mymaster <redis1-ip> 6379 quorum 2
# +sdown master mymaster <redis1-ip> 6379

同時我們的Tomcat配置也將改為使用sentinel叢集的版本:

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         sentinelMaster="mymaster"
         sentinels="<sentinel1-ip>:26379,<sentinel2-ip>:26379,<sentinel3-ip>:26379"
         maxInactiveInterval="60"/>

這個叢集搭建完成後,我們的系統將會更為穩定:

相關推薦

tomcat+nginx 分散式叢集 redis實現session共享

一、理解session、cookie首先要明確session和cookie的區別。瀏覽器端 存的是cookie每次瀏覽器發請求到服務端是http 報文頭是會自動加上你的cookie資訊的。服務端拿著使用者的cookie作為key去儲存裡找對應的value(session).同

Nginx+Tomcat搭建叢集,Spring Session+Redis實現Session共享

小夥伴們好久不見!最近略忙,部落格寫的有點少,嗯,要加把勁。OK,今天給大家帶來一個JavaWeb中常用的架構搭建,即Nginx+Tomcat搭建服務叢集,然後通過Spring Session+Redis實現Session共享。 閱讀本文需要有如下知識點:

Nginx+Tomcat+Redis實現session共享

linux nginx tomcat redis session 通過Nginx作為前端的負載,把請求分發到後端的Tomcat服務器上,提高並發數;但是單純的通過Nginx的ip_hash負載是很多問題的。只要用戶一切換網絡或者後端Tomcat主機宕機session就失效;架構圖:基本環境

springboot專案Nginx+Tomcat實現負載均衡結合Redis實現session共享問題

對於分散式使用Nginx+Tomcat實現負載均衡,當同一個使用者登入後,再次訪問可能分發到不同的服務,這樣我們就取不到之前登入session,出現未登入現象。所以我們必須解決共享session問題。  方式一:儲存在資料庫中 , 使用者登入時,把session資訊儲存在資

nginx+redis實現session共享 .NET分布式架構

serve 1.4 應用程序 mode itl provider disco rtu htaccess 上兩篇文件介紹了如何安裝和封裝redis 本篇主要是記錄下怎麽實現 nginx+redis實現session共享 目前session問題點 又愛又恨的Session

我的tomcat+redis實現session共享配置之路

2、在myeclipse 新建一個maven專案【maven-archetype-quickstart】 原始檔新建包名com.orangefunction.tomcat.redissessions 講下載下來的java類拷貝到該包之下(這些java類只

tomcat叢集redis配置session共享

針對之前的nginx+tomcat的負載均衡機制,因為會出現session丟失的問題,特研究了下redis的session共享;下載JDK7、tomcat7以備後續測試; 這裡要對tomcat-redis-session打包做一下特殊記錄: 上圖中的構建pom.xm

springBoot+redis 實現session共享理解,應用場景單點登入,分散式應用。

Springboot+redis 實現session共享也是利用了cookie在域名,路徑相同的情況下可以共享內容。第一次請求會將SESSION儲存在redis中,並將SESSIONID返回到瀏覽器的cookie中,第二次請求會攜帶上第一次請求的JSESSIONID。服務端拿

tomcat + redis 實現session共享

實現原理很簡單 1、需要幾個包放在tomcat/lib下面 tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar(tomcat7) tomcat-r

Tomcat 使用redis實現session共享

測試架構:準備工作:1.安裝nginx nginx.conf的編輯:2.同一臺機器配置兩個tomcat ,修改埠3.修改 tomcat\tomcat8080\apache-tomcat-7.0.86\webapps\ROOT\index.jsp新增:測試統一請求沒有sessi

php分布式redis實現session共享

code handler database auth 內容 cnblogs markdown pat edi 方法一:找到配置文件php.ini,修改為下面內容,保存並重啟服務 session.save_handler = redis session.save_path =

Tomcat集群使用Memcached實現Session共享

tomcatSession是什麽?用戶訪問服務器資源主要分成兩類,一類是無狀態訪問,例如請求一張圖片。另一類是有狀態訪問,這種情況下,服務器需要記錄追蹤用戶狀態,並根據用戶所處狀態做出不同響應,典型的例子是購物車。Session的作用就是在Web服務器上保持用戶的狀態信息。Tomcat集群為什麽需要Sessi

Spring Session Data Redis實現session共享

web.xml odi 數據庫 tails spool ima 配置步驟 配置文件 work 1.前言   在開發中遇到一個關於用戶體驗的問題,每次當運維進行更新重啟服務器時,都會導致會員平臺中已登錄的用戶掉線。這是因為每個用戶的會話信息及狀態都是由session來保存的,

CentOS7 PHP+Redis實現Session共享

先yum簡單的安裝redis wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/epel-7.repo yum -y install redis 簡單配置一下: vim /etc/redis.conf d

Spring-Session+Redis實現session共享

1、新增依賴 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId>

使用redis實現session共享(基於Spring Boot)

Session 共享 什麼是 Session 由於 HTTP 協議是無狀態的協議,所以服務端需要記錄使用者的狀態時,就需要用某種機制來識具體的使用者。Session 是另一種記錄客戶狀態的機制,不同的是 Cookie 儲存在客戶端瀏覽器中,而 Session 儲存在伺服器上。客戶端瀏覽器訪問

使用Spring-Session Redis實現Session共享

知其然,還要知其所以然 ! 本篇介紹Spring-Session的整個實現的原理。以及對核心的原始碼進行簡單的介紹! 實現原理介紹 實現原理這裡簡單說明描述: 就是當Web伺服器接收到http請求後,當請求進入對應的Filter進行過濾,將原本需要由web伺服器

springboot+springsession+redis實現session共享

專案結構 1、springboot整合Redis以及springSession,需要在POM檔案中增加依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/P

SpringBoot+SpringSession+Redis實現session共享及單點登入

最近在學習springboot,session這個點一直困擾了我好久,今天把這些天踩的坑分享出來吧,希望能幫助更多的人。 一、pom.xml配置  <dependency> <groupId>org.springframework.boot

SprinMvc+Redis 實現session共享

一.session共享的應用場景    每個客戶端與伺服器互動時生成會話的sessionID是唯一,同個客戶端在訪問不同的域名:主域名、子域名、跨站點域名或跨伺服器域名,會有不同的sessionID,有些應用程式會在session存放使用者的狀態和資訊,同個應用程式的客戶端