AmazingCounters.com

Tomcat企业级应用和高级实现

session会话保持方法:

(1) session sticky:source_ip(nginx: ip_hash、haproxy: source、lvs: sh)cookie(nginx:hash、haproxy: cookie)即在代理调度层做session

(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

示例程序:mkdir  /usr/share/tomcat/webapp/myapp/{WEB-INF}  -pv

vim  /usr/share/tomcat/webapp/myapp/index.jsp   

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

<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
      <body>
      <h1><font color="red">TomcatA.heiye.com</font></h1>
      <table align="centre" border="1">
      <tr>
      <td>Session ID</td>
      <% session.setAttribute("heiye.com","heiye.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.heiye.com</font></h1>
      <table align="centre" border="1">
      <tr>
      <td>Session ID</td>
      <% session.setAttribute("heiye.com","heiye.com"); %>
      <td><%= session.getId() %></td>
      </tr>
      <tr>
      <td>Created on</td>
      <td><%= session.getCreationTime() %></td>
      </tr>
      </table>
</body>
</html>

第一种方法的实现:

<proxy balancer://tcsrvs>
    BalancerMember http://172.18.64.107:8080  loadfactor 2  status=D
     BalancerMember http://172.18.64.7:8080  loadfactor 1 
    ProxySet lbmethod=byrequests  (bybusiness 、bytraffic)
</Proxy>
<VirtualHost *:80>
    ServerName lb.heiye.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>

F5刷新后测试,并进入balancer-manager管理页面,可直接对主机状态管理

会话粘性的实现方法:

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

 <proxy balancer://tcsrvs>
BalancerMember http://172.18.64.107:8080 route=TomcatA loadfactor=1
BalancerMember http://172.18.64.7:8080 route=TomcatB loadfactor=2
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID
</Proxy>

<VirtualHost *:80>
    ServerName lb.heiye.com
    ProxyVia On
    roxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
    Require all granted
    </Proxy>
    ProxyPass / balancer://tcsrvs/
    ProxyPassReverse / balancer://tcsrvs/
    <Location />
    Require all granted
    </Location>
</VirtualHost>

 

第二种方式:

<proxy balancer://tcsrvs>
    BalancerMember jsp://172.18.64.107:8080  loadfactor 2  status=D
     BalancerMember jsp://172.18.64.7:8080  loadfactor 1 
    ProxySet lbmethod=byrequests  (bybusiness 、bytraffic)
</Proxy>
<VirtualHost *:80>
    ServerName lb.heiye.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>

第三种方式实现:nginx   vim  /etc/nginx/nginx.conf

upstream  heiye {
        server 172.18.64.107:8080;
        server 172.18.64.7:8080;   
    }    

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        index        index.jsp  index.html ;
        root         /usr/share/tomcat/webapps/ROOT/;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location   / {
                proxy_pass http://heiye;
        }   

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

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的常用优化配置:

(1) 内存空间:

/etc/sysconfig/tomcat

JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize="

-server:服务器模型

-Xms:堆内存初始化大小;

-Xmx:堆内存空间上限;

-XX:NewSize=:新生代空间初始化大小;

-XX:MaxNewSize=:新生代空间最大值;

-XX:PermSize=:持久代空间初始化大小;

-XX:MaxPermSize=:持久代空间最大值;

 

(2) 线程池设置:

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />

常用属性:

maxThreads:最大线程数;最大并发连接数;

minSpareThreads:最小空闲线程数;

maxSpareThreads:最大空闲线程数;

acceptCount:等待队列的最大长度;

URIEncoding:URI地址编码格式,建议使用UTF-8;

enableLookups:是否启用dns解析,建议禁用;

compression:是否启用传输压缩机制,建议“on";

compressionMinSize:启用压缩传输的数据流最小值,单位是字节;

compressableMimeType:定义启用压缩功能的MIME类型;

text/html, text/xml, text/css, text/javascript

(3) 禁用8005端口;

<Server port="-1" shutdown="SHUTDOWN">

(4) 隐藏版本信息:

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />

Server="SOME STRING"

Tomcat Session Server (memcached)

https://github.com/magro/memcached-session-manager

支持的session server类型:

memcached:

couchbase:

redis:

    示例方案:

            Tomcat7:

                memcached

                javolution

JVM常用的分析工具:

jps:用来查看运行的所有jvm进程;

jinfo:查看进程的运行环境参数,主要是jvm命令行参数;

jstat:对jvm应用程序的资源和性能进行实时监控;

jstack:查看所有线程的运行状态;

jmap:查看jvm占用物理内存的状态;

jconsole:

jvisualvm:

 

jps:Java virutal machine Process Status tool,

jps [-q] [-mlvV] [<hostid>]

-q:静默模式;

-v:显示传递给jvm的命令行参数;

-m:输出传入main方法的参数;

-l:输出main类或jar完全限定名称;

-V:显示通过flag文件传递给jvm的参数;

[<hostid>]:主机id,默认为localhost;

 

jinfo:输出给定的java进程的所有配置信息;

jinfo [option] <pid>

-flags:to print VM flags

-sysprops:to print Java system properties

-flag <name>:to print the value of the named VM flag

 

jstack:查看指定的java进程的线程栈的相关信息;

jstack [-l] <pid>

jstack -F [-m] [-l] <pid>

-l:long listings,会显示额外的锁信息,因此,发生死锁时常用此选项;

-m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息;

-F:当使用“jstack -l PID"无响应,可以使用-F强制输出信息;

 

jstat:输出指定的java进程的统计信息

jstat -help|-options

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

 

# jstat -options

-class:class loader

-compiler:JIT

-gc:gc

-gccapacity:统计堆中各代的容量

-gccause:

-gcmetacapacity

-gcnew:新生代

-gcnewcapacity

-gcold:老年代

-gcoldcapacity

-gcutil

-printcompilation

 

[<interval> [<count>]]

interval:时间间隔,单位是毫秒;

count:显示的次数;

 

-gc:

YGC:新生代的垃圾回收次数;

YGCT:新生代垃圾回收消耗的时长;

FGC:Full GC的次数;

FGCT:Full GC消耗的时长;

GCT:GC消耗的总时长;

       图形工具:

            jconsole

            jvisualvm

            

jmap:Memory Map, 用于查看堆内存的使用状态;

jhat:Java Heap Analysis Tool

jmap [option] <pid>

 

查看堆空间的详细信息:

jmap -heap <pid>

 

查看堆内存中的对象的数目:

jmap -histo[:live] <pid>

live:只统计活动对象;

 

保存堆内存数据至文件中,而后使用jvisualvm或jhat进行查看:

jmap -dump:<dump-options> <pid>

dump-options:

live         dump only live objects; if not specified, all objects in the heap are dumped.

format=b     binary format

file=<file>  dump heap to <file>

 

 

了解何为full gc,如何应对

 

posted @ 2017-11-07 10:47  黑夜繁星  阅读(786)  评论(0编辑  收藏  举报
AmazingCounters.com