1. 程式人生 > >Nginx和Tomcat負載均衡實現session共享

Nginx和Tomcat負載均衡實現session共享

    以前的專案使用Nginx作為反向代理實現了多個Tomcat的負載均衡,為了實現多個Tomcat之間的session共享,使用了開源的Memcached-Session-Manager框架。

    此框架的優勢:

         1、支援Tomcat6和Tomcat7

          2、操作粘性或不黏性Session

          3、沒有單點故障

          4、Tomcat的故障轉移

          5、Memcached的故障轉移

          6、可插拔的Session序列化

          7、支援非同步儲存Session

          8、Sessions傳送到Memcached如果他確實修改了

          9、JMX管理和監控

    步驟:

            以下操作步驟的前提是你已經安裝了,Tomcat和Memcached,和已經配置了Nginx的負載,

           如果這些您都沒做,請先安裝和配置,這些網上有很多,不再多說。

       1、下載jar包

                 下載的jar有:

                     memcached-session-manager-1.5.1.jar, memcached-session-manager-tc6-1.5.1.jar, 

       2、把下載的jar包放到%TOMCAT_HOMT%\lib中。

       3、配置%TOMCAT_HOME%\config\context.xml

                在Context.xml檔案中加入

  
               <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
			memcachedNodes="n1:localhost:11211,n2:localhost:11212"			
			requestUriIgnorePattern=".*\.(png|gif|jpg|css|js){1}quot;
			sessionBackupAsync="false"
			sessionBackupTimeout="1800000"
			copyCollectionsForSerialization="false"
			transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
            
	       />

               也可在server.xml配置檔案的<Host>...<Host>中新增配置
                 
   <Context docBase="F:/tomcats/tomcat-7.0.2_2/webapps"  path= "/msm"  reloadable= "true"  >
		       <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
			memcachedNodes="n1:localhost:11211,n2:localhost:11212"			
			requestUriIgnorePattern=".*\.(png|gif|jpg|css|js){1}quot;
			sessionBackupAsync="false"
			sessionBackupTimeout="1800000"
			copyCollectionsForSerialization="false"
			transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
            
			/>
		 </Context>

         4、啟動Tomcat檢視Session是否共享成功。

     說明:

            1、 session儲存到memchached實現方案時。他主要功能是修改tomcat的session儲存機制,使之能夠把session序列化存放到memcached中。

       2、Manager標籤屬性說明:

             className

                    此屬性是必須的。

             memcachedNodes

                        此屬性是必須的。這個屬性必須包含你所有執行的memcached節點。每個節點的定義格式為<id>:<host>:<port>。

                   多個之間用空格或半形逗號隔開(如:memcachedNodes="n1:localhost:11211,n2:localhost:11212")。

                       如果你設定單個memcache節點<id>是可選的,所以它允許設定為<host>:<port>(memcachedNodes="localhost:11211")。

             failoverNodes

                      可選項,屬性只能用在非粘連Session機制中。

                      此屬性必須包含memcached節點的Id,此節點是Tomcat作為備份使用。多個之間用空格或逗號隔開

              memcachedProtocol

                   可選項,預設為text。出屬性指明memcached使用的儲存協議。只支援text或者binary。

              sticky 可選項,預設為true。

                    指定使用粘性的還是非粘性的Session機制。

              lockingMode 可選項, 此屬性只對非粘性Session有用,預設為none。

                     指定非粘性Session的鎖定策略。他的只有

                        (1)、none:從來不加鎖

                        (2)、all: 當請求時對Session鎖定,直到請求結束

                        (3)、auto:對只讀的request不加鎖,對非只讀的request加鎖

                        (4)、uriPattern:<regexp>: 使用正則表示式來比較requestRUI + "?" + queryString來決定是否加鎖,

             requestUriIgnorePattern  可選項

                        此屬性是那些不能改備份Session的請求的正則表示式。如果像css,javascript,圖片等靜態檔案被同一個Tomcat和同一個應用上下文來提供,這些

                   請求也會通過memcached-session-manager。但是這些請求在一個http會話中幾乎沒什麼改變,所以他們沒必要觸發Session備份。所以那些靜態檔案

                   沒必要觸發Session備份,你就可以使用此屬性定義。此屬性必須符合java regex正則規範。

            sessionBackupAsync 可選項,預設true

                        指定Session是否應該被非同步儲存到Memcached中。 如果被設定為true,backupThreadCount設定起作用,如果設定false,通過sessionBackupTimeout

                   設定的過期時間起作用。

            backupThreadCount 可選項,預設為CPU核心數。

                       用來非同步儲存Session的執行緒數(如果sessionBackupAsync="true")。

            sessionBackupTimeout  可選項,預設100,單位毫秒

                       設定備份一個Session所用的時間,如果操作超過時間那麼儲存失敗。此屬性只在sessionBackupAsync="false"是起作用。預設100毫秒

            sessionAttributeFilter 可選項 從1.5.0版本有

                       此屬性是用來控制Session中的那個屬性值儲存到Memcached中的正則表示式。鄭則表示式被用來匹配Session中屬性名稱。如

                  sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"屬性儲存到Memcached中。

                  依賴於選擇的序列化策略。

            transcoderFactoryClass 可選,預設為 de.javakaffee.web.msm.JavaSerializationTranscoderFactory

                       此屬性值是建立序列化和反序列化儲存到Memcached中的Session的編碼轉換器的工廠類名。這個指定的類必須實現了de.javakaffee.web.msm.TranscoderFactory

                 和提供一個無參的構造方法。例如其他的有效的實現在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer.

            copyCollectionsForSerialization 可選項,預設false。

            customConverter 可選項

            enableStatistics 可選項,預設true

                   用來指定是否進行統計。

            enabled 可選項,預設true

                    指定Session儲存到Memcached中是否可用和是否可以通過JMX進行改變。只用於粘性Session。