tomcat的初实现与memcache

news2024/11/15 16:17:26

文章目录

    • 1. tomcat实现多虚拟机
    • 2. tomcat定制访问日志格式
    • 3. tomcat实现MSM集群
    • 4. JVM垃圾回收算法和分代
    • 5. memcache使用,安装和MSM原理

1. tomcat实现多虚拟机

一键安装tomcat并启动,使用openjdk
#!/bin/bash
version=10.1.28
user=tomcat
group=tomcat
yum install java-17-openjdk.x86_64  java-17-openjdk-devel.x86_64 wget -y
wget https://mirrors.aliyun.com/apache/tomcat/tomcat-10/v${version}/bin/apache-tomcat-${version}.tar.gz
tar xf apache-tomcat-${version}.tar.gz -C /usr/local/src
cd /usr/local/src
mv apache-tomcat-${version} tomcat-${version}
ln -s tomcat-${version} tomcat
echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64" > /usr/local/src/tomcat/conf/tomcat.conf
useradd -r -s /sbin/nologin tomcat
chown -R tomcat.tomcat /usr/local/src/tomcat-${version}
cat > /usr/lib/systemd/system/tomcat.service << EOF
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=/usr/local/src/tomcat/conf/tomcat.conf
ExecStart=/usr/local/src/tomcat/bin/startup.sh
ExecStop=/usr/local/src/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now tomcat

在这里插入图片描述 tomcat多主机配置

[root@centos8 ~]# mkdir -p /html/{web.app}/ROOT
[root@centos8 ~]# echo "this is website" > /html/web/ROOT/index.html
[root@centos8 ~]# echo "this is appsite" > /html/app/ROOT/index.html
[root@centos8 ~]# chown -R tomcat.tomcat /html/{web,app}/

2. tomcat定制访问日志格式

参数描述
%a远程IP地址
%A本地IP地址
%b发送的字节数(不包括HTTP标头)
%B发送的字节数(不包括HTTP标头)
%h远程主机名
%H请求协议
%l来自identd的远程逻辑用户名
%m请求方法(GET, POST, etc.)
%p接收此请求的本地端口
%q查询字符串
%r请求的第一行
%s响应的HTTP状态码
%S用户会话ID
%t日期和时间,通用日志格式
%u已通过身份验证的远程用户
%U请求的URL路径
%v本地服务器名称
%D处理请求所用的时间(毫秒)
%T处理请求所用的时间(秒)
%F提交响应所需的时间
%I当前请求线程名称
%X响应完成时的连接状态

日志配置地方

[root@server ~]# vim /usr/local/src/tomcat/conf/server.xml
<!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" /> #说明&quot在html中表示双引号
[root@client ~]# curl 10.0.0.4:8080
[root@server ~]# tail -f /usr/local/src/tomcat/logs/localhost_access_log.`date +%Y-%m-%d`.txt #查看日志

3. tomcat实现MSM集群

修改server1主机的 conf/server.xml

[root@server1 ~]# vim /usr/local/src/tomcat/conf/server.xml<Host> </host>块中间加入下面内容
<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.3"   
	port="45564"
 	frequency="500"
 	dropTime="3000"/>
  <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
 	address="10.0.0.4"          #指定网卡的IP
 	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>
      </Host>
    </Engine>
  </Service>
 </Server>
 [root@server1 ~]#systemctl restart tomcat

修改server2主机的 conf/server.xml

[root@server2 ~]# vim /usr/local/src/tomcat/conf/server.xml
<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.3"   
	port="45564"
 	frequency="500"
 	dropTime="3000"/>
  <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
 	address="10.0.0.6"
 	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>
      </Host>
    </Engine>
  </Service>
 </Server>
 [root@cserver2 ~]#systemctl restart tomcat

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

  1. 标记-清除 Mark-Sweep:分垃圾标记阶段和内存释放阶段。标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆,对未标记对象(即不再使用的对象)清理。最大的问题会造成内存碎片,但是效率很高,不浪费空间。
  2. 标记-压缩 (压实)Mark-Compact:分垃圾标记阶段和内存整理阶段。标记阶段,找到所有可访问对象打个标记。内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。好处是整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。但内存整理过程有消耗,效率相对低下。
  3. 复制 Copying:先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对 象复制到B。复制到B的时候连续的使用内存,最后将A一次性清除干净。缺点是比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价。好处是没有碎片,复制过程中保证对象使用连续空间
    总结
    效率: 复制算法>标记清除算法> 标记压缩算法
    内存整齐度: 复制算法=标记压缩算法> 标记清除算法
    内存利用率: 标记压缩算法=标记清除算法>复制算法

