Apache Tomcat负载平衡设置要领具体解析

 
一、简介:
 
每个Tomcat worker是一个干事于web server、等待实行servlet的Tomcat实例。例如我们经常利用像Apache之类的web server转发sevlet央求给位于其前面的一个Tomcat进程(也就是前面所说的worker)。本文具体介绍了若何设置装备部署种种榜样worker和loadbalance,并阐明');白种种榜样worker的特征和loadbalance设置装备部署的原理。
 
二、为什么利用Tomcat workers:
 
上文描绘了一个异常简陋的结构,幻想上可以设置装备部署多个Tomcat workers来处理责罚web server转发的servlet央求。而这样设置装备部署的来由不外乎以下几种假想环境:
* 我们在开发环境中颁布分歧的Tomcat workers为各自分歧的运用干事。当然在开发环境中的开发者共享统一个web server,可是每个Tomcat worke干事于拥有它的开发者。
* 我们在分歧的Tomcat进程上定义各自的虚拟主机,这样分歧的公司可以利用各自的web site,从而使他们的web site失失了合理的分割。
* 我们供给负载平衡的web site,也就意味着同时利用多个Tomcat workers,而每个Tomcat worker具有自力的主机而且在workers之间要分配经过议定web server转发来的央求。
当然,这些假想情形大概并不克不及涵盖利用多个workers的一切情况。
 
三、workers.properties设置装备部署阐明:
 
定义Tomcat workers的要领是在apache的conf目次下编写一个名为“workers.properties”的属性文件。本文将具体解释若何制止设置装备部署的:
 
1.定义Workers列表:
定义workers的要领就是在apache的conf目次下编写一个workers.properties文件,使其作为apache的插件来发扬感化。
定义workers列表的名目:
worker.list =<利用“,”分割的worker 名字列表>
例如:
 
worker.list= worker1, worker2
 
当apache启动时,workers.properties作为插件将初始化呈目前worker.list列表中的workers。
 
2.定义Workers的榜样:
 
每个被命名的worker都应有一些关于其自身的附加信息。这些信息包括了worker的榜样和此外相关信息。这里讨论的是JK1.2.5中定义的workers榜样。
定义worker榜样的名目:
worker . worker名字. type =
worker名字的命名最好遵循java的命名榜样。
worker榜样取值于下面的表格:
定义一个名为“local”的worker,其利用ajpv12和谈与Tomcat 进程通讯:
 
worker.local.type=ajp12
 
定义一个名为“remote”的worker,其利用ajpv13和谈与Tomcat 进程通讯:
 
worker.remote.type=ajp13
 
定义一个名为“fast”的worker,其利用JNI的要领与Tomcat 进程通讯:
 
worker.fast.type=jni
 
定义一个名为“loadbalancer”的worker,其作为对多个Tomcat 进程的负载平衡利用:
 
worker.loadbalancer.type=lb
 
各个榜样具有分歧的行为,我们鄙人文中会具体解释。
 
3.设置Worker属性:
 
在定义worker之后,还必要供给各个worker的属性,这些属性的定义利用下面的要领:
worker..<属性>=<属性值>
 
3-1 ajp12榜样的Worker属性:.
 
ajp12榜样的worker工作时利用基于TCP/IP socket的ajpv12和谈转发央求给“进程外”Tomcat worker。
ajp12 worker属性如下:
host:
侦听ajp12央求的Tomcat worker主机。
port:
Tomcat worker主机的侦听端口。
lbfactor:
当此Tomcat worker被用于一个负载平衡worker利用时,此属性将被利用。它定义了此worker的负载平衡权值。
例如:下面的“worker1”定义了一个位于www.x.com主机上的Tomcat,它利用8007端口侦听apache发来的央求,并具有2.5的负载权值
 
worker.worker1.host=www.x.comworker.worker1.port=8007worker.worker1.lbfactor=2.5
 
细致:在ajpv12和谈中,针对每个央求都要一个毗连设立树立、利用、关闭。其默许侦听端口为8007。
 
3-2 ajp13榜样的Worker属性:
 
