tomcat负载均衡,集群,memcached,jvm详解(第38天)

tomcat的配置文件server.xml, webapp的组织形式, 应用程序的部署, LAMT, LNMT, LNAMT;


配置文件server.xml文件的结构:最主要是配置Host和Context
        server.xml:
            <server>
                <service>
                    <connector port="8080" />
                    <connector port="8009" protocol="AJP/1.3" />
                    <engine >
                        <Host />
                        <Host >
                            <Context path="" docBase="" />
                        </Host>
                    </engine>
                </service>
            </server>


tomcat webapp 目录结构如下:
            /                 根目录
            classes       类文件
            lib               用到的类库
            META-INF  该目录可以有
            WEB-INF    该目录可以有web.xml




tomcat webapp的部署:
冷部署:
 热部署:manager(tomcat自带的应用程序) app, ant, tcd





Tomcat Cluster(3) tomcat集群:
tomcat集群的相关信息:
tomcat集群:客户端发起请求,nginx负责接受处理请求并作动静分离,将其中的动态请求分发给后端服务器,后端服务器一般可以是apache,apache负责将这些动态请求转发(反向代理)给tomcat。这样的apache和tomcat的组合,可以有多套。



会话的保持:
session sticky:session绑定有2种:基于源IP和基于cookie的绑定
            source ip
            cookie
session cluster: session集群
session server :kv: memcached保存session, redis




(1) LB tomcat
        nginx tomcats
        apache tomcats
(2) LB tomcat cluster
(3) LB tomcat
        session server  memcached保存session





apache作为前端,并且负载均衡请求到后端的tomcat服务器组,tomcats作为后端的实现方法有如下3种:第3种方法不推荐使用
        (1) apache:
                mod_proxy
                mod_proxy_http  使用http协议反向代理请求到后端tomcat
                mod_proxy_balancer   负载均衡模块
            tomcat:
                http connector   tomcat使用http协议接受apache的http请求
        (2) apache:
                mod_proxy
                mod_proxy_ajp   使用ajp协议反向代理请求到后端tomcat
                mod_proxy_balancer            负载均衡模块 
            tomcat:
                ajp connector  tomcat使用ajp协议接受apache的ajp请求
        (3) apache:
                mod_jk
            tomcat:
                ajp connector




第一种方法的实现:
        <proxy balancer://lbcluster1>
            BalancerMember http://172.16.100.68:8080 loadfactor=10 route=TomcatA
            BalancerMember http://172.16.100.69:8080 loadfactor=10 route=TomcatB
        </proxy>

        <VirtualHost *:80>
            ServerName web1.magedu.com
            ProxyVia On
            ProxyRequests Off
            ProxyPreserveHost On
            <Proxy *>
                Require all granted
            </Proxy>
            ProxyPass / balancer://lbcluster1/
            ProxyPassReverse / balancer://lbcluster1/
            <Location />
                Require all granted
            </Location>
        </VirtualHost>



第一种方法如果需要会话绑定:
            Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
            <proxy balancer://lbcluster1>
                BalancerMember http://172.16.100.68:8080 loadfactor=10 route=TomcatA
                BalancerMember http://172.16.100.69:8080 loadfactor=10 route=TomcatB
                ProxySet stickysession=ROUTEID
            </proxy>

            <VirtualHost *:80>
                ServerName web1.magedu.com
                ProxyVia On
                ProxyRequests Off
                ProxyPreserveHost On
                <Proxy *>
                    Require all granted
                </Proxy>
                ProxyPass / balancer://lbcluster1/
                ProxyPassReverse / balancer://lbcluster1/
                <Location />
                    Require all granted
                </Location>
            </VirtualHost>



第二种方法的实现:
        #Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
        <proxy balancer://lbcluster1>
            BalancerMember ajp://172.16.100.68:8009 loadfactor=10 route=TomcatA
            BalancerMember ajp://172.16.100.69:8009 loadfactor=10 route=TomcatB
            ProxySet stickysession=ROUTEID
        </proxy>

        <VirtualHost *:80>
            ServerName web1.magedu.com
            ProxyVia On
            ProxyRequests Off
            ProxyPreserveHost On
            <Proxy *>
                Require all granted
            </Proxy>
            ProxyPass / balancer://lbcluster1/
            ProxyPassReverse / balancer://lbcluster1/
            <Location />
                Require all granted
            </Location>
        </VirtualHost>


补充:mod_proxy_balancer模块内置的manager:
        <Location /balancer-manager>
          SetHandler balancer-manager
          Proxypass !
          Order Deny,Allow
          Allow from all
        </Location>








Session Cluster:
 tomcat的session manager:会话管理器如下几种:
            StandardManager   标准session管理器
            PersistentManager:持久化session管理器,可以存储在文件和JDBC数据库中
                FileStore
                JDBC
            DeltaManager  每个tomcat节点多播,每个节点同步其他节点的session
            BackupManager