1.堆内存分代: 将heap内存空间分为三个不同类别: 年轻代、老年代、持久代Heap堆内存分为年轻代Young:Young Generation伊甸园区eden: 只有一个,刚刚创建的对象幸存(存活)区Servivor Space:有2个幸存区,一个是from区,一个是to区。大小相等、地位相同、可互换。from 指的是本次复制数据的源区to 指的是本次复制数据的目标区老年代Tenured:Old Generation, 长时间存活的对象
2 年轻代回收 Minor GC: 起始时,所有新建对象(特大对象直接进入老年代)都出生在eden,当eden满了,启动GC。这个称为Young GC 或者 Minor GC。先标记eden存活对象,然后将存活对象复制到s0(假设本次是s0,也可以是s1,它们可以调换),eden剩余所有空间都清空。GC完成。继续新建对象,当eden再次满了,启动GC。先同时标记eden和s0中存活对象,然后将存活对象复制到s1。将eden和s0清空,此次GC完成继续新建对象,当eden满了,启动GC。先标记eden和s1中存活对象,然后将存活对象复制到s0。将eden和s1清空,此次GC完成以后就重复上面的步骤。通常场景下,大多数对象都不会存活很久,而且创建活动非常多,新生代就需要频繁垃圾回收。但是,如果一个对象一直存活,它最后就在from、to来回复制,如果from区中对象复制次数达到阈值(默认15次,CMS为6次,可通过java的选项 -XX:MaxTenuringThreshold=N 指定),就直接复制到老年代。
3.老年代回收 Major GC: 进入老年代的数据较少,所以老年代区被占满的速度较慢,所以垃圾回收也不频繁如果老年代也满了,会触发老年代GC,称为Old GC或者 Major GC。由于老年代对象一般来说存活次数较长,所以较常采用标记-压缩算法。当老年代满时,会触发 Full GC,即对所有"代"的内存进行垃圾回收Minor GC比较频繁,Major GC较少。但一般Major GC时,由于老年代对象也可以引用新生代对象,所以先进行一次Minor GC,然后在Major GC会提高效率。可以认为回收老年代的时候完成了一次FullGC.所以可以认为 MajorGC = FullGC

5. memcache使用,安装和MSM原理

memcache介绍:Memcache是一个高性能的分布式内存对象缓存系统,用于加速动态 Web 应用程序通过减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高性能。
主要特性:

 1. 简单易用:客户端和服务器之间的通信基于简单的 ASCII 协议。
 2. 高可用性:可以部署多个Memcached服务器,应用程序自动负载均衡。
 3. 无单点故障:如果某个Memcached 实例宕机,其他实例仍然可用。
 4. 数据过期策略:支持设置数据的生存时间,到期后数据会被自动删除。

应用场景:
 1. 数据库查询结果缓存:存储频繁访问的数据,减少对数据库的请求。
 2. 会话数据存储:替代文件或数据库存储用户会话信息。
 3. API 调用结果缓存:减少对外部服务的调用频率。
MSM 原理
 Slab 分类:Memcached将内存划分为多个 slab 类别,每个类别对应一组固定大小的内存块。
 内存块大小:每个 slab 类别中的内存块具有相同的大小,大小从 1KB 开始,每次翻倍。
 Slab 类别:当 Memcached 接收到一个新项时,它会根据项的大小将其放置在合适的 slab 类别中。
 分配和释放:当一个项被删除或过期时,其内存块不会立即释放,而是返回到 slab 类别中供重用。
 Eviction Policy:当某个 slab 类别的内存不足时,Memcached 会根据一定的策略(如 LRU)释放旧的项以腾出空间。
Memcached 安装

[root@server ~]# yum install -y epel-release
[root@server ~]# yum install -y memcached
[root@server ~]# systemctl start memcached.service #进行启动

memcached使用

常用命令意思
set设置键值对
get获取键对应的值
delete删除键值对
replace如果键存在,则替换其值
append/prepend:在现有值的末尾/开头追加数据
increment/decrement:对整数值进行递增/递减操作
stats显示服务器统计信息
# 设置键值对
[root@server ~]# echo "set mykey 0 60 4\r\nvalue\r\n" | nc localhost 11211
# 获取键值对
[root@server ~]# echo "get mykey\r\n" | nc localhost 11211
# 删除键值对
[root@server ~]# echo "delete mykey\r\n" | nc localhost 11211

