第十一周作业

  1. 总结 tomcat实现多虚拟机

    name 必须是主机名,用主机名来匹配
    appBase 当前主机的网页根目录,是相对于 $CATALINA_HOME ,也可以使用绝对路径
    unpackWARs 是否自动解压war格式
    autoDeploy 热部署,自动加载并运行应用
    

    1)配置server.xml文件

    image-20240714193311515

    2)systemctl restart tomcat#重启

    3)准备数据

    mkdir /data/mysite/ROOT -p
    echo ww.yu.org > indeex.html
    

    4)改host

    image-20240714193934690

    5)访问测试

    image-20240714194036090

    image-20240714193907179

  2. 总结 tomcat定制访问日志格式和反向代理

    tomcat有五类日志:catalina、localhost、manager、admin、host-manager

    catalina.out

    catalina.out即标准输出和标准出错,所有输出到这两个位置的都会进入catalina.out,这里包含tomcat

    运行自己输出的日志以及应用里向console输出的日志。默认这个日志文件是不会进行自动切割的,我们

    需要借助其他工具进行切割(注意:catalina.out文件如果过大会影响)

    catalina.YYYY-MM-DD.log

    catalina.{yyyy-MM-dd}.log是tomcat自己运行的一些日志,这些日志还会输出到catalina.out,但是应

    用向console输出的日志不会输出到catalina.{yyyy-MM-dd}.log,它是tomcat的启动和暂停时的运行日

    志,注意,它和catalina.out是里面的内容是不一样的。

    localhost.YYYY-MM-DD.log

    localhost.{yyyy-MM-dd}.log主要是应用初始化(listener, filter, servlet)未处理的异常最后被tomcat捕获

    而输出的日志,它也是包含tomcat的启动和暂停时的运行日志,但它没有catalina.2018-09-19.log日志全。

    它只是记录了部分日志。

    localhost_access_log.YYYY-MM-DD.txt

    这个是访问tomcat的日志,请求时间和资源,状态码都有记录。

    host-manager.YYYY-MM-DD.log

    这个是放tomcat的自带的manager项目的日志信息的,未看到有什么重要的日志信息。

    manager.YYYY-MM-DD.log

    这个是tomcat manager项目专有的日志文件.

    ======================================================================

    反向代理:

    配置环境:在192.168.10.101机器上安装nginx分别在192.168.10.102与192.168.10.103的机器上安装tomcat。将session.jsp移动到webapps/ROOT下

    在192.168.10.101上进行nginx设置

    root@ubuntu: conf.d$ vim www.tomcat.com.conf 
    upstream tomcat {
      server 192.168.10.102:8080;
      server 192.168.10.103:8080;
    }
    server{
      listen 80;
      server_name www.tomcat.com;
      location / {
        proxy_pass http://tomcat;
      }
    }
    

    连接测试:

    设置主机host:192.168.10.101 www.tomcat.com

    image-20240714204031158image-20240714204040339

  3. 完成 tomcat实现MSM集群

    192.168.10.102设置:

    修改 conf/server.conf

    root@rocky2: ROOT$ vim /usr/local/tomcat/conf/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.0.4"
                            port="45564"
                            frequency="500"
                            dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="192.168.10.102"
                          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.MessageDispatchInterceptor"/>
              </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>
    

    修改应用目录下的 WEB-INF/web.xml文件开启该应用程序的分布式

    root@yu01: ~$ vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml 
    在倒数第二行添加<distributable/>
    

    192.168.10.103设置:

    修改 conf/server.conf 复制上一个文件只用修改下面的一行ip

    address="192.168.10.103"
    

    重复上面过程

    测试:查看sessionID是否相同

    image-20240714211009470

    image-20240714211016388

  4. 总结 JVM垃圾回收算法和分代

    标记清除Mark-Sweep

    分垃圾标记阶段和内存释放两个阶段。
    标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆
    对未标记对象(即不再使用的对象)逐一进行清理。
    

    标记压缩(压实)Mark-Compact

    分垃圾标记阶段和内存整理两个阶段。
    标记阶段,找到所有可访问对象打个标记。
    内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。
    

    复制 Copying

    先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对
    象复制到B。复制到B的时候连续的使用内存,最后将A一次性清除干净。
    特点
    好处是没有碎片,复制过程中保证对象使用连续空间,且一次性清除所有垃圾,所以即使对象很多,收回效
    率也很高
    缺点是比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价。
    

    分代:

    堆内存分代

    将heap内存空间分为三个不同类别:年轻代、老年代、持久代

    Heap堆内存分为
    年轻代Young:Young Generation
    伊甸园区eden: 只有一个,刚刚创建的对象
    幸存(存活)区Servivor Space:有2个幸存区,一个是from区,一个是to区。大小相等、地位
    相同、可互换。
    from 指的是本次复制数据的源区
    to 指的是本次复制数据的目标区
    老年代Tenured:Old Generation, 长时间存活的对象
    永久代:JDK1.7之前使用, 即Method Area方法区,保存JVM自身的类和方法,存储JAVA运行时的环境信息, 
    JDK1.8后 改名为 MetaSpace,此空间不存在垃圾回收,关闭JVM会释放此区域内存,此空间物理上不属于
    heap内存,但逻辑上存在于heap内存
    永久代必须指定大小限制,字符串常量JDK1.7存放在永久代,1.8后存放在heap中
    MetaSpace 可以设置,也可不设置,无上限
    

    年轻代回收 Minor GC

    1. 起始时,所有新建对象(特大对象直接进入老年代)都出生在eden,当eden满了,启动GC。这个称
    为Young GC 或者 Minor GC。
    2. 先标记eden存活对象,然后将存活对象复制到s0(假设本次是s0,也可以是s1,它们可以调
    换),eden剩余所有空间都清空。GC完成。
    3. 继续新建对象,当eden再次满了,启动GC。
    4. 先同时标记eden和s0中存活对象,然后将存活对象复制到s1。将eden和s0清空,此次GC完成
    5. 继续新建对象,当eden满了,启动GC。
    6. 先标记eden和s1中存活对象,然后将存活对象复制到s0。将eden和s1清空,此次GC完成
    以后就重复上面的步骤。
    

    老年代回收 Major GC

    进入老年代的数据较少,所以老年代区被占满的速度较慢,所以垃圾回收也不频繁。
    如果老年代也满了,会触发老年代GC,称为Old GC或者 Major GC。
    由于老年代对象一般来说存活次数较长,所以较常采用标记-压缩算法。
    当老年代满时,会触发 Full GC,即对所有"代"的内存进行垃圾回收
    Minor GC比较频繁,Major GC较少。但一般Major GC时,由于老年代对象也可以引用新生代对象,所
    以先进行一次Minor GC,然后在Major GC会提高效率。可以认为回收老年代的时候完成了一次Full 
    GC。
    所以可以认为 MajorGC = FullGC
    

    GC 触发条件

    Minor GC 触发条件:当eden区满了触发
    Full GC 触发条件:
    老年代满了
    System.gc()手动调用。不推荐
    年轻代:
    存活时长低
    适合复制算法
    老年代:
    区域大,存活时长高
    适合标记压缩算法
    
  5. 总结memcache使用,安装和MSM原理