ajp13榜样的worker工作时利用基于TCP/IP socket的ajpv13和谈转发央求给“进程外”Tomcat worker。
ajpv13和谈与ajpv12和谈的首要分歧:
* ajpv13具有更丰厚的二进制和谈,它利用将频繁利用的字符串编码为小整数的要领对央求数据制止收缩。
* ajpv13重用掀开的socket并生计这些掀开的socket以处理责罚未来的央求。这在apache与Tomcat之间具有防火墙的收集环境下是必要的。
* ajpv13具有对SSL信息的处理责罚才华,致使容器可以完成SSL的相关要领(如isSecure())。
 
 
细致:ajp13以后只能用于支撑“进程外”和谈的Tomcat 4.0.x, 4.1.x and 5。
下表描绘了ajp13worker蒙受的属性:
 
host:
侦听ajp13央求的Tomcat worker主机。
 
port:
Tomcat worker主机的侦听端口。
 
lbfactor:
当此Tomcat worker被用于一个负载平衡worker利用时,此属性将被利用。它定义了此worker的负载平衡权值。
 
cachesize:
当在多线程的web server(例如apache2.0、IIS 、Netscape)中利用JK时,此属性是有用的。若是将cachesize的值设置为较高的值,这些支撑多线程的web server将取得很好的处理责罚才华。若是此属性不被设置,则毗连cache特征将见效。
 
cache_timeout:
本属性用于声明JK在cache中生计一个掀开的socket的功夫,它对增添web serer的线程数有所搀扶帮忙。
利用cache_timeout的缘由:
周所周知,一个身背重负的web server(例如apache)设立树立childs/threads来处理责罚负载,而当负载增添时它将销毁无用的childs/threads。每个child在转发央求给Tomcat时要掀开一个ajp13毗连,而在Tomcat那一端也将设立树立一个ajp13线程与之通讯。可是标题呈目前一个ajp13毗连设立树立完成后,child没有及时的开释阿谁ajp13毗连,由于web server1将保持它的childs/threads运转已处理责罚高负载,纵然childs/threads处理责罚疾速的静态内容,在Tomcat端也将堆集很多的无用ajp13线程。
 
socket_keepalive:
当防火墙位于web server与Tomcat之间时,防火墙将实行断开未激活的收集毗连。此属性将关照操纵细碎在未激活的毗连中发送KEEP_ALIVE信息(发送距离功夫寄托于操纵细碎的设置,一样泛泛为120秒),这样将防止防火墙堵截未激活的收集毗连。
但此设置并不是万能钥匙,它关于某些防火墙也醒目为力。
 
socket_timeout:
此属性阐明毗连在未激活的情况下继续多久,web server将自动堵截之。这是一个使Tomcat端的陈旧线程不致过多的好要领,可是也带来了鄙人一次央求到来时必要重新掀开socket的开支。此属性与cache_timeout有相通的成效,可是它工作在non-cache形式。
 
connect_timeout:
web server在毗连设立树立后将一个PING央求发送到ajp13和谈的毗连上。 此属性阐明');白web server等待PONG回应的功夫(以ms为单元)。此属性在jk 1.2.6版本被增加出去,以求制止Tomcat的逝世机,Tomcat 3.3.2 , 4.1.28 and 5.0.13 完成了对利用ajp13的 ping/pong的支撑。此属性默许为见效的。
 
prepost_timeout:
web server在转发一个央求后将一个PING央求发送到ajp13和谈的毗连上。此属性阐明');白web server等待PONG回应的功夫(以ms为单元)。此属性在jk 1.2.6版本被增加出去,以求制止Tomcat的逝世机,Tomcat 3.3.2 , 4.1.28 and 5.0.13 完成了对利用ajp13的 ping/pong的支撑。此属性默许为见效的。
 
reply_timeout:
此属性关照web server在接到远端的Tomcat已逝世并及时的切换到集群中的此外一个Tomcat的回应之前等待一段功夫。默许情形下web server将永世等待。属性值为web server要等待回应的功夫(以ms为单元),所以若是具有运转功夫较长的servlet时设置其值要鉴戒。此属性在jk 1.2.6版本被增加出去,以求制止Tomcat的逝世机和在支撑ajp13的servlet引擎上发生发火的标题。此属性默许为见效的。
 
recovery_options:
此属性阐明');白web server在检测到Tomcat失败后若何制止恢停工作。默许情形下,web server将转发央求给处于负载平衡形式中的另一个Tomcat。属性值为0,阐明扫数规复;属性值为1,阐明若是在Tomcat接到央求后出现失败情况,则不制止规复;属性值为2,阐明若是在Tomcat发送http头给客户端后出现失败情况,则不制止规复;属性值为3,阐明若是在Tomcat接到央求后出现失败情况大概在Tomcat发送http头给客户端后出现失败情况,则不制止规复。此属性在jk 1.2.6版本被增加出去,以求制止Tomcat的逝世机和在支撑ajp13的servlet引擎上发生发火的标题。此属性默许为扫数规复。
 
