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
配置文件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
评论
发表评论