您好,登錄后才能下訂單哦!
寫在前面
前一篇文章為大家解釋說明了會話的類型,今天這篇文章將帶領大家一步一步實現一個簡單的session server,主要是讓大家理解session server的工作過程,當然了對于中小向站點,這個結構也完全夠用了。本節主體結構:
memcached-session-manager介紹
網絡拓撲結構
Nginx反向代理配置
Tomcat配置
memcached配置
測試
錯誤分析
memcached-session-manager介紹
memcached-session-manager是一個將會話保存在memcached或Redis中的tomcat會話管理器,用于高可用的,可伸縮和容錯的Web服務場景中。 它支持粘性和非粘性配置,目前正在使用tomcat 6.x,7.x和8.x. 對于粘性會話,支持會話故障轉移(tomcat崩潰),對于非粘性會話,這是默認的(對于不同的請求,會話由不同的tomcats默認提供)。 此外memcached故障轉移(memcached崩潰)通過會話遷移來實現。 也不應該有單點故障,所以當memcached失敗時,會話不會丟失并且可以在tomcat或其他memcached中使用。
在配置上你必須把spymemcached jar和memcached-session-manager jar放到tomcat對應的lib目錄下。 如果您想使用Redis而不是memcached,則需要使用Redis客戶端“jedis”對應的.jar包, 還需要在Manager類并添加一些配置屬性以便能夠實現將會話存儲至memcached中,memcached自身不具有配置功能,必須依賴前端的Tomcat或其他類服務器。
對于一個簡單的實現,您只需要安裝一個tomcat(6,7或8)和一個memcached或Redis(或支持memcached協議的s.th.)。 在您的生產環境中,您可能會擁有多個tomcats,并且在不同的硬件上也應該有多個memcached節點可用。 或者,您可以將會話數據存儲在Redis中而不是memcached中。 您可以使用粘性會話或非粘性會話,memcached-session-manager(msm)支持兩種操作模式。
memcached-session-manager項目地址,http://code.google.com/p/memcached-session-manager/
網絡拓撲結構
這里主要是用于一臺Nginx實現前端調度,后面連接兩臺Tomcat應用程序服務器,在tomcat的后端添加兩臺memcached存儲,實現一個小型的架構,當然了這里省略了離客戶端最近的DNS服務器,以及靠近用戶的一個負載均衡集群,以及負載均衡之后的緩存服務器集群。其簡單架構與網絡地址規劃如下:
本文的所有主機都是centos7.3版本
Nginx反向代理配置
對于nginx來說,這本實驗中只是起了調度的作用,即反向代理的作用,并沒有實現動靜分離,路徑重寫等操作,這里主要是將客戶端的請求調度至后端應用程序服務器Tomcat。所以配置起來就顯得容易的多,只需要定義一個upstream組即可。然后按相應的算法調度即可。集體配置如下:
[root@vin ~]# vim /etc/nginx/nginx.conf ... http { upstream vinsent { # 定義服務器集群 server 192.168.14.66:8080; server 192.168.14.77:8080; } server { listen 80 ; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass # 將請求代理至后端Tomcat服務器 } ... }
Tomcat配置
Tomcat作為應用程序服務器,主要作用是處理jsp文件,在這里,我們需要提供一個用于測試的文件index.jsp以及對應版本的.jar包。主要是memcached-session-manager相關的jar包,和用于將前端的用戶的cookie信息序列化成”鍵-值”格式的工具,
1)安裝tomcat及相關的服務包
[root@vin tools]# cat /etc/redhat-release # 版本檢測 CentOS Linux release 7.3.1611 (Core) [root@vin tools]# iptables -F # 關閉防火墻與selinux [root@vin tools]# setenforce 0 [root@vin tools]# yum install java-1.7.0-openjdk-devel.x86_64 # 安裝jdk [root@vin tools]# yum installtomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
2)提供context容器
分別在兩個tomcat上的某host上定義一個用于測試的context容器,并在其中創建一個會話管理器。
[root@vin webapps]# vim /etc/tomcat/server.xml ... <Host name="node1.vin.cn" appBase="/data/webapps" autoDeploy="true"> <Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.14.99:11211,n2:192.168.14.88:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context> </Host> ...
3)分別為兩個context提供測試頁面
測試目錄的結構如下
[root@vin webapps]# cat /usr/share/tomcat/webapps/test/index.jsp <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h2><font color="green">TomcatA.vinsent.cn</font></h2> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("vinsent.cn","vinsent.cn"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> # 說明:為了看到這個過程,你在TomCatB主機上應該將修改為TomcatB.vinsent.cn
4)下載jar包
這里的jar包主要分為兩類,一種是memcached-session-manager相關的包,還有一種是與序列化相關的包:序列化包主要有4大類:
kryo-serializer: msm-kryo-serializer, kryo-serializers-0.34+, kryo-3.x, minlog, reflectasm, asm-5.x, objenesis-2.x
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
下載地址:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
在這里我們選擇分開放置,當然了你也可以全部放置在lib目錄下:
[root@vin webapps]# tree /usr/share/tomcat/webapps/test/ /usr/share/tomcat/webapps/test/ ├── index.jsp └── WEB-INF └── lib ├── javolution-5.4.3.1.jar └── msm-javolution-serializer-2.1.1.jar 2 directories, 3 files [root@vin webapps]# ls /usr/share/tomcat/lib/ annotations-api.jar extras tomcat7-websocket.jar tomcat-jsp-2.2-api.jar catalina-ant.jar jasper-el.jar tomcat-api.jar tomcat-juli.jar catalina-ha.jar jasper.jar tomcat-coyote.jar tomcat-servlet-3.0-api.jar catalina.jar jasper-jdt.jar tomcat-el-2.2-api.jar tomcat-util.jar catalina-tribes.jar log4j.jar tomcat-i18n-es.jar websocket-api.jar commons-collections.jar memcached-session-manager-2.1.1.jar tomcat-i18n-fr.jar commons-dbcp.jar memcached-session-manager-tc7-2.1.1.jar tomcat-i18n-ja.jar commons-pool.jar spymemcached-2.12.3.jar tomcat-jdbc.jar
Memcached配置
對于memcached服務器的配置其實很簡單,由于memcached自身不能夠主動存儲cookie信息,只需要在memcached服務器上安裝memcached服務就行,至于對數據進行序列化則是由前面的服務器來實現的。
[root@vin ~]# yum install memcached # 安裝memcached,我已安裝 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Package memcached-1.4.15-10.el7.x86_64 already installed and latest version Nothing to do [root@vin ~]# systemctl start memcached # 啟動服務 [root@vin ~]# ss -tnl | grep 1121 # 檢查服務是否正常啟動 LISTEN 0 128 *:11211 *:* LISTEN 0 128 :::11211 :::*
測試
我們在客戶端進行測試。在瀏覽器中輸入nginx的地址:刷新你會看到,訪問的內容發生了改變,但是cookie值并沒有發生改變。
錯誤分析
1 序列化出現故障
常見現象如下,沒次訪問cookie值都會隨著改變,說明為存儲至memcached數據庫中。
2 訪問時提示404錯誤頁
這種情況多數是context為配置正確,或則在提供的index.jsp文件所在的目錄結構錯誤
3 版本不對應
如果你能排除以上錯誤,仍然不能訪問的話,說明你提供的jar包版本與你的tomcat版本不一致。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。