Tomcat/Memcached實現會話保持(SessionServer)

前言

        在實際生產中,咱們經常會面臨這樣一個問題,那就當咱們經過負載均衡調度器進行調度處理時,不一樣的後端主機須要對客戶的訪問會話進行狀態保持。也就是說,當調度器將用戶的請求進行代理調度時,用戶與後端服務器之間創建的Session會話不能丟失,各主機之間在處理用戶請求時,都要可以對用戶的會話進行處理。
        那麼被調度的不一樣後端主機是如何共享用戶的Session呢?接下來,咱們來介紹一種常見的方式,也是實際生產中常常使用到的一種方式,使用memcached配合tomcat搭建Seesion Server。css

實驗拓撲結構

    首先來看一下,下面的拓撲結構。html

tomcat+memcached.jpg
序號 擔任角色 主機名 地址 功能描述 對應軟件版本
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中添加簡單的站點測試程序

    在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的反向代理

        對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服務

        接下來,咱們就開始給Tomcat配置支持memcached的服務支持,能夠參考官方文檔的介紹。 redis

https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration後端

        在官方指導文檔上下載本身須要的jar包,並存放在指定值得目錄下,兩個tomcat一樣的配置。 可參考下圖。

tomcat包的存放位置

tomcat%E5%8C%85%E5%AD%98%E6%94%BE%E4%BD%

webapp包的存放位置

serializer%E5%8C%85%E5%AD%98%E6%94%BE%E4

        在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 查看調度結果,以及會話的保持效果。

http://ot2trm1s2.bkt.clouddn.com/Linux/2017-11-07-linux-pro-command-7/session_server.gif

總結

        memcached是一款很常見的緩存服務,一般會結合Tomcat實現Session緩存以用於進行會話保持。可是,memcached自己只能存儲序列化的內容,而且全部的存儲都存儲在內存中,不具有持久性存儲的特性,所以在實際的使用過程當中一般都會有兩個memcached服務器來以主備模式提供服務。        相比於memcached服務,redis也可以實現相似的功能,並且redis還具備持久化存儲的特性,這樣可以提供更加穩定的服務,關於redis的使用,咱們之後會繼續介紹。

相關文章
相關標籤/搜索