构建步骤:
(1) 各tomcat节点配置使用deltamaanager: server.xml文件
        <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.1.7"
                        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.ClusterSessionListener"/>
        </Cluster>

(2) 为需要使用session cluster的webapps开启session distribution的功能:
            WEB-INF/web.xml中添加
                <distributable/>







Memcached:
LiveJournel旗下Danga Interactive公司Brad。
使用非常广泛
是高性能key/value数据缓存系统。



软件系统需要存储的数据的分类:
结构化数据:RDBMS
半结构化数据:JSON(Documentation) --> NoSQL
非结构化数据:文件系统保存的各种各样的数据
分布式存储:分布式文件系统、存储;FUSE





memcached的特点:
协议简单
基于libevent事件处理
基于内存完成数据存储:LRU(最近最少使用)
memcached互不通信的集群:分布式


安装:
yum  install memcached -y  安装
memcached默认监听在tcp和udp的11211的端口
memcached提供了memcached和memcached-tool的二进制程序
systemctl start memcached.service   启动memcached
man memcached   查看帮助信息



旁挂式缓存:
 一半在客户端;一半在服务端;



使用telent连结memcached:
telnet  127.0.0.1  11211  连接上memcached,即可管理memcached
set mykey 0 60 11  表示设置键mykey,对应的值11个字符
hello world
get mykey   获取mykey对应的值
hello world   输出hello world
incr
flush_all



php语言如何连接memcached: 使用extensions,
php使用memcache, memcached连结memcached服务
c语言使用: libmemcached类库连结memcached



memcached在内存中的存储:
slab allocation:整理内存以进行复用;
slab allocator的工作机制如下:
 分配一2字节,4字节,8字节等的内存。
            Page: 分配给slab用于再次分割为chunk的内存空间;
            chunk:用于缓存缓存对象的空间;
            slab class:特定大小的chunk组合而成的组;



memcached-tool命令的使用
memcached-tool 127.0.0.1  命令可以查看stats:每个字段的解释如下
        #:表示slab class的编号;
        Item_size:Chunk的大小;
        Max_age:缓存对象的生存时间;
        Pages:分配给slab的内存页数;
        Count:slab内的记录数;
        Full?:slab内是否仍有空闲chunk;

分布式机制:
        互不通信的分布式集群;



memcached -u memcached -vv   可以查看详细信息
memcached -u memcached -vv  -f  1.1  调整增长因子的大小




memcached-session-manager项目:
该项目用于把tomcat集群的session保存到memcached服务中。





JVM





jvm 的堆区结构:


jvm head内存空间:
新生代:新生区eden(初建对象放于此),存活区survivor(步入成熟期的对象放于此),存活区分为存活区ss1(也称为to)和存活区ss2(也成为from)
老年代:
持久代:


垃圾回收器:
新生代垃圾回收器:Minor GC
老年代垃圾回收器:Major GC(full GC)




Minor GC工作原理
Major GC工作原理:遍历整个老年代堆区,对不可用的对象做标记,然后删除




java调整堆区内存大小的选项:


-Xmx
-Xms
-XX:NewSize
-XX:MaxNewSize
-XX:MaxPermSIze
-XX:PermSize
这些设置启动的时候传递给虚拟机:
对于tomcat来说,catalina.sh脚本中有两个环境变量CATALINA_OPTS(对于catalina启动的虚拟机有效)和JAVA_OPTS(对主机的所有java虚拟机都有效)



java的性能工具的使用:
OutOfMemoryError
内存泄漏
线程死锁
锁竞争
java消耗过多的CPU


jps(java virtual machine process status tool)
监控jvm进程的状态信息
jps [options] [hostsid]
   -m
    -l   显示main类或jar的完全限定名称
    -v  显示为jvm虚拟机指定的参数



jstack 查看某个java进程内的线程堆栈信息
jstack [options] pid
  -l   long listing  输出完整的锁信息
  -m 混合模式,会输出java堆栈以及C/C++堆栈信息


jmap(jvm memory map 查看堆内存使用情况)
jmap [options] pid
    -heap   详细输出堆内存空间使用状态
    -histo[:live]  查看堆内存中的对象数目,统计信息



jhat(java heap analysls tool):


jstat:jvm统计监测工具
 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
jstat可用的option有:
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
字段解释如下:
S0C,S1C,S0U,S1U:C表示容量,U表示已用量,存活区1和存活区2容量和已用量
EC,EU,eden区域的容量和已用量
OC,OU,表示老年代的容量和已用量
YGC,YGT,表示新生代的GC次数和耗时
FGC,FGCT,表示老年代的GC次数和耗时
GCT   GC总耗时

两个GUI工具:jconsole和jvisualvm













评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用