例如:一个名为“worker2”的worker的设置装备部署:
 
 
worker.worker2.host
=www2.x.comworker.worker2.port=
8009worker.worker2.lbfactor
=3.5worker.worker2.cachesize
=10worker.worker2.cache_timeout
=600worker.worker2.socket_keepalive
=1worker "worker2" want ajp13 connection to be dropped after
5mn (timeout)worker.worker2.socket_timeout=300
 
阐明:上例中的worker要求操纵细碎在毗连上发送KEEP-ALIVE旌旗灯号。
细致:在ajpv13和谈中默许端口为8009。
 
4.设置lb Worker属性:
负载平衡榜样的worker并不与Tomcat worker通讯,它担任操持这些Tomcat worker。
 
其操持局限如下:
* 初始化在web server的worker列表中定义的worker。
* 利用worker的负载平衡权值,实行基于权值的负载平衡,将数量多的央求发送到负载平衡权值高(在web server看来就是愈加强健的)的worker。
* 维护在统一个Tomcat worker上的统一个session的央求,使其发送到统一个Tomcat worker上。以到达Tomcat worker上的session分好比性、继续性。
* 标识曾经失败的Tomcat workers,悬空发向它们的央求,在被lb worker操持的此外workers上寻觅可以失败规复的worker。
被统一个lb worker操持多个worker之间的负载平衡的(基于它们的lbfactor和以后用户session),也可以尽管即便制止由于单一的Tomcat进程逝世失而构成这个网站被“杀”的不良回响反映。
下表阐明');白lb worker蒙受的属性:
* balanced_workers:一个由“,”分割的worker列表,用来声明lb worker必要被操持的workers。这些workers不应呈目前worker.list属性中。
* sticky_session:表述能否将对SESSION ID的央求路由回到不异的Tomcat worker。若是属性值不为0,它将被设置为JK_TRUE,session将是粘性的,即SESSION ID的央求路由回到不异的Tomcat worker;当Tomcat正利用可以超越多个Tomcat实例长期化session数据的Session Manager时,它将被设置为JK_FALSE。属性默许值为JK_TRUE。
例如:worker balance1操持着两个workers:worker1、worker2:
 
worker.balance1.balanced_workers=worker1, worker2
 
 
5.低级lb Worker属性:
 
JK 1.2.x版本经过议定增加两个新的属性:local_worker_only 和 local_worker 为lb worker增加了新的负载平衡和容错支撑。
下面让我们举一个实践的环境作为example:
一个集群具有两个节点(worker1 worker2),一个web server与tomcat workers一前一后,一个负载平衡器(lb Worker)位于节点的前面、web server的前面。
设置装备部署如下:
 
 
worker.list=router# Define a 'local_worker'
 worker using ajp13worker.worker1.port=8009worker.worker1.host
=node1.domain.orgworker.worker1.type=ajp13worker.worker1.lbfactor
=1worker.worker1.local_worker=1# Define another 'local_worker'
worker using ajp13worker.worker2.port=8009worker.worker2.host
=node2.domain.orgworker.worker2.type=ajp13worker.worker2.lbfactor
=1worker.worker2.local_worker=0# Define the LB
workerworker.router.type=lbworker.router.balanced_workers
=worker1,worker2worker.router.local_worker_only=1
 
 
在worker1和worker2上的local_worker标记关照lb_worker哪个毗连属于当地worker。
 
若是local_worker值为非0,则它将被设置为JK_TRUE,用来标记“local worker”,而JK_FALSE的情形则相反。若是至少一个worker被标记为local worker,则lb_worker将工作于local worker形式。这种形式下,一切的local workers将被移到在lb_worker中的外部worker列表的头部。
 
这意味着一个带有session id的央求到达lb_worker时,相应的worker(凭据权值排序,权值最年夜的阿谁worker)将被确定作为此央求的蒙受/处理责罚者。若是这个worker逝世失/当机,央求将被发送各处于非错误形状的第一个local worker;若是一个没有session id的央求到达lb_worker时,此央求将被路由到第一个local worker。若是一切的local worker均处于错误形状,则这时“local_worker_only”标记显得尤其首要。若是local_worker_only的属性值为非0,则它被设置为 JK_TRUE,不然被设置为 JK_FALSE。当它被设置为 JK_TRUE时,这个没有session id的央求将失失一个错误作为回应,不然lb_worker将实即将央求路由到此外的被操持的worker上。若是其中的一个worker处于错误形状,而且规复会话的工作并没有任何改动,local worker将查找这个没有session id的央求(由于在local worker中生计有这个央求的session),而此外的worker只能查找带有session id的央求。
 
