Tomcat系列之五:Tomcat集群

article/2025/9/23 17:16:02

基于mod_proxy实现负载均衡

在httpd.conf中启用httpd-proxy.conf配置文件,
Include /etc/httpd/extra/httpd-proxy.conf
修改httpd-proxy.conf文件:
ProxyRequests Off
<proxy balancer://lbcluster1>BalancerMember ajp://192.168.1.211:8009 loadfactor=10 route=TomcatABalancerMember ajp://192.168.1.213:8009 loadfactor=10 route=TomcatB
</proxy><VirtualHost *:80>ServerName www.z.comProxyPass / balancer://lbcluster1/ stickysession=jsessionidProxyPassReverse / balancer://lbcluster1/
</VirtualHost>

常用apache指令的说明:
ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。
ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。
ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。
ProxyPass [path] !|url [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。 
另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示:
min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。
max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。
loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。
retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。

如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示: 
lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。
maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。
stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。
上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如: 
<Proxy balancer://hotcluster> BalancerMember http://www1.test.com:8080 loadfactor=1 BalancerMember http://www2.test.com:8080 loadfactor=2 ProxySet lbmethod=bytraffic 
</Proxy>
ProxyPassReverse:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。

配置基于mod_jk的负载均衡

1、为了避免用户直接访问后端Tomcat实例,影响负载均衡的效果,建议在Tomcat的各实例上禁用HTTP/1.1连接器。
2、为每一个 Tomcat 实例的引擎添加jvmRoute参数,并通过其为当前引擎设置全局惟一标识符。如下所示。需要注意的是,每一个实例的jvmRoute的值均不能相同,如:
<Engine name=”Standalone” defaultHost=”localhost” jvmRoute=” TomcatA ”>
而后去配置apache,注销配置文件httpd-proxy.conf,启用httpd-jk.conf
#Include /etc/httpd/extra/httpd-proxy.conf
Include /etc/httpd/extra/httpd-jk.conf
修改/etc/httpd/extra/httpd-jk.conf为如下内容:
LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  /etc/httpd/extra/workers.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  debug
JkMount  /*  lbcluster1
JkMount  /jkstatus/  stat1
编辑/etc/httpd/extra/workers.properties,添加如下内容:
worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 192.168.1.211
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 5
worker.TomcatB.type = ajp13
worker.TomcatB.host = 192.168.1.213
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 5
worker.lbcluster1.type = lb
worker.lbcluster1.sticky_session = 1
worker.lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status
注,apache相关指令说明:
workers.properties文件一般由两类指令组成:一是mod_jk可以连接的各worker名称列表,二是每一个worker的属性配置信息。它们分别遵循如下使用语法。
  worker.list = < a comma separated list of worker names >
  worker. <worker name> .<property> = <property value>
其中worker.list指令可以重复指定多次,而worker name则是Tomcat中engine组件jvmRoute参数的值。如: 
worker.TomcatA.host=192.168.1.211
根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性woker.<work name>.type。常见的类型如下: 
  ajp13:此类型表示当前worker为一个运行着的Tomcat实例。 
  lb:lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。 
  status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。
worker其它常见的属性说明: 
  host:Tomcat的worker实例所在的主机; 
  port:Tomcat实例上AJP1.3连接器的端口; 
  connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2; 
  connection_pool_timeout:连接池中连接的超时时长; 
  mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代; 
  retries:错误发生时的重试次数; 
  socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待; 
  socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用; 
  lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性;
另外,在负载均衡模式中,专用的属性还有: 
  balance_workers:用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。 
  method:可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。 
  sticky_session:在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。

查看状态信息:
1、基于mod_proxy模块状态信息
修改配置文件httpd-proxy.conf,在虚拟机中添加balancer-manager
<proxy balancer://lbcluster> BalancerMember ajp://192.168.18.201:8009 loadfactor=1 route=TomcatA BalancerMember ajp://192.168.18.203:8009 loadfactor=1 route=TomcatB ProxySet lbmethod=byrequests 
</proxy>
<VirtualHost *:80>ServerName www.z.comProxyPass / balancer://lbcluster/ stickysession=JSESSIONID|jsessionid nofailover=On ProxyPassReverse / balancer://lbcluster/<Location /balancer-manager> #增加状态信息SetHandler balancer-manager Proxypass ! Require all granted </Location><Proxy *>Require all granted </Proxy><Location />Require all granted </Location>
</VirtualHost>
打开浏览器,输入:http://192.168.1.212/balancer-manager
基于mod_jk模块的状态信息,注销httpd-proxy.conf,启用httpd-jk.conf
打开浏览器,输入:http://192.168.1.212/jkstatus/

会话共享集群:

1、会话分为标准会话和持久会话。

1)、标准会话管理器(StandardManager):
<Manager className="org.apache.catalina.session.StandardManager"maxInactiveInterval="7200"/>
默认保存于$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中
maxActiveSessions:最多允许的活动会话数量,默认为-1,表示不限制; 
maxInactiveInterval:非活动的会话超时时长,默认为60s;
pathname:会话文件的保存目录;
2)、持久会话管理器(PersistentManager):
将会话数据保存至持久存储中,并且能在服务器意外中止后重新启动时重新加载这些会话信息。持久会话管理器支持将会话保存至文件存储(FileStore)或JDBC存储(JDBCStore)中。
保存至文件中的示例:
<Manager className="org.apache.catalina.session.PersistentManager"saveOnRestart="true"><Store className="org.apache.catalina.session.FileStore"directory="/data/tomcat-sessions"/>
</Manager>
每个用户的会话会被保存至directory指定的目录中的文件中,文件名为<session id>.session,并通过后台线程每隔一段时间(checkInterval参数定义,默认为60秒)检查一次超时会话。
保存至JDBCStore中的示例:
<Manager className="org.apache.catalina.session.PersistentManager"saveOnRestart="true"><Store className="org.apache.catalina.session.JDBCStore"driverName="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"/>
</Manager>

2.Manager组件 

Manger对象用于实现HTTP会话管理的功能,Tomcat中有5种Manger的实现: 
1)、StandardManager 
Tomcat6的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件。 
2)、PersistentManager 
当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧的应用环境来说比较有用。 
3)、DeltaManager 
用于Tomcat集群的会话管理器,它通过将改变了会话数据同步给集群中的其它节点实现会话复制。这种实现会将所有会话的改变同步给集群中的每一个节点,也是在集群环境中用得最多的一种实现方式。 
4)、BackupManager 
用于Tomcat集群的会话管理器,与DeltaManager不同的是,某节点会话的改变只会同步给集群中的另一个而非所有节点。 
5)、SimpleTcpReplicationManager 
Tomcat4时用到的版本,过于老旧了

3.DeltaManager具体实现过程

1)、修改server.xml配置文件,定义在Engine容器中,则表示对所有主机均启动用集群功能,如果定义在某Host中,则表示仅对此主机启用集群功能:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  channelSendOptions="6"><Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" mapSendOptions="6"/><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="192.168.1.211" port="5001" selectorTimeout="100" 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.MessageDispatch15Interceptor"/><Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/></Channel><Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/><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"/><ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
</Cluster>
2)、修改./conf/web.xml,添加一行<distributable/>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0">
<distributable/>
3)、修改Apache配置文件,在httpd-proxy.conf中做如下配置:
ProxyRequests Off
<proxy balancer://lbcluster1>BalancerMember ajp://192.168.1.211:8009 loadfactor=10 route=TC1BalancerMember ajp://192.168.1.213:8009 loadfactor=10 route=TC2
</proxy>
<VirtualHost *:80>ProxyPass / balancer://lbcluster1/ stickysession=jsessionidProxyPassReverse / balancer://lbcluster1/
</VirtualHost>

在浏览器中输入192.168.1.212:


刷新


4)、用于mod_proxy状态信息的输出

<Location /balancer-manager>SetHandler balancer-managerOrder Deny,AllowAllow from all
</Location>
如果使用虚拟主机实现反向代理,如何在对应的虚拟主机上完成状态信息输出:
<pre name="code" class="plain">ProxyRequests Off
<proxy balancer://lbcluster1>BalancerMember ajp://192.168.10.8:8009 loadfactor=1BalancerMember ajp://192.168.10.9:8009 loadfactor=1ProxySet lbmethod=bytraffic
</proxy>
<VirtualHost *:80>ServerName localhostProxyVia OnProxyPass / balancer://lbcluster1/  stickysession=JSESSIONID|jsessionid nofailover=OnProxyPassReverse / balancer://lbcluster1/<Location /balancer-manager>SetHandler balancer-managerProxypass !Require all granted</Location><Proxy *>Require all granted</Proxy><Location  / >Require all granted</Location>
</VirtualHost>
 此外,所有启用集群功能的web应用程序,其web.xml中都须添加<distributable/>才能实现集群功能。如果某web应用程序没有自己的web.xml,也可以通过复制默认的web.xml至其WEB-INF目录中实现。

http://chatgpt.dhexx.cn/article/CFtmSDfp.shtml

相关文章

集群与jetspeed

1 、 集群背景介绍 1.1 术语定义服务软体是b/s或c/s结构的s部分&#xff0c;是为b或c提供服务的服务性软件系统。 服务硬体指提供计算服务的硬件、比如pc机、pc服务器。 服务实体通指服务软体和服务硬体。 客户端指接受服务实体服务的软件或硬件。 1.2 两大关键特性集…

Tomcat集群搭建超详细

TOMCAT集群 目录 TOMCAT集群 1 1 集群 1 1.1 什么是集群 1 1.2 集群的特性 1 1.3 集群的分类 1 1.4 TOMCAT集群配置的优缺点 2 1.5 APACHETOMCAT 2 1.6 环境说明 2 2 软件安装 3 2.1 安装说明 3 2.2 JDK安装 3 2.3 APACHE安装 4 2.4 TOMCAT安装 4 3 集群配置 6 …

JAXB元素详解

JAXB简介 JAXB&#xff08;Java Architecture for XML Binding) 是一个业界的标准&#xff0c;是一项可以根据XML Schema产生Java类的技术。该过程中&#xff0c;JAXB也提供了将XML实例文档反向生成Java对象树的方法&#xff0c;并能将Java对象树的内容重新写到XML实例文档。从…

xml java jaxb_【Java】JAXB操作XML用法详解

什么是JAXB? JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。在JAX-WS(Java的WebService规范之一)中,JAXB可以实现对象和XML之间相互转换。Unmarshaller类管理将XML数据反序列化为新创建的Java内容树的进程,并可在解…

java jaxb 注解_一、JAXB注解的使用详解

一、首先先上一段测试的代码下面的说明和测试都已这一段代码为主 package shiqingxue.cn.itcast.utils.xml; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax…

JAXB应用实例

博文目录 一 JavaBean和XML相互转换初体验二 JAXB使用基础介绍三 应用实际四 问题补充 正文 过往的项目中数据存储都离不开数据库&#xff0c;不过最近做的一个项目的某些数据&#xff08;比如人员信息、菜单、权限等等&#xff09;却完全没有涉及任何数据库操作&#xff0c;直…

JAXB常用注解讲解(超详细)

简介&#xff1a; JAXB&#xff08;Java Architecture for XML Binding) 是一个业界的标准&#xff0c;是一项可以根据XML Schema产生Java类的技术。该过程中&#xff0c;JAXB也提供了将XML实例文档反向生成Java对象树的方法&#xff0c;并能将Java对象树的内容重新写到XML实例…

OpenCV-Python (Canny边缘检测)

Canny边缘检测是一种非常流行的边缘检测算法&#xff0c;是John Canny在1986年提出的。它是一个多阶段的算法&#xff0c;即由多个步骤构成。 图像降噪计算图像梯度非极大值抑制阈值筛选 原型 OpenCV-Python中Canny函数的原型为&#xff1a; edge cv2.Canny(image, thresh…

python-opencv之边缘检测(cv2.Canny)

理论 Canny边缘检测是一种常用的边缘检测算法&#xff0c;并且他是一个多阶段的算法&#xff0c;分成如下几个阶段&#xff1a; 1. 消除噪声 由于边缘检测容易受到图像中噪声的影响&#xff0c;第一步是用5x5高斯滤波器去除图像中的噪声。 2. 寻找图像的强度梯度 然后对平滑后…

Canny边缘检测算法及实现

Canny边缘检测算法及实现 微信公众号&#xff1a;幼儿园的学霸 目录 文章目录 Canny边缘检测算法及实现目录前言原理步骤实现参考资料 前言 提取图片的边缘信息是底层数字图像处理的基本任务之一.边缘信息对进一步提取高层语义信息有很大的影响. 对图像提取边缘可以通过图像的…

Canny边缘检测算法

Canny是目前最优秀的边缘检测算法&#xff0c;其目标为找到一个最优的边缘&#xff0c;其最优边缘的定义为&#xff1a; 好的检测&#xff1a;算法能够尽可能的标出图像中的实际边缘好的定位&#xff1a;标识出的边缘要与实际图像中的边缘尽可能接近最小响应&#xff1a;图像中…

Canny算子边缘检测原理及实现

写在前面 Canny边缘检是在在1986年提出来的&#xff0c;到今天已经30多年过去了&#xff0c;但Canny算法仍然是图像边缘检测算法中最经典、先进的算法之一。 相比Sobel、Prewitt等算子&#xff0c;Canny算法更为优异。Sobel、Prewitt等算子有如下缺点&#xff1a; 没有充分利…

Opencv(C++)学习系列---Canny边缘检测算法

目录 【1】边缘检测算法流程 【2】Canny算子介绍 【3】完整代码 【1】边缘检测算法流程 使用高斯滤波器来平滑图像&#xff0c;达到滤除噪声的效果。(降噪)计算图像中每个像素点的梯度大小和方向&#xff08;求梯度,与sobel算法求梯度一致&#xff09;使用非极大值抑制&…

OpenCV-Canny边缘检测

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 函数原型 void Canny( InputArray image, OutputArray edges,double threshold1, double threshold2,int apertureSize 3, boo…

Python cv.Canny()方法参数与用法详解

函数原型与参数详解 OpenCV提供了cv.Canny()方法&#xff0c;该方法将输入的原始图像转换为边缘图像。该方法的原型为&#xff1a; cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> edges cv.Canny(dx, dy, threshold1, threshold2[…

OpenCV—python 边缘检测(Canny)

边缘检测 一、边缘定义及类型二、边缘检测算子类别三、OpenCV-Python 中 Canny() 参数 一、边缘定义及类型 边缘类型&#xff1a;简单分为4中类型&#xff0c;阶跃型、屋脊型、斜坡型、脉冲型&#xff0c;其中阶跃型和斜坡型是类似的&#xff0c;只是变化的快慢不同。 二、边…

Canny算子Matlab实现

1、Canny边缘提取原理 Canny边缘检测方法利用了梯度方向信息&#xff0c;采用“非极大抑制”以及双阈值技术&#xff0c;获得了单像素连续边缘&#xff0c;是目前所认为的检测效果较好的一种边缘检测方法。 先利用高斯函数对图像进行低通滤波&#xff1b;然后对图像中的每个像…

canny算子的python实现以及pytorch实现

canny算子的python实现以及pytorch实现 canny的python实现canny的pytorch实现 canny的python实现 参考Canny边缘检测算法(python 实现&#xff09; import numpy as np import cv2 as cv from matplotlib import pyplot as pltdef smooth(image, sigma 1.4, length 5) :&qu…

Python 使用cv2.canny 进行图像边缘检测

CV2提供了提取图像边缘的函数canny。其算法思想如下&#xff1a; 1. 使用高斯模糊&#xff0c;去除噪音点&#xff08;cv2.GaussianBlur&#xff09;2. 灰度转换&#xff08;cv2.cvtColor&#xff09;3. 使用sobel算子&#xff0c;计算出每个点的梯度大小和梯度方向4. 使用非极…

计算机视觉中Canny算子详解

文章目录 前言一、Canny的实现步骤二、具体实现1.高斯平滑滤波2.计算梯度大小和方向3.非极大抑制4.双阈值(Double Thresholding)和滞后边界跟踪 总结 前言 Canny边缘检测是一种非常流行的边缘检测算法&#xff0c;是John Canny在1986年提出的。它是一个多阶段的算法&#xff0c…