Tomcat高级实现

Posted 黑夜天星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat高级实现相关的知识,希望对你有一定的参考价值。

会话保持:

(1) session sticky

source_ip

nginx: ip_hash

haproxy: source

lvs: sh

cookie:

nginx:hash

haproxy: cookie

(2) session cluster:delta session manager

(3) session server:redis(store), memcached(cache)

 

Tomcat Cluster(session)

(1) session sticky

(2) session cluster

tomcat delta manager

(3) session server

memcached

 

Tomcat Cluster

(1) httpd + tomcat cluster

httpd: mod_proxy, mod_proxy_http, mod_proxy_balancer

tomcat cluster:http connector

(2) httpd + tomcat cluster

httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer

tomcat cluster:ajp connector

(3) httpd + tomcat cluster

httpd: mod_jk

tomcat cluster:ajp connector

(4) nginx + tomcat cluster

 

 

第一种方法的实现:

<proxy balancer://tcsrvs>

BalancerMember http://172.18.100.67:8080

BalancerMember http://172.18.100.68:8080

ProxySet lbmethod=byrequests

</Proxy>

 

<VirtualHost *:80>

ServerName lb.magedu.com

ProxyVia On

ProxyRequests Off

ProxyPreserveHost On

<Proxy *>

Require all granted

</Proxy>

ProxyPass / balancer://tcsrvs/

ProxyPassReverse / balancer://tcsrvs/

<Location />

Require all granted

</Location>

</VirtualHost>

 

BalancerMember:

BalancerMember [balancerurl] url [key=value [key=value ...]]

status:

D: Worker is disabled and will not accept any requests.

S: Worker is administratively stopped.

I: Worker is in ignore-errors mode and will always be considered available.

H: Worker is in hot-standby mode and will only be used if no other viable workers are available.

E: Worker is in an error state.

N: Worker is in drain mode and will only accept existing sticky sessions destined for itself and ignore all other requests.

loadfactor:

负载因子,即权重;

lbmethod:

Balancer load-balance method. Select the load-balancing scheduler method to use. Either byrequests, to perform weighted request counting; bytraffic, to perform weighted traffic byte count balancing; or bybusyness, to perform pending request balancing. The default is byrequests.

stickysession

Balancer sticky session name. The value is usually set to something like JSESSIONID or phpSESSIONID, and it depends on the backend application server that support sessions. If the backend application server uses different name for cookies and url encoded id (like servlet containers) use | to separate them. The first part is for the cookie the second for the path.

Available in Apache HTTP Server 2.4.4 and later.

 

会话粘性的实现方法:

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

 

<proxy balancer://tcsrvs>

BalancerMember http://172.18.100.67:8080 route=TomcatA loadfactor=1

BalancerMember http://172.18.100.68:8080 route=TomcatB loadfactor=2

ProxySet lbmethod=byrequests

ProxySet stickysession=ROUTEID

</Proxy>

 

<VirtualHost *:80>

ServerName lb.magedu.com

ProxyVia On

ProxyRequests Off

ProxyPreserveHost On

<Proxy *>

Require all granted

</Proxy>

ProxyPass / balancer://tcsrvs/

ProxyPassReverse / balancer://tcsrvs/

<Location />

Require all granted

</Location>

</VirtualHost>

 

启用管理接口:

<Location /balancer-manager>

SetHandler balancer-manager

ProxyPass !

Require all granted

</Location>

 

示例程序:

演示效果,在TomcatA上某context中(如/test),提供如下页面

<%@ page language="java" %>

<html>

<head><title>TomcatA</title></head>

<body>

<h1><font color="red">TomcatA.magedu.com</font></h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("magedu.com","magedu.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

 

 

演示效果,在TomcatB上某context中(如/test),提供如下页面

<%@ page language="java" %>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB.magedu.com</font></h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("magedu.com","magedu.com"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

 

第二种方式:

<proxy balancer://tcsrvs>

BalancerMember ajp://172.18.100.67:8009

BalancerMember ajp://172.18.100.68:8009

ProxySet lbmethod=byrequests

</Proxy>

 

<VirtualHost *:80>

ServerName lb.magedu.com

ProxyVia On

ProxyRequests Off

ProxyPreserveHost On

<Proxy *>

Require all granted

</Proxy>

ProxyPass / balancer://tcsrvs/

ProxyPassReverse / balancer://tcsrvs/

<Location />

Require all granted

</Location>

<Location /balancer-manager>

SetHandler balancer-manager

ProxyPass !

Require all granted

</Location>

</VirtualHost>

 

保持会话的方式参考前一种方式。

 

Tomcat Session Replication Cluster:

(1) 配置启用集群,将下列配置放置于<engine>或<host>中;

<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.MessageDispatch15Interceptor"/>

</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.JvmRouteSessionIDBinderListener"/>

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

</Cluster>

 

确保Engine的jvmRoute属性配置正确。

 

(2) 配置webapps

编辑WEB-INF/web.xml,添加<distributable/>元素;

 

注意:CentOS 7上的tomcat自带的文档中的配置示例有语法错误;

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

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

 

绑定的地址为auto时,会自动解析本地主机名,并解析得出的IP地址作为使用的地址;

以上是关于Tomcat高级实现的主要内容,如果未能解决你的问题,请参考以下文章

tomcat高级问题

Tomcat高级应用(添加虚拟主机及优化)

linux高级运维之Tomcat&&varnish

Nginx常见问题 Tomcat服务器 Tomcat高级应用

Dubbo3高级特性「框架与服务」自定义Dubbo服务容器及扩展容器实现分析

ApacheTomcat6高级编程的书籍章节