细致:local_worker默许值是0,local_worker_only默许值也是0。
 
6.为什么必要这么庞大的历程吗?
 
由于我们关于一个关闭的节点必要一个具有灵性的维护。
在节点前面的平衡器周期性的对每个节点的特定端口制止盘问。若是我们从集群中移走一个节点,我们就会隐性的关闭失这个特定的端口。由于负载平衡器不克不及毗连它,这个节点将被标记为down。可是我们没有挪动在阿谁关闭的节点上的session到此外的节点上。在这个环境下,若是平衡器发送一个没有session id的央求到一个端口被关失的节点,那么一个错误将发生发火。若是平衡器测试到一个节点被标记为down的形状,而没有此外的节点承诺发送没有session id的央求。这样这些陈旧的session央求就只需路由到阿谁被关闭的节点才具被蒙受。在一段功夫后,这些陈旧的session将超时。由于一切的陈旧的session逾期,阿谁不可达(被关闭)的节点将失这个央求。同时也会招致我们的servlet细碎发送一个没有session id的重定向回应给阅读器。
 
可是年夜要被关闭的节点将会up,重新参与到集群中来,在它下面仍将生计着陈旧的session。所以在最初一个session超时后,更新节点可感受陈旧的session的规复带来但愿,而不是杀失sessions大概把它们移到此外节点上。而且有意若是那些陈旧的session中有很多big的工具,那么挪动它们也将斲丧很多功夫。
 
7.jni榜样的Worker属性:
 
jni worker会在web server进程中掀开一个JVM,并在其中实行Tomcat,这叫做“进程内”worker。交往于JVM的旧事将经过议定调用JNI要领被通报,这使jni worker比那些必要利用ajp旧事通讯的“进程外”worker实行的更快。
 
细致:由于JVM是多线程的,jni worker应该只被用于在支撑对线程的web server(AOLServer, IIS, Netscape and Apache 2.0)上。同时还应该确认在web server下利用的线程方案能否与被利用的JK web server插件相婚配。
 
