- 总结 tomcat实现多虚拟机
vim ../conf/server.xml
<Host name="www.b.com" appBase="/data/website2/"unpackWARs="true" autoDeploy="true">
</Host><Host name="www.a.com" appBase="/data/website3/"unpackWARs="true" autoDeploy="true">
</Host>
- 总结 tomcat定制访问日志格式和反向代理tomcat
<Valve className="org.apache.catalina.valves.AccessLogValve" #类名directory="logs" #存储目录 prefix="localhost_access_log"#可选,默认为空 localhost_access_log 将生成如 localhost_access_log.2024-08-05.txt 这样的文件名。suffix=".txt" #日志后缀pattern="%h %l %u %t "%r" %s %b %D" #日志格式fileDateFormat="yyyy-MM-dd" /> #可选 日志文件名中的日期格式
日志格式标记
%h - 远程主机名
%l - 远程逻辑用户名(通常为-)
%u - 远程用户身份(通过 HTTP 认证)
%t - 请求时间
%r - 请求的第一行
%s - 响应状态码
%b - 发送的字节数(不包括 HTTP 头)
%D - 请求处理时间,以毫秒为单位
nginx反向代理tomcat
upstream tomcat {ip_hash; #调度算法
server 10.1.1.111:8080;
server 10.1.1.111:8080;}location / {proxy_pass http://tomcat; }
- 完成 tomcat实现MSM集群
ip | 服务 | 软件 |
---|---|---|
192.168.1.130 | 调度代理 | rocky8 nginx |
192.168.1.132 | 服务器 | rocky8 tomcat(9.0.75) jdk(8u371) memcached |
192.168.1.133 | 服务器 | rocky8 tomcat(9.0.75) jdk(8u371) memcached |
调度器:
vim /etc/nginx/nginx.conf
http {upstream tomcat-server {server t1.org:8080;server t2.org:8080;}server {location / {}location ~* \.(jsp|do)$ {proxy_pass http://tomcat-server;}
vim /etc/hosts
192.168.1.132 t1.org t1
192.168.1.133 t2.org t2
服务器:
vim /etc/sysconfig/memcached
#OPTIONS="-l 127.0.0.1,::1" #注释
配置tomcat
vim conf/server.xml
##tomcat1<Engine name="Catalina" defaultHost="t1.zz.org" jvmRoute="Tomcat1"> <Host name="t1.zz.org" appBase="/data/webapps" autoDeploy="true" > </Host> </Engine>
##tomcat2<Engine name="Catalina" defaultHost="t2.zz.org" jvmRoute="Tomcat1"> <Host name="t2.zz.org" appBase="/data/webapps" autoDeploy="true" > </Host> </Engine>
vim conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes="n1:192.168.1.132:11211,n2:192.168.1.133:11211" failoverNodes="n1" #tomcat则为n2requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFact
ory"/> #写入倒数第一行上
vim /data/webapps/ROOT/index.jsp #server.xml中的appbase位置
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>tomcat test</title>
</head>
<body>
<h1> tomcat website </h1>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
##显示服务器名称、服务器的本地 IP 地址和端口号、会话 ID 以及当前的日期和时间。这些输出将在每次请求页面时动态生成。
将对应版本的jsp文件放入tomcat/lib中;并重启
查看结果:
- 总结 JVM垃圾回收算法和分代
JVM的垃圾确认机制是 Garbage 垃圾确定方法,每个使用的内存都有一个引用标记器,当内存没有引用数后标记为垃圾。
回收算法
-
标记-清除 Mark-Sweep
标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆清理未标记对象(无引用数)的内存。
优点:
算法简单
缺点:
标记-清除最大的问题会造成内存碎片,但是不浪费空间,效率较高(如果对象较多时,逐一删除效率也会受到影响) -
标记-压缩 (压实)Mark-Compact
将上述的内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。
特点:
标记-压缩算法好处是整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。
缺点:
内存整理过程有消耗,效率相对低下 -
复制 Copying
先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对象复制到B。复制到B的时候连续的使用内存,最后将A一次性清除干净。
特点:
无碎片,效率高
缺点:
只有一半的内存使用率
JVM分代
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内存。
年轻代垃圾处理:
eden生成对象,放满之后将标记的放入幸存区,幸存区两个区可以互相转换(进行回收时标记对象相互转移),而未标记则都回收。
当幸存区中有长期存在的对象则放入老年代(老年代不经常做回收),当老年代满时,则将所有空间进行垃圾回收。
- 总结memcache使用,安装和MSM原理
memcache是个内存数据库
Memcache使用:
缓存数据:
- 将数据存入内存,减少访问延迟。
- 使用键值对的方式存储数据,键是唯一的标识符,值是需要缓存的数据。
设置数据:
- 使用 set(key, value, expiration_time) 方法将数据缓存到 Memcache 中。
- key 是数据的标识符,value 是要缓存的内容,expiration_time 是数据的过期时间。
获取数据:
- 使用get(key)通过键获取
删除数据:
- 使用delete(key)删除
数据更新:
- 再次调用set
memcache安装:
使用yum仓库安装:
yum install memcached
编译安装(使用脚本):
MEMCACHED=memcached-1.6.20
INSTALL_DIR=/apps/memcachedyum -y install gcc libevent-devel
tar xvf $MEMCACHED.tar.gz
cd $MEMCACHED/
./configure --prefix=$INSTALL_DIR
make && make installecho PATH=$INSTALL_DIR/bin:'$PATH' > /etc/profile.d/memcached.sh
. /etc/profile.d/memcached.shuseradd -r -s /sbin/nologin memcached
MSM原理
MSM 是 Memcache Session Management 的简称,用于在 Web 应用中管理用户会话,通常与 Memcache 结合使用。
服务器将用户数据如(session等信息)存入内存,通过memcache管理。而通过memcache实现多个服务器的信息迁移,保证用户的会话数据一致性和快速读写。但非持久化,会自动过期,适合短期高效的存储数据。