在實際生產中,咱們經常會面臨這樣一個問題,那就當咱們經過負載均衡調度器進行調度處理時,不一樣的後端主機須要對客戶的訪問會話進行狀態保持。也就是說,當調度器將用戶的請求進行代理調度時,用戶與後端服務器之間創建的Session會話不能丟失,各主機之間在處理用戶請求時,都要可以對用戶的會話進行處理。
那麼被調度的不一樣後端主機是如何共享用戶的Session呢?接下來,咱們來介紹一種常見的方式,也是實際生產中常常使用到的一種方式,使用memcached配合tomcat搭建Seesion Server。css
首先來看一下,下面的拓撲結構。html
序號 | 擔任角色 | 主機名 | 地址 | 功能描述 | 對應軟件版本 |
---|---|---|---|---|---|
A | Nginx均衡調度器 | nginx | 172.18.2.66 | 利用Nginx的調度功能首先負載均衡 | Nginx-1.10.2 |
B | web服務器 | tomcat1 | 172.18.2.77 | 安裝tomcat,用來提供動態web服務 | tomcat-7.0.69-10.e17 |
C | web服務器 | tomcat2 | 172.18.3.77 | 安裝tomcat,用來提供動態的web服務 | tomcat-7.0.69-10.el7 |
D | SessionServer | session1 | 172.18.253.175 | 安裝memcached,提供Session存儲服務,同時充當SessionServer的主節點 | memcached-1.4.15 |
E | SessionServer | session2 | 172.18.254.5 | 安裝memcached,提供session存儲服務,同時充當SessionServer備用節點 | memcached-1.4.15 |
首先同步全部主機的主機時間,在各個主機中安裝所須要的應用軟件。java
[root@nginx ~]$yum install nginx [root@tomcat1 ~]#yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp -y [root@tomcat2 ~]#yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp -y [root@session1 ~]# yum install -y memcached [root@session2 ~]# yum install -y memcached
啓動相應的服務。linux
在tomcat中,添加簡單的示例應用程序。nginx
[root@tomcat1 ~]#mkdir -pv /usr/share/tomcat/webapps/test/WEB-INF/lib
而後在test目錄下添加一個簡單的index.jsp文件。並將內容進行適當的修改,以區分兩個不一樣的服務。git
<%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatA.pojun.tech</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("pojun.tech","pojun.tech"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
對Nginx進行配置,使其可以將用戶的請求均衡調度到後端的WebServer。github
# # The default server # upstream tcsrvs{ server 172.18.2.77:8080; server 172.18.3.77:8080; } server { listen 80 default_server; 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 http://tcsrvs; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
此時,在瀏覽器地址欄輸入
http://172.18.2.66/test/
就能看到,瀏覽器的請求已經被調度到TomcatA 和TomcatB 兩臺主機上了。web
接下來,咱們就開始給Tomcat配置支持memcached的服務支持,能夠參考官方文檔的介紹。 redis
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration後端
在官方指導文檔上下載本身須要的jar包,並存放在指定值得目錄下,兩個tomcat一樣的配置。 可參考下圖。
在tomcat的server.xml配置文件中的Host節點下,加入以下內容。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/test" docBase="/usr/share/tomcat/webapps/test" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.18.253.175:11211,n2:172.18.254.5:11211" failoverNodes="n2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context> ... </Host>
配置成功以後,將tomcat從新啓動就好。
使用瀏覽器訪問
http://172.18.2.66/test
查看調度結果,以及會話的保持效果。
memcached是一款很常見的緩存服務,一般會結合Tomcat實現Session緩存以用於進行會話保持。可是,memcached自己只能存儲序列化的內容,而且全部的存儲都存儲在內存中,不具有持久性存儲的特性,所以在實際的使用過程當中一般都會有兩個memcached服務器來以主備模式提供服務。 相比於memcached服務,redis也可以實現相似的功能,並且redis還具備持久化存儲的特性,這樣可以提供更加穩定的服務,關於redis的使用,咱們之後會繼續介紹。