由于jni worker 掀开了一个JVM,它将蒙受一些属性(例如> worker.worker名.>  
为了取得JSP编译器的支撑,我们必要将Javac添加到>  
worker.worker名.>  
例如:给名为“wrkjni”的worker设置>  
 
worker.wrkjni.>  
 
worker.worker名.bridge:用于标识将经过议定JNI要领被利用的Tomcat的榜样。此属性目前有两个属性值:tomcat32 or tomcat33。Tomcat 3.2.x当然曾经过时,可是被供给用于颁布在一些相通iSeries细碎上。此属性的默许值为tomcat33。
例如:给“wrkjni”设置bridge榜样为tomcat3.3。
 
 
worker.wrkjni.bridge=tomcat33
 
 
worker.worker名.cmd_line: 此属性供给了在Tomcat启动代码实行的饬令行。利用时将饬令行的饬令、参数解析为多个cmd_line属性。JK环境经过议定在各个cmd_line属性值之间添加空格将这些cmd_line毗连在一同。
例如:设置“wrkjni”的cmd_line属性。
 
 
worker.wrkjni.cmd_line=-configworker.wrkjni.cmd_line=/etc/tomcat3/conf/alt-server.xmlworker.wrkjni.cmd_line=-homeworker.wrkjni.cmd_line=/var/tomcat3
 
 
下面例子中的第一行声领略-config参数名,而第二行声领略与之对应的参数值。第三行与第四行同理。
 
worker.worker名.jvm_lib:用于声明JVM的完成库的完整途径。Jni worker利用这个途径静态装载JVM。
例如:设置“wrkjni”的JVM shared lib (IBM SDK on Linux)。
 
worker.wrkjni.jvm_lib=/opt/IBMJava2-131/jre/bin/>  
例如:设置“wrkjni”的JVM shared lib (Sun SDK on Windows)。
 
worker.wrkjni.jvm_lib=c:\JDK\1.3.1\jre\bin\>  
worker.worker名.stdout:设置JVM写它的System.out的完整途径职位处所。
例如:将“wrkjni”的JVM细碎输出途径设置为/var/log/http/jk-jvm-out.log。
 
worker.wrkjni.stdout=/var/log/http/jk-jvm-out.log
 
worker.worker名.stderr:设置JVM写它的System.err的完整途径职位处所。
例如:将“wrkjni”的JVM细碎错误输出途径设置为/var/log/http/jk-jvm-err.log
 
worker.wrkjni.stderr=/var/log/http/jk-jvm-out.log
 
worker.worker名.ms:设置JVM的初始堆年夜小。
例如:设置“wrkjni”的JVM的初始堆为64M。
 
worker.wrkjni.ms=64
 
 
worker.worker名.mx:设置JVM的最年夜的堆年夜小。
例如:设置“wrkjni”的JVM堆最年夜为128M
 
worker.wrkjni.mx=128
 
 
worker.worker名.sysprops:设置JVM的细碎属性。
例如:设置“wrkjni”的JVM利用法语。
 
worker.wrkjni.sysprops=-Duser.region=FR
 
 
worker.worker名.ld_path:设置附加的静态链接库途径(相通于LD_LIBRARY_PATH)
例如:添加一些静态链接库途径到“wrkjni”的java环境中。
 
 
worker.wrkjni.ld_path=/opt/IBMJava2-131/jre/bin/worker.wrkjni.ld_path
=/opt/IBMJava2-131/jre/bin/>  
细致:在Linux下,下面的ld_path并不克不及更新LD_LIBRARY_PATH,所以必要在实行web server之前手动更新LD_LIBRARY_PATH,。
 
8.属性文件宏:
 
我们可以在属性文件中定义“宏”。这些宏让我们定义属性,并在以先利用它们来构建此外的属性文件。当我们修改Java Home、Tomcat Home、细碎途径分开符时这是很有用的。
例如:定义了属性workers.tomcat_home、workers.java_home。
 
workers.tomcat_home=d:\tomcatworkers.java_home=d:\sdk\jdk1.2.2
 
在定义worker.inprocess.>  
worker.inprocess.>  
 
 
9.一个简陋而完整的worker.properties:
 
文件中定义了相比完整的结构,可以做为参考模版:
* 一个位于localhost的利用8007端口的ajp12 worker;
* 一个位于localhost的利用8008端口的ajp13 worker;
* 一个jni worker;
* 一个lb worker:担任ajp12 worker、ajp13 workers的负载平衡。
文件内容如下:
 
 
# Define some propertiesworkers.apache_log=/var/log/httpd/workers.tomcat_home
=/var/tomcat3workers.java_home=/opt/IBMJava2-131/ps
=/# Define 4 workers, 3 real workers using ajp12, ajp13, jni,
 the last one being a loadbalancing workerworker.list
=worker1, worker2, worker3, worker4# Set properties for worker1 (ajp12)
worker.worker1.type=ajp12worker.worker1.host
=locahostworker.worker1.port=8007worker.worker1.lbfactor
=5# Set properties for worker2 (ajp13)worker.worker2.type
=ajp13worker.worker2.host
=locahostworker.worker2.port=8009worker.worker2.lbfactor
=50worker.worker2.cachesize=10worker.worker2.cache_timeout
=600worker.worker2.socket_keepalive=1worker.worker2.socket_timeout
=300# Set properties for worker3 (jni)worker.worker3.type
=jni# Set worker3 bridge type, here Tomcat 3.3worker.worker3.bridge
=tomcat33# Set worker3 >=$(workers.tomcat_home)$(ps)>=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar#
Set worker3 tomcat command lineworker.worker3.cmd_line
=-homeworker.worker3.cmd_line
=$(workers.tomcat_home)# Set worker3 Tomcat/JVM
settingsworker.worker3.jvm_lib=$(workers.java_home)$(ps)
jre$(ps)bin$(ps)>=$(workers.apache_log)$(ps)inprocess.stdoutworker.worker3.stderr
=$(workers.apache_log)$(ps)inprocess.stderrworker.worker3.sysprops
=tomcat.home=$(workers.tomcat_home)# Set properties for worker4 (lb)
which use worker1 and worker2worker.worker4.balanced_workers=worker1,worker2
 
 
 
来自: 新客网(www.xker.com) 详文参考:http://www.xker.com/page/e2007/0726/28198.html


版权声明: 原创作品,承诺转载,转载时请务必以超链接要领标明文章 原始来由 、作者信息和本声明。不然将清查法律责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1975457.html