使用 Python 客户端操作 Memcached

[root@server ~]# pip install python-memcached
[root@server ~]# vim mem.py
import memcache
# 创建 Memcached 客户端
mc = memcache.Client(['127.0.0.1:11211'])
# 设置键值对
mc.set('mykey', 'Hello Memcached!')
# 获取键值对
value = mc.get('mykey')
print(value)  # 输出: Hello Memcached!
# 删除键值对
mc.delete('mykey')
# 替换键值对(如果键存在)
mc.set('mykey', 'Hello!')
mc.replace('mykey', 'MyMemcached!')
# 追加数据
mc.set('mykey', 'My')
mc.append('mykey', 'Memcached!')
print(mc.get('mykey'))  # 输出: MyMemcached!
# 递增/递减整数值
mc.set('counter', 1)
mc.incr('counter', 1)
print(mc.get('counter'))  # 输出: 2
mc.decr('counter', 1)
print(mc.get('counter'))  # 输出: 1
[root@server ~]# chmod +x mem.py
[root@server ~]# python mem.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++初阶】:C++入门篇(一)

文章目录 前言一、C命名空间1.1 命名空间的定义1.2 命名空间的使用 二、C的输入和输出2.1 cin和cout的使用 三、缺省参数3.1 缺省参数的分类 四、函数重载4.1 函数重载概念及其条件4.2 C支持函数重载原理 -- 名字修饰 前言 C是在C语言的基础之上&#xff0c;增加了一些面向对象…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector

1.杨辉三角 . - 力扣&#xff08;LeetCode&#xff09; 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> arr;int i 0;int j 0;for (i…

Git入门 -- 区域详解

Git入门 – 区域详解 1.Git 1.1 Git与SVN的区别 Git不仅仅是版本控制系统&#xff0c;同时也是内容管理系统。以下是Git与SVN的区别&#xff1a; 分布式&#xff1a;Git是分布式但SVN不是&#xff0c;这是Git与其他系统的核心区别。存储方式为元数据&#xff1a;Git在存储数…

Python 如何使用正则表达式进行复杂文本处理

正则表达式&#xff08;Regular Expressions&#xff0c;简称 regex 或 RE&#xff09;是一种强大的工具&#xff0c;用于在文本中执行模式匹配和搜索操作。通过正则表达式&#xff0c;你可以轻松地查找、替换和提取文本中的特定模式。Python 提供了一个内置的 re 模块&#xf…

数据结构--树(笔记)

文章目录 1. 含义及术语2. 应用3. 常见二叉树种类① 二叉树(Binary tree)一般树和二叉树的区别 ② 完美二叉树(Perfect Binary tree)③ 完全二叉树(Complete Binary tree)④ 满二叉树(Full Binary tree)完美二叉树、完全二叉树和满二叉树 ⑤ 平衡二叉树(Balanced Binary tree)二…

基于STM32开发的智能门锁系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化密码输入与验证门锁控制与状态指示Wi-Fi通信与远程监控应用场景 家庭智能门锁办公室智能门禁系统常见问题及解决方案 常见问题解决方案结论 1. 引言 智能门锁系统通过集成键盘模块…

自学编程从哪个语言入手比较好?

自学编程时选择哪个语言作为起点&#xff0c;仍然取决于你的个人兴趣、学习目标和职业规划。希望以下建议可以帮到你。 Python&#xff1a; 如果你对数据分析、机器学习、人工智能、Web 开发或自动化脚本编写等领域感兴趣&#xff0c;Python 是一个非常好的起点。它的语法简洁…

java如何通过jdbc操作数据库

1. 安装JDBC 官网地址&#xff1a;官网地址选择 下载后&#xff0c;解压缩&#xff0c;然后将mysql-connector-j-9.0.0.jar文件放到项目目录下 编写操作数据库代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql…

20240819 每日AI必读资讯

&#x1f4da;AI爆料人遭全网封禁&#xff01;OpenAI等25个机构祭大招&#xff0c;一眼辨别AI机器人 - 最近半个月&#xff0c;全网被OpenAI的「AI爆料人」「草莓哥」iruletheworldmo愚弄。所有人没有等他预测的GPT-4o large模型&#xff0c;反被AI初创MultiOn创始人揭穿身份—…

Squid:概念、代理案例

目录 Squid 缓存代理 Web代理的工作机制 代理类型 传统代理 透明代理 使用代理的好处 示例和案例 Squid安装示例 使用源码包安装Squid 一些其他的安装参数&#xff08;安装用时较长&#xff09; 为什么异步io要指定线程数&#xff1f; 配置和初始化Squid 运行测试…

大咖齐聚!2024深圳eVTOL展首批发言嘉宾阵容亮相!

大咖齐聚&#xff01;2024深圳eVTOL展首批发言嘉宾阵容亮相&#xff01; 由上海市航空学会、广东省航空航天学会主办的2024深圳eVTOL产业发展大会暨低空经济展览会将于9月23-25日在深圳坪山燕子湖国际会展中心盛大召开。 2024深圳eVTOL产业发展大会由主论坛与低空经济、航电系…

一年秀一次!稚晖君的人形机器人上新了,还有开源、免费彩蛋

一年一秀&#xff0c;稚晖君的第二代人形机器人来了。 灵巧小手&#xff0c;正在麻将桌上叱咤风云&#xff1a; 不对不对&#xff0c;让我们先看看整体气质&#xff1a; 然后是常规家务&#xff0c;能看出来也是非常熟练&#xff1a; 在大模型风靡的 2024 年&#xff0c;如果说…

FreeRtos----------- 同步互斥

一、同步的缺陷&#xff1a;全局变量协同两个任务 1.建立两个任务&#xff1a;CalcTask 、LcdPrintTask xTaskCreate(CalcTask, "task1", 128, NULL, osPriorityNormal, NULL);xTaskCreate(LcdPrintTask, "task2", 128, &g_Task2Info, osPriorityNorm…

详解Element-UI el-table表格中勾选checkbox(selection)多选删除

本节讲解的是关于组件库中el-table组件多选删除功能的实现。 1.Vue文件内的引用 2.页面数据 3.存储多选数据 4. 处理多选数据 这里通过循环的方式找到数据并对数据删除&#xff0c;这种方式易于理解&#xff0c;但不一定是最优方案

springboot的自动配置和怎么做自动配置

目录 一、Condition 1、Condition的具体实现 2、Condition小结 &#xff08;1&#xff09;自定义条件 &#xff08;2&#xff09;SpringBoot 提供的常用条件注解 二、Enable注解 三、EnableAutoConfiguration 注解和自动配置 1、EnableAutoConfiguration的三个注解属性…

LLama 3 跨各种 GPU 类型的基准测试

2024 年 4 月 18 日&#xff0c;AI 社区对 Llama 3 70B 的发布表示欢迎&#xff0c;这是一款最先进的大型语言模型 &#xff08;LLM&#xff09;。该型号是 Llama 系列的下一代产品&#xff0c;支持广泛的用例。该模型 istelf 在广泛的行业平台上表现良好&#xff0c;并提供了新…

Eclipse的使用配置教程:必要设置、创建工程及可能遇到的问题(很详细,很全面,能解决90%的问题)

Eclipse的使用配置&#xff1a; Ⅰ、Eclipse 的必要配置&#xff1a;1、Eclipse 的安装&#xff1a;其一、将 Eclipse 解压或安装到没有中文且没有空格的路径下。其二、拿到 eclipse.exe 文件&#xff0c;傻瓜式安装即可; 2、设置工作空间(workspace)&#xff1a;其一、首次启动…

源头分析: 网络安全的分布式方法

部署网络可见性和网络检测和响应 (NDR) 解决方案来收集、查看和分析网络活动&#xff0c;以检测网络上的可疑和恶意活动。 这些解决方案中的大多数都是为了将数据从收集点 (或传感器) 移动到中央存储库进行分析而构建的。 这种方法有几个缺点&#xff0c;包括规模、性能、成本…

乌龟对对碰在线版

爆肝两天使用vue开发了一个在线版的乌龟对对碰小游戏之幸运对对碰。没有找到合适的乌龟素材&#xff0c;现在使用小兔子代替。 体验地址&#xff1a;幸运对对碰 | 乌龟对对碰小游戏 之前的python版本的乌龟对对碰&#xff1a;写文章-CSDN博客 乌龟对对碰-幸运对对碰

无需测试环境!如何利用测试脚手架隔离微服务,实现功能自动化

以下为作者观点&#xff1a; 想在不建立完整测试环境的情况下测试微服务&#xff1f; 想在将变更推送到主线分支之前完成测试&#xff1f; 这是我们在进行项目交付时经常遇到的难题。最近&#xff0c;当我们开始一个新的项目&#xff0c;为客户构建一个新的聚合平台时&#…