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,
jar包下載地址:http://code.google.com/p/memcached-session-manager/downloads/list
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。
更多說明請看:http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration