web server apache tomcat11-18-clusting 集群

前言

整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。

开源项目

从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。

系列文章

web server apache tomcat11-01-官方文档入门介绍

web server apache tomcat11-02-setup 启动

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

...

clusting

急于求成

只需将以下内容添加到您的 <Engine><Host> 元素中即可启用集群。

使用上述配置将启用所有节点间的会话复制,使用 DeltaManager 复制会话增量。所谓的全对全,是指每个会话都会复制到集群中的所有其他节点。这在较小的集群中效果很好,但我们不建议在较大的集群中使用 — 多于 4 个节点左右。此外,当使用 DeltaManager 时,Tomcat 将会话复制到所有节点,甚至那些未部署应用的节点。

为了解决这些问题,您将希望使用 BackupManager。BackupManager 仅将会话数据复制到一个备用节点,并且仅复制到已部署应用的节点。一旦您使用 DeltaManager 运行了简单的集群,随着您增加集群中节点的数量,您可能希望迁移到 BackupManager。

以下是一些重要的默认值:

  • 多播地址为 228.0.0.4
  • 多播端口为 45564(端口和地址一起确定了集群成员身份)
  • 广播的 IP 是 java.net.InetAddress.getLocalHost().getHostAddress()(确保不要广播 127.0.0.1,这是一个常见的错误)
  • 监听复制消息的 TCP 端口是范围在 4000-4100 的第一个可用服务器套接字
  • 配置了监听器 ClusterSessionListener
  • 配置了两个拦截器 TcpFailureDetector 和 MessageDispatchInterceptor

以下是默认的集群配置:

<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>

我们将在本文档后面更详细地介绍这一部分。

安全性

集群实现是基于在所有集群相关的网络流量中使用安全、可信任的网络的前提下编写的。在不安全、不可信任的网络上运行集群是不安全的。

为 Tomcat 集群提供安全、可信任的网络有许多选项,包括:

  • 私有 LAN
  • 虚拟专用网络(VPN)
  • IPSEC

EncryptInterceptor 提供了机密性和完整性保护,但它不能保护免受在不可信任网络上运行 Tomcat 集群时可能发生的所有风险,特别是 DoS 攻击。

集群基础知识

要在您的 Tomcat 11 容器中运行会话复制,应完成以下步骤:

  • 所有会话属性都必须实现 java.io.Serializable
  • 在 server.xml 中取消注释 Cluster 元素
  • 如果您定义了自定义集群阀门,请确保在 server.xml 中的 Cluster 元素下也定义了 ReplicationValve
  • 如果您的 Tomcat 实例运行在同一台机器上,请确保 Receiver.port 属性对于每个实例是唯一的,在大多数情况下,Tomcat 能够自动检测到范围在 4000-4100 的可用端口
  • 确保您的 web.xml 中有 <distributable/> 元素
  • 如果您使用 mod_jk,请确保在 Engine <Engine name="Catalina" jvmRoute="node01" > 中设置了 jvmRoute 属性,并且该 jvmRoute 属性值与 workers.properties 中的 worker 名称匹配
  • 确保所有节点具有相同的时间并与 NTP 服务同步!
  • 确保您的负载均衡器配置为粘性会话模式

负载均衡可以通过多种技术实现,如负载均衡章节所述。

注意:请记住,您的会话状态由 cookie 跟踪,因此您的 URL 在外部必须看起来相同,否则会创建一个新的会话。

集群模块使用 Tomcat JULI 日志框架,因此您可以通过常规的 logging.properties 文件配置日志记录。要跟踪消息,您可以在键 org.apache.catalina.tribes.MESSAGES 上启用日志记录。

概述

为了在 Tomcat 中启用会话复制,可以采取三种不同的路径来实现相同的目标:

  • 使用会话持久性,并将会话保存到共享文件系统(PersistenceManager + FileStore)
  • 使用会话

持久性,并将会话保存到共享数据库(PersistenceManager + JDBCStore)

  • 使用内存复制,使用随 Tomcat 一起提供的 SimpleTcpCluster(lib/catalina-tribes.jar + lib/catalina-ha.jar)

Tomcat 可以使用 DeltaManager 执行会话状态的全对全复制,也可以使用 BackupManager 执行仅将会话复制到一个节点的备份复制。全对全复制是一种仅在集群较小时才有效的算法。对于较大的集群,您应该使用 BackupManager,以使用主要 - 次要会话复制策略,其中会话仅存储在一个备份节点上。

目前,您可以使用 domain worker 属性(mod_jk > 1.2.8)构建具有更高可伸缩性的集群解决方案,以使用 DeltaManager 配置域拦截器(您将需要为此配置域拦截器)。为了在全对全环境中减少网络流量,在多个组之间拆分集群。这可以通过为不同的组使用不同的多播地址轻松实现。一个非常简单的设置如下所示:

DNS 轮询|负载均衡器/           \
集群1        集群2/     \        /     \
Tomcat1 Tomcat2  Tomcat3 Tomcat4

这里重要提及的是,会话复制只是集群的开始。用于实现集群的另一个流行概念是 farming,即将应用程序仅部署到一个服务器,然后集群将在整个集群中分布部署。这是 FarmWarDeployer 可以实现的所有功能(请参阅 server.xml 中的集群示例)。

在下一节中,我们将更深入地介绍会话复制的工作原理和配置方法。

集群信息

通过多播心跳建立成员资格。因此,如果您希望将您的集群细分,可以通过更改 <Membership> 元素中的多播 IP 地址或端口来实现。

心跳包包含 Tomcat 节点的 IP 地址和 Tomcat 用于复制流量的 TCP 端口。所有数据通信都在 TCP 上进行。

ReplicationValve 用于在请求完成后查找并启动复制(如果有)。仅当会话已更改(通过对会话调用 setAttribute 或 removeAttribute)时,才会复制数据。

其中一个最重要的性能考虑因素是同步与异步复制。在同步复制模式下,请求在复制的会话通过网络并在所有其他集群节点上重新实例化之前不会返回。同步与异步是通过 channelSendOptions 标志进行配置的,它是一个整数值。SimpleTcpCluster/DeltaManager 组合的默认值为 8,即异步。有关各种 channelSendOptions 值的更多讨论,请参阅配置参考。

为方便起见,channelSendOptions 可以通过名称设置,而不是整数值,这些名称在启动时将被翻译为其整数值。有效的选项名称为:"asynchronous"(别名 "async"),"byte_message"(别名 "byte"),"multicast","secure","synchronized_ack"(别名 "sync"),"udp","use_ack"。使用逗号分隔多个名称,例如,传递 "async, multicast" 作为选项 SEND_OPTIONS_ASYNCHRONOUS | SEND_OPTIONS_MULTICAST。

您可以在send flag(overview) 或 send flag(javadoc) 上关于 send flag 的信息。在异步复制期间,请求在数据被复制之前返回。异步复制可缩短请求时间,而同步复制可确保在请求返回之前复制会话。

在崩溃后将会话绑定到故障转移节点

如果您正在使用 mod_jk 并且未使用粘性会话,或者由于某些原因粘性会话不起作用,或者您只是在故障转移,那么会话 ID 将需要修改,因为它先前包含了前一个 Tomcat 的 worker ID(由 Engine 元素中的 jvmRoute 定义)。为解决此问题,我们将使用 JvmRouteBinderValve。

JvmRouteBinderValve 会重写会话 ID,以确保下一个请求在故障转移后仍然保持粘性(并且不会退回到随机节点,因为该 worker 不再可用)。该阀门将在 cookie 中将 JSESSIONID 值重写为同名。如果没有这个阀门,那么在 mod_jk 模块发生故障时确保粘性会变得更加困难。

请注意,如果您在 server.xml 中添加了自定义阀门,则默认值将不再有效,请确保您添加了所有适当的阀门,这些阀门由默认定义。

提示: 通过属性 sessionIdAttribute,您可以更改包含旧会话 ID 的请求属性名称。默认属性名称为 org.apache.catalina.ha.session.JvmRouteOriginalSessionID。

技巧: 您可以在将节点丢弃到所有备用节点之前通过 JMX 启用此 mod_jk 转换模式!将 JvmRouteBinderValve 备份的 enable 属性设置为 true,禁用 mod_jk 中的 worker,然后丢弃节点并重新启动它!然后再次启用 mod_jk Worker 并禁用 JvmRouteBinderValves。这种用法意味着仅迁移请求的会话。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《本能》我们为什么管不住自己 - 三余书屋 3ysw.net

本能&#xff1a;我们为什么管不住自己 大家好&#xff0c;今天我们来解读一本名为《本能》的书。这本书有两位作者&#xff0c;第一位是特里伯纳姆&#xff0c;他是哈佛大学商学院的访问学者&#xff0c;在1997年获得哈佛大学商业经济学博士学位&#xff0c;也是自1997年起一…

elasticsearch Docker启动Device or resource busy异常

问题 在基于Docker进行elasticsearch部署启动时&#xff0c;指定了elasticsearch.yml配置文件&#xff0c;但在启动时报如下异常&#xff1a; Exception in thread "main" java.nio.file.FileSystemException: /usr/share/elasticsearch/config/elasticsearch.yml.…

无重复最长子串

专栏持续更新50道算法题&#xff0c;都是大厂高频算法题&#xff0c;建议关注, 一起巧‘背’算法! 文章目录 题目解法 滑动窗口总结 题目 解法 滑动窗口 采取滑动窗口的方法降低时间复杂度定义一个 map 数据结构存储 (k, v)&#xff0c;其中 key 值为字符&#xff0c;value 值…

【大数据面试题】024 Spark 3 升级了些什么?

一步一个脚印&#xff0c;一天一道面试题 近期工作时有用到 Spark 2 升级 Spark 3&#xff0c;解决问题的情况。 任务原本是运行 4 小时后报错&#xff0c;升级到 Spark 3后&#xff0c;任务运行 1 小时&#xff0c;并且运行成功。 平时用 Spark 3 用的也多&#xff0c;就当记…

Shader for Quest 2: 自定义shader在Unity Editor中可以使用,但是在Quest 2中却不可以

GameObject segment GameObject.Find("DisplayArea_" i); MeshRenderer renderer segment.GetComponent<MeshRenderer>(); Material mat new Material(Shader.Find("Custom/MyShader")); mat.mainTexture option.Image360;上面这份代码&#x…

Qt中常用对话框

Qt中的对话框&#xff08;QDialog&#xff09;是用户交互的重要组件&#xff0c;用于向用户提供特定的信息、请求输入、或进行决策。Qt提供了多种标准对话框以及用于自定义对话框的类。以下将详细介绍几种常用对话框的基本使用、使用技巧以及注意事项&#xff0c;并附带C示例代…

vmp入门(一):android dex vmp还原和安全性论述

看了一下&#xff0c;目前市面上关于dex vmp还原就我兄弟写的这一个&#xff0c;我不得不佩服他巨强的二级制分析能力。关于dex vmp 他的大部分都写了&#xff0c;但是&#xff0c;他搞的实在是太复杂了&#xff0c;他的分析基本都是基于静态的数据流向分析&#xff0c;这种对于…

Sylar C++高性能服务器学习记录05 【线程模块-知识储备篇】

早在19年5月就在某站上看到sylar的视频了&#xff0c;一直认为这是一个非常不错的视频&#xff0c;还有幸加了sylar本人的wx&#xff0c;由于本人一直是自学编程&#xff0c;基础不扎实&#xff0c;也没有任何人的督促&#xff0c;没能坚持下去&#xff0c;每每想起倍感惋惜。恰…

FineBi中创建自定义的图表

FineBi中增加自己的自定义图表组件,比如: 的相关笔记: 1 获取有哪些BI自定义图表组件:http://localhost:8080/webroot/decision/v5/plugin/custom/component/list?_=1713667435473[{"name": "图表DEMO_EK","chartType": "amap_demo&q…

Dubbo 面试题(三)

1. Dubbo 超时时间怎样设置&#xff1f; Dubbo的超时时间可以通过以下两种方式进行设置&#xff1a; 全局超时设置&#xff1a;在Dubbo的配置文件中进行全局的超时时间设置。具体地&#xff0c;可以在dubbo.properties文件中添加以下配置&#xff1a;dubbo.provider.timeoutx…

【学习】如何高效地进行集成测试

在软件开发的过程中&#xff0c;测试环节至关重要。而在这其中&#xff0c;集成测试更是保证软件质量的关键步骤之一。本文将探讨如何高效地进行集成测试&#xff0c;以确保软件的稳定性和可靠性。 一、什么是集成测试 集成测试是指在单元测试的基础上&#xff0c;将模块按照设…

Springboot 结合PDF上传到OSS

目录 一、首先注册阿里云OSS&#xff08;新用户免费使用3个月&#xff09; 二、步骤 2.1 将pdf模板上传到oos 2.2 这里有pdf地址,将读写权限设置为共工读 ​编辑 三、代码 3.1 pom.xml 3.2 配置文件 3.3 oss model 3.4 配置类(不需要修改) 3.5 将配置类放入ioc容器 3.…

libtorrent - 安装小记

文章目录 官方文档&#xff1a;libtorrent python binding http://libtorrent.org/python_binding.html 1、下载代码 建议使用&#xff1a; git clone --recurse-submodules https://github.com/arvidn/libtorrent.git如果在 github web 界面下载代码&#xff0c;build 的时候…

基于__torch_dispatch__机制的dump方法

基于__torch_dispatch__机制的dump方法 1.参考链接2.原理3.代码4.效果 之前拦截torch和torch.Tensor的办法,在处理backward时,不能看到aten算子的细节.以下基于__torch_dispatch__机制的方案更节约代码,且能看到调用栈 1.参考链接 [原理] (https://dev-discuss.pytorch.org/t…

机器学习高频问答题总结

机器学习问答题总结 第一章 线性回归1.什么是线性回归&#xff1f;解释主要原理2.解释线性回归中最小二乘法的原理吗&#xff1f;3.如何评估线性回归模型的性能&#xff1f;4.线性回归中正则化的目的是什么吗&#xff1f;L1正则化和L2正则化有什么不同&#xff1f; 第二章 逻辑…

# 从浅入深 学习 SpringCloud 微服务架构(六)Feign(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;六&#xff09;Feign&#xff08;1&#xff09; 一、Feign 组件概述&#xff1a; Feign 是 Netflix 开发的声明式&#xff0c;模板化的HTTP客户端。 其灵感来自 Retrofit,JAXRS-2.0 以及 WebSocket。 Feign 可帮助我们更加…

代码随想录算法训练营第五十天| 123.买卖股票的最佳时机III ,188.买卖股票的最佳时机IV

题目与题解 123.买卖股票的最佳时机III 题目链接&#xff1a;123.买卖股票的最佳时机III 代码随想录题解&#xff1a;​​​​​​​123.买卖股票的最佳时机III 视频讲解&#xff1a;动态规划&#xff0c;股票至多买卖两次&#xff0c;怎么求&#xff1f; | LeetCode&#xff…

Vector里常用的操作(C++)

1 引言 编程时常用的Vector操作有创建、访问元素、增加元素、删除元素、修改元素、查找索引以及一些常用的函数操作&#xff0c;本文总结了一下这些方法在C里面的实现方式&#xff08;并不是唯一的&#xff09;。 2 创建 操作类别注释C创建创建空向量vector<int>a;创建…

Arduino中增加修改ESP32烧录固件的速度

在Arduino中&#xff0c;默认对ESP32-S3芯片的烧录速度只支持115200、230400、460800、921600这几种速率。只能够在 工具->Upload Speed中选择这些。 有的时候烧录还是觉得太慢了。那么能否更快一些呢&#xff1f; 首先你的USB转串口芯片要支持高速的。常见的芯片速率支持…

Java | 选择排序算法实现

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 编写一个Java程序&#xff0c;实现选择排序算法。程序需要能够接收一个整型数组作为输入&#xff0c;并输出排序后的数组。 选择排序是一种简单直观的排序算法&#xf…