我在做tomcat(3个)集群,前端用apache,中间转发使用mod_jk,线上环境出现过这样的问题:一台tomcat因为某种原因挂掉(Full GC),apache却没有将剩下的请求发到其它tomcat,而是还在不断的累积异常的请求,导致进程数超标。
查阅tomcat 官方文档 ,里面对worker有这么几个参数:socket_timeout
、socket_connect_timeout
、connection_timeout
,意义都解释的很清楚,唯一不明白的是,JK与tomcat之间socket连接超时是真实的请求判断的,还是内部ping/pong机制判断的,因为设置retries时如果是real request,插入数据结果超时没完成,retries一次是否会导致产生两条记录。如果确定是ping/pong检测那就不会产生这样的问题,产生的新的问题是,tomcat的内存溢出,采用ping去检测状态时能否得到回响,timeout时间内得不到pong那自然使用其它tomcat,但tomcat内存溢出导致不能处理请求并不是网络不通,有回响也不一定。
题中有好几个问题,能否有一个确定的答案
worker.properties:
worker.properi
# servers
worker.list=controller,jkstatus
# ====== tomcat0 =======
worker.s7.port=8709
worker.s7.host=172.16.10.253
worker.s7.socket_timeout=30
worker.s7.connect_timeout=30000
worker.s7.ping_mode=connect
worker.s7.type=ajp13
worker.s7.lbfactor=1
# ====== tomcat1 =======
worker.s8.port=8809
worker.s8.host=172.16.10.253
worker.s8.socket_timeout=30
worker.s8.connect_timeout=30000
worker.s8.ping_mode=connect
worker.s8.type=ajp13
worker.s8.lbfactor=1
# ====== tomcat2 =======
worker.s9.port=8909
worker.s9.host=172.16.10.253
worker.s9.socket_timeout=30
worker.s9.connect_timeout=30000
worker.s9.ping_mode=connect
worker.s9.type=ajp13
worker.s9.lbfactor=1
# ====== controller ====
worker.controller.type=lb
worker.controller.retries=2
worker.controller.balance_workers=s7,s8,s9
worker.controller.sticky_session = 1
worker.jkstatus.type=status
server.xml:
<Connector port="8709" protocol="org.apache.coyote.ajp.AjpAprProtocol" redirectPort="8443"
connectionTimeout="30000" maxThreads="200" acceptCount="100" minSpareThreads="10"
enableLookups="false"/>
使用memcached来管理session同步。