Tomcat 入門實戰(4)--Tomcat 集群 Session 複製

来源:https://www.cnblogs.com/wuyongyin/archive/2023/04/02/17260877.html
-Advertisement-
Play Games

本文主要介紹在 Tomcat 集群中如何進行 Session 複製,文中所使用到的軟體版本:Centos 7.9.2009、Java 1.8.0_321、Tomcat 8.5.87。 1、快速配置 取消 conf/server.xml 文件中的以下註釋來啟用集群: <Cluster classNam ...


本文主要介紹在 Tomcat 集群中如何進行 Session 複製,文中所使用到的軟體版本:Centos 7.9.2009、Java 1.8.0_321、Tomcat 8.5.87。

1、快速配置

取消 conf/server.xml 文件中的以下註釋來啟用集群:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

使用上述配置將啟用 all-to-all 會話複製,它使用 DeltaManager 進行會話增量複製。all-to-all 意味著每個會話都將被覆制到群集中的所有其他節點。這對於較小的集群非常有效,但不建議在大型集群(超過4個節點左右)中使用它。此外,當使用 DeltaManage r時,Tomcat 將會話複製到所有節點,甚至是沒有部署該應用程式的節點。
為瞭解決這些問題,您將需要使用 BackupManager。BackupManager 僅將會話數據複製到一個備份節點,並且僅複製到已部署該應用程式的節點。一旦您使用 DeltaManage r運行了一個簡單的集群,您可能希望隨著增加集群中節點的數量而遷移到 BackupManager。

上述配置對應的詳細預設配置如下:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
         channelSendOptions="8">

  <Manager className="org.apache.catalina.ha.session.DeltaManager"
           expireSessionsOnShutdown="false"
           notifyListenersOnReplication="true"/>

  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
                address="228.0.0.4"
                port="45564"
                frequency="500"
                dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="auto"
              port="4000"
              autoBind="100"
              selectorTimeout="5000"
              maxThreads="6"/>

    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
      <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    </Sender>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
  </Channel>

  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
         filter=""/>
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
            tempDir="/tmp/war-temp/"
            deployDir="/tmp/war-deploy/"
            watchDir="/tmp/war-listen/"
            watchEnabled="false"/>

  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

以下是一些重要的預設值:
1、組播地址為 228.0.0.4
2、組播埠為 45564(埠和地址一起確定集群成員身份)
3、廣播的 IP 是 java.net.InetAddress.getLocalHost().getHostAddress()(確保不要廣播127.0.0.1,這是一個常見錯誤)
4、用於監聽複製消息的 TCP 埠是在 4000-4100 範圍內第一個可用的伺服器套接字
5、偵聽器配置為 ClusterSessionListener
6、配置了兩個攔截器 TcpFailureDetector 和 MessageDispatchInterceptor

2、Session 複製實現步驟

1、所有會話屬性必須實現 java.io.Serializable 介面。
2、在 conf/server.xml 文件中取消註釋 Cluster 元素。
3、如果您定義了自定義集群閥門,請確保在 conf/server.xml 文件的 Cluster 元素下也定義了 ReplicationValve。
4、如果 Tomcat 實例在同一臺機器上運行,確保每個實例的 Receiver.port 屬性是唯一的。在大多數情況下,Tomcat 可以通過自動檢測 4000-4100 範圍內可用埠來解決此問題。
5、確保應用的 web.xml 具有 <distributable/> 元素。
6、如果使用 mod_jk,請確保在 Engine(<Engine name="Catalina" jvmRoute="node01">) 中設置 jvmRoute 屬性,並且 jvmRoute 屬性值與 workers.properties 中的 worker 名稱匹配。
7、確保所有節點具有相同的時間並與 NTP 服務同步.
8、確保負載均衡器配置為粘性會話模式。

3、實際操作

3.1、規劃

IP 用途
10.49.196.10 8080 Tomcat1
10.49.196.11 8080 Tomcat2
10.49.196.13 8080 反向代理(Nginx)

