Nginx1.10.2+Tomcat7.0.69+Memcached1.4.15實現session共享集群


寫在前面

在分布式多tomcat web server集群環境下,首先要解決的是session的共享問題,實現思路一般來說有以下三種:
(1) session sticky:其實session sticky并不是session共享方案,而是多tomcat的集群方案,其需要配合nginx/apache實現,將同一用戶請求轉到相同的tomcat結點,多結點之間并不共享sesison。優點是可以實現簡單的用戶會話綁定,缺點就是結點故障時,節點上面的session會丟失。所以session sticky這種方案一般會配合下面兩種方式使用。
(2) session replication cluster:多tomcat節點之間進行session的同步,集群中的tomcat節點存儲相同的session會話信息。
(3) session server:將session集中存儲在同一個地方,如redis/memcached,甚至DB。此時,tomcat節點本身內存中并不存儲session。
本文采用session server的方式,主要講解使用memcached-session-manager組件搭建nginx + tomcat + memcached,實現集群和session共享存儲環境的大致過程。

實驗實現基于Nginx+Tomcat+Memcached的session共享集群

有關參考詳見https://github.com/magro/memcached-session-manager,簡單網絡拓撲如下圖所示:

Nginx1.10.2+Tomcat7.0.69+Memcached1.4.15實現session共享集群.jpg

實驗環境準備

搭建上圖所示的實驗環境
為了突出實驗的重點,一些部件如路由器、防火墻以及交換機等等一并省略,實驗環境在同一個網絡中。其中CLIENT是宿主機,其余的機器都采用的虛擬機(系統是centos7.3)。具體版本信息如下:
CentOS Linux release 7.3.1611 (Core)
Nginx 1.10.2
Tomcat 7.0.69
Memcached 1.4.15
說明版本信息的原因是后面使用的jar包可能對centos以及tomcat的版本有要求。
確保所有虛擬機上面的防火墻和selinux處于關閉狀態。
各節點時間必須同步
各節點之間通過主機名互相通信,建議使用/etc/hosts文件實現
各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信

實驗過程

一、配置Memcached
兩臺Memcached的配置是類似的,所以以Memcached1為例來說明一下配置的過程。

# 安裝Memcached
yum -y install memcached
# 協議格式使用二進制binary格式的話,需要安裝專用客戶端工具
yum install libmemcached  -y
# 啟動memcached
systemctl start memcached
ss -ntlu
# 測試,指令參考/usr/share/doc/memcached-1.4.15/protocol.txt
telnet 127.0.0.1 11211 
add mykey 1 600 15
hello memcached
STORED
get mykey
VALUE mykey 1 15
hello memcached
END
quit

二、配置Tomcat
兩臺Tomcat的配置類似,所以以Tomcat1為例來說明一下配置的過程。

# 安裝JDK
yum install java-1.8.0-openjdk-devel  
# 安裝tomcat
yum install tomcat tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
# 啟動tomcat,查看端口和服務是否正常,在客戶端用瀏覽器訪問測試一下
systemctl start tomcat
ss -ntlp
# 相關包下載,可參考https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
# 下載的包放在/usr/share/tomcat/lib目錄下
spymemcached-2.11.1.jar   javolution-5.4.3.1.jar  
memcached-session-manager-1.8.3.jar
memcached-session-manager-tc7-1.8.3.jar
msm-javolution-serializer-1.8.3.jar
# 修改server.xml
vim  /etc/tomcat/server.xml
# 在<Host name="localhost"  appBase="webapp unpackWARs="true" autoDeploy="true"> 里面添加Context
 <Context path="/myapp" docBase="myapp" reloadable="true">
                 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                 memcachedNodes="m1:192.168.1.14:11211,m2:192.168.1.16:11211"
                 failoverNodes="m2"
                 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
   transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" />
</Context>
# 準備webapp
cd /usr/share/tomcat/webapps/
mkdir myapp/{WEB-INF,META-INF,classes,lib} -pv
# 準備頁面
vim myapp/index.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA.magedu.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("magedu.com","magedu.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>
# 重啟tomcat
systemctl restart tomcat

Tomcat2除了/usr/share/tomcat/webapps/myapp/index.jsp配置不同,其余和Tomcat1是一樣的,Tomcat2的index.jsp配置如下:

<%@ page language="java" %>
<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="blue">TomcatB.magedu.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("magedu.com","magedu.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

三、配置Nginx

# 如果有安裝有apache,那么停掉服務
systemctl stop httpd
# 安裝nginx
yum install nginx
# 配置反代
vim /etc/nginx/nginx.conf
# 在http{}  里面添加
    upstream webgroup{
          server 192.168.1.7:8080;
          server 192.168.1.15:8080;
    }
# server{}修改的部分如下:
    server{
        index index.jsp index.html
        location / {
                    proxy_pass http://webgroup;
        }
    }
# nginx服務啟動
nginx

四、CLIENT訪問測試
在瀏覽器(建議用火狐瀏覽器)中輸入http://192.168.1.8/myapp/,訪問測試,頁面如下:

刷新一下瀏覽器,頁面如下:


發現兩次是調度到不同的機器上面,但是會話是同一個,session 共享已經實現。
把Memcached1上的memcached服務停掉。
刷新頁面,發現Memcached2充當了會話共享服務器。

注意:備用的memcached m2 啟用了,原來只是session復制同步過去,現在是啟用了。但是會話沒有發生改變。
把Memcached1上的memcached再次啟用。

可以注意到的是此時在工作的是Memcached2,不會再轉移回去的。
說明:不成功的原因,可能是包版本不匹配,比如報NoSuchFileError。


至此,自己的整理分享就結束了。還是有很多不足的地方,大家發現問題,希望多多指正。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容