Tomcat+memcached+Nginx實現session共享 |
1.文檔簡要說明
2.文檔相關內容地址:
2.1相關軟件包及下載地址
官方網址:
MSM: http://code.google.com/p/memcached-session-manager/
Memcached:http://memcached.org/
最新穩定包下載地址:
http://code.google.com/p/memcached-session-manager/downloads/list
2.2相關配置文件模板及地址
相關依賴的jar包可從此配置文件模板中的鏈接下載
http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
2.3相關文檔地址
Memcached安裝:\hdmusic\trunk\docs\系統部署\Memcached\Memcached安裝.doc
Tomcat安裝:\hdmusic\trunk\docs\系統部署\Tomcat\Tomcat+Jdk安裝.doc
Nginx安裝:\hdmusic\trunk\docs\系統部署\Nginx\nignx安裝.doc
Nginx+tomcat整合:\hdmusic\trunk\docs\系統部署\Nginx\Nginx+Tomcat實現負載均衡動靜分離.doc
3.文檔內容:
3.1原理介紹:
MSM(memcached-session-manager)支持tomcat6和tomcat7,利用Value(Tomcat閥)對Request進行跟蹤。Request請求到來時,從memcached加載session,Request請求結束時,將tomcat session更新至memcached,以達到session共享之目的,支持sticky和non-sticky模式。 Sticky 模式:tomcat session 爲主session,memcached 爲備session。Request請求到來時,從memcached加載備session 到tomcat (僅當tomcat jvmroute發生變化時,否則直接取tomcat session);Request請求結束時,將tomcat session更新至memcached,以達到主備同步之目的。 Non-Sticky模式:tomcat session爲中轉session,memcached1爲主sessionmemcached 2 爲備session。Request請求到來時,從memcached 2加載備session 到tomcat,(當容器中還是沒有session 則從memcached1加載主session 到tomcat,這種情況是隻有一個memcached節點,或者有memcached1出錯時),Request請求結束時,將tomcat session更新至主memcached1和備memcached2,並且清除tomcat session 。以達到主備同步之目的。 |
3.2下載msm的jar包,並將其放置tomcat的lib目錄下
tc6和tc7分別對應tomcat6和tomcat7,若需添加一個jar便可。 必須jar:memcached-session-manager-${version}.jar memcached-session-manager-tc6-${version}.jar memcached-session-manager-tc7-${version}.jar 根據序列化選擇jar:kryo效率在高可用時效率最高,但併發量不大時比較一般。 kryo-serializer: msm-kryo-serializer, kryo-serializers, kryo, minlog, reflectasm, asm-3.2 javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1 xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min flexjson-serializer: msm-flexjson-serializer, flexjson |
3.3流程圖
1.sticky 2.non-sticky |
3.4修改tomcat/conf/context.xml文件,在<Context>添加如下內容:
配置內容及官方截圖如下: sticky: #nano /usr/local/tomcatA/conf/context.xml 在< Context>< /Context>中加入以下內容 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.1.123:11211,n2:192.168.1.129:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/> non-sticky <ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.1.146:11211,n2:192.168.1.1145:11211,n3:192.168.1.146:11212" 官方截圖: |
3.5配置解釋:
t1(m1): 192.168.1.145 t2(m2):192.168.1.146 t1配置n1:192.168.1.145:11211 n2:192.168.1.146:11211 t2配置n1:192.168.1.146:11211 n2:192.168.1.145:11211 <t1><t2> sticky:採用Sticky配置時,tomcat默認維持向n2的session訪問(建議不要把n2放在本機上,以防t1的機子宕機時tomcat等全部被關閉),當n2宕掉時,會轉而訪問n1的session。 non-sticky:採用Non-sticky時,tomcat會分發請求,並不維持對同一個tomcat的訪問,而是通過輪詢的方式隨機訪問。即tomcat隨機對n1、n2的訪問,建議搭載成三個memcached,三臺機的session互爲備份,當其中一個memcached失效時一臺轉爲主要memcached,另外一臺依舊可以備份。 |
3.6測試(此處的jsp僅列出body內容,測試服務器145、146)
n1:192.168.1.146:11211,n2:192.168.1.145:11211,n3:192.168.1.146:11212 輸入內容:save.jsp <body> <FORM METHOD=POST ACTION="index.jsp"> What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20> <P><INPUT TYPE=SUBMIT> </FORM> </body> 獲得sessionid:index.jsp <body> <% String name = request.getParameter( "username" ); session.setAttribute( "theName", name ); %> This is my JSP page. <br> <%=session.getId()%> <A HREF="next.jsp">Continue</A> </body> 得到sessionid及session值: next.jsp <body> <%=session.getId()%><br> Hello, <%= session.getAttribute("theName")%> </body> 查看memcached是否啓動。 #ps –A|grep memcached Memcached未宕機時: 可知145訪問的是n2的session,宕掉145的memcached,再次訪問next.jsp,訪問結果如下: 如上圖所示,宕掉n2後,轉而訪問n3的session,得到session值依舊是123,再次宕掉n3,訪問截圖如下: 宕掉n1: 至此,所以session均被清空,重啓三臺memcached後,session值爲null。 |
3.7Memcached對web項目的要求
要求web項目需要序列化,否則,類似於後臺登陸系統會報未必序列化錯誤。 |
3.8Nginx+memcached+tomcat實現session共享
剩餘步驟中,只需實現nginx+tomcat的負載均衡和動靜分離便可,詳細請打開,此處不做詳細實現。 \hdmusic\trunk\docs\系統部署\Nginx\Nginx+Tomcat實現負載均衡動靜分離.doc |
3.9待續
配置內容及相關命令在表格 |