应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用。
Memcached 采用了 Slab Allocator 机制来分配、管理内存。

Page:分配给Slab的内存空间,默认为1MB,分配后就得到一个Slab。Slab分配之后内存按照固定字节大小等分成chunk。
Chunk:用于缓存记录k/v值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中。假设chunk有128bytes、64bytes等多种,数据只有100bytes存储在128bytes中,存在少许浪费。 Chunk最大就是Page的大小,即一个Page中就一个Chunk
Slab Class:Slab按照Chunk的大小分组,就组成不同的Slab Class, 第一个Chunk大小为 96B的 Slab为Class1,Chunk 120B为Class 2,如果有100bytes要存,那么Memcached会选择下图中Slab Class 2 存储,因为它是120bytes的Chunk。Slab之间的差异可以使用Growth Factor 控制,默认1.25。
懒过期 Lazy Expiration:memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。

LRU : 当内存不足时, memcached 会使用 LRU ( Least Recently Used )机制来查找可用空间,分配给新记录 使用。

memcache安装

包安装:

[root@ubuntu ~] #wget http://memcached.org/files/memcached-1.6.17.tar.gz
[root@ubuntu ~] #tar xf memcached-1.6.17.tar.gz
[root@ubuntu memcached-1.6.17] #./configure --prefix=/apps/memcached
[root@ubuntu memcached-1.6.17] #make && make install
[root@ubuntu ~] #useradd -r -s /sbin/nologin memcached

MSM原理

MSM(memcached session manager)提供将Tomcat的session保持到memcached或Redis的程序,

可以实现高可用。

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值