3.2、修改 server.xml

取消 Tomcat 中 conf/server.xml 文件的以下註釋:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

3.3、添加 <distributable/>

這裡直接使用 Tomcat 自帶的應用 ROOT 做測試,在 webapps/ROOT/WEB-INF/web.xml 文件中增加 <distributable/>:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  metadata-complete="true">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  <distributable/>
</web-app>

3.4、添加測試頁面

新增 webapps/ROOT/index2.jsp 文件:

<body>
SessionID:<%=session.getId()%>
<br>
SessionIP:<%=request.getLocalAddr()%>
<br>
SessionPort:<%=request.getLocalPort()%>
</body>

3.5、配置反向代理

Nginx 的配置如下:

upstream tomcat {
  server 10.49.196.30:8080;
  server 10.49.196.31:8080;
}

server {
  listen 7070;
  server_name  localhost;
  
  location / {
    proxy_pass  http://tomcat;
  }
}

3.6、測試

啟動兩個 Tomcat 及 Nginx,訪問代理頁面:

 

多次訪問代理頁面,可以看到 IP 不停的變化,但 SessionID 不變,說明 Session 複製有效。

 

 

參考:https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 準備一些操作(Action)? 到目前為止,我們主要通過聲明欄位和視圖來構建模塊。在任何真實的業務場景中,我們都希望將一些業務邏輯鏈接到操作按鈕。在我們的房地產示例中,我們希望能夠: 取消或將房產設置為已售出 接受或拒絕報價 有人可能會說,我們已經可以通過手動更改狀態來完成這些事情,但這並不太方便。 ...
  • 3 月的碎碎念,大致總結了商業人生、付費軟體、創業方向選擇、創業感性還是理性、如何解決複雜問題及如何成長這幾個方面的內容。 商業人生 商業人生需要試錯能力和快速信息收集與驗證校準; 商業邏輯需要試錯能力,收集各種渠道信息後整理決策。快速信息收集和驗證校準很重要。 付費軟體 付費軟體產品可以依托大平臺 ...
  • 概述 背景 函數式編程的理論基礎是阿隆佐·丘奇(Alonzo Church)於 1930 年代提出的 λ 演算(Lambda Calculus)。λ 演算是一種形式系統,用於研究函數定義、函數應用和遞歸。它為計算理論和電腦科學的發展奠定了基礎。隨著 Haskell(1990年)和 Erlang(1 ...
  • 一門語言教程被搜索的次數越多,大家就會認為該語言越受歡迎。這是一個領先指標。原始數據來自谷歌Trends 如果您相信集體智慧,那麼流行編程語言排名可以幫助您決定學習哪門語言,或者在一個新的軟體項目中使用哪一門語言 ...
  • 請編寫一個程式,使用兩個線程分別輸出數字和字母,要求輸出的結果為:1A2B3C4D5E6F7G8H9I10J。 提示:可以使用Java中的wait()和notify()方法來實現線程間的通信。 public class NumberLetterPrinter { // 定義一個靜態的鎖對象 priv ...
  • 原文鏈接: Go 語言數組和切片的區別 在 Go 語言中,數組和切片看起來很像,但其實它們又有很多的不同之處,這篇文章就來說說它們到底有哪些不同。 另外,這個問題在面試中也經常會被問到,屬於入門級題目,看過文章之後,相信你會有一個很好的答案。 數組 數組是同一種數據類型元素的集合,數組在定義時需要指 ...
  • 流程式控制制 選擇結構(分支語句) ​ 因為switch只能匹配固定值,推薦使用if-else做條件篩選 if-else判斷 package main import "fmt" func main() { var tmpA int fmt.Scanln(&tmpA) if tmpA >= 90 { fm ...
  • 一 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》 下載nacos https://github.com/alibaba/nacos nacos-server-2.0.3.zip Windows 版 解壓後,資料庫新建nacos庫,將 X:\nacos\ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...