当一台Tomcat服务器没法承载现有的访问量时,咱们可使用集群来提高其承载量;
Tomcat Cluster的架构通常为:前端使用负载均衡(nginx、haproxy),将请求调度到后端的多个Tomcat服务器上,可是通常Tomcat不会直接面对前端,而是在两者之间再放置一个httpd服务,使用apache接收调度到自己的请求,而后再将请求发送至Tomcat上进行处理;由于使用了负载均衡,因此咱们必然须要进行会话保持,让来自同一客户端的请求始终发至同一个Tomcat服务器;
会话保持:
session sticky:会话绑定,若是服务器宕机,数据会丢失;
source ip:源地址绑定
cookie
session cluster:会话集群,当一台服务器宕机之后还可使用其余服务器中的session继续提供服务,只要有服务器在线session数据就不会丢失;可是不适合大规模使用,由于session cluster比较耗费资源;
session server:session服务器
memcached:key-value存储形式,会将缓存数据存储在内存中,因此速度会很是快,可是数据宕机即没;
Tomcat负载均衡方式:
nginx+tomcat
apache+tomcat
Tomcat Cluster负载均衡方式:
session server+tomcat
拓扑结构:
一台Centos7做为负载均衡器,两台Centos6做为Tomcat服务器
配置过程:
1.安装JDK以及Tomcat在上一篇博客中已经演示过了,在此再也不赘述;
https://blog.csdn.net/qq_32501535/article/details/88947938
2.添加一个实验用的页面;
cd /usr/local/tomcat
vim conf/server.xml
Centos6_1:
<Engine name="Catalina" defaultHost="www.guowei.com">
<Host name="www.guowei.com" appBase="/data/webapps/" autoDeploy="true">
<Context path="" docBase="ROOT">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="guowei_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
</Host>
Centos6_2:
<Engine name="Catalina" defaultHost="mail.guowei.com">
<Host name="mail.guowei.com" appBase="/data/webapps/" autoDeploy="true">
<Context path="" docBase="ROOT">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="guowei_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
</Host>html
3.检测配置文件是否有语法错误
catalina.sh configtest
4.启动tomcat
catalina.sh start
5.制做一个测试页;
vim /data/webapps/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title> JSP Test Page</title>
</head>
<body>
<% out.println("Hello World! on www/mail"); %>
</body>
</html>前端
6.访问http://www.guowei.com或http://mail.guowei.com(前提:在hosts中已添加对应解析条目)
Note:两台Centos6做相同配置;
7.在Centos7中安装Nginx;
yum install nginx -y
8.使用nginx实现负载均衡功能
vim /etc/nginx/nginx.conf
upstream tomservers {
server www.guowei.com:8080;
server mail.guowei.com:8080;
}
location ~* \.(jsp|do) {
proxy_pass http://tomservers;
}
9.测试:
访问http://192.168.80.139/index.jsp便可查看负载均衡效果;
10.源地址绑定:(功能展现,能够不配置)
vim /etc/nginx/nginx.conf
upstream tomservers {
ip_hash;
server www.guowei.com:8080;
server mail.guowei.com:8080;
}
11.使用apache实现负载均衡
使用apache实现负载均衡须要加载特定balance模块,才能够实现负载均衡;
httpd -M ==> proxy_balancer_module (shared)
指令介绍:
ProxyPass [path] !|url [key=value key=value]:将后端服务器某URL与当前服务器的某虚拟主机路径关联起来做为提供服务的路径;path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径;使用此指令时必须将ProxyRequests的值设置为Off;须要注意的是若是path以”/”结尾,则对应的url也必须以”/”结尾,反之亦然;
ProxyRequests {On|Off}:是否开启apache的正向代理功能;启用此项时为了代理http协议必须启用mod_proxy_http模块;
ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via;主要用于在多级代理中代理请求的流向,默认为Off,及即不启用此功能,On表示每一个请求和响应报文均添加Via,Full表示每一个Via行都会添加当前apache服务的版本信息;Block表示每一个代理请求报文中的Via都会被移除;
ProxyPreserveHost {On|Off}:若是启用此功能,表明会将用户请求报文中的Host行发送给后端的服务器,而再也不使用ProxyPass指定的服务地址;若是想在反向代理中支持虚拟主机,则须要开启此项,不然无需开启此功能;
Centos6_1|2:
vim /data/webapps/ROOT/index.jsp
<%@ page language="java" %>
<html>
<head><title>mail</title></head>
<body>
<h1><font color="red|blue">www|mail.guowei.com</font></h1>
<table align="centre" corder="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("guowei.com","guowei.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>java
vim /etc/tomcat/server.xml
<Engine name="Catalina" defaultHost="www|mail.guowei.com" jvmRoute="www|mail">
Note:由于两台Centos6的配置大体相同,因此只列出一方的配置,其中不一样的内容我使用”|”分开了,配置时留意一下!
Centos7:(基于http|ajp方式)
vim /etc/httpd/conf.d/vhosts.conf
<proxy balancer://lbcluster1>
BalancerMember ajp|http://192.168.80.131:8009|8080 loadfactor=10 route=www
BalancerMember ajp|http://192.168.80.134:8009|8080 loadfactor=10 route=mail
</proxy>mysql
<VirtualHost *:80>
serverName web.guowei.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
访问http://192.168.80.139/index.jsp
12.设置apache的stickysession功能:
Centos7:
vim /etc/httpd/conf.d/vhosts.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
BalancerMember http://192.168.80.131:8080 loadfactor=10 route=www
BalancerMember http://192.168.80.134:8080 loadfactor=10 route=mail
ProxySet stickysession=ROUTEID
</proxy>nginx
<VirtualHost *:80>
serverName web.guowei.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
<Location /balancer> 设置查看balancer状态列表
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>
访问http://192.168.80.139/index.jsp进行测试,连续刷新会发现session id不会发生改变了,说明成功了;
13.实现Tomcat的Session Cluster
会话管理器:能够定义在Host中或者Context中;
标准会话管理器(StandardManager):
<Manager className=”org.apacha.catalina.session.StandardManager” maxInactiveInterval=”7200” />
会话信息默认保存在$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/中的SESSION.ser文件中;周期性保存;
指令:
maxActiveSession:最多容许的活动会话数量,默认为-1,表示不限制;
maxInactiveInterva:非活动的会话超时时长,默认为60s;
pathname:会话文件的保存目录;
持久会话管理器(PersistenManager):
将会话数据保存至持久存储(好比单独的mysql服务器)中,而且能在服务器之外终止后从新启动时从新加载这些会话信息;持久会话管理器支持将会话保存至文件存储(FileStore)或JDBC存储(JDBCStore)中;可是这种会话管理器不是共享的,也就是能够将本身的会话信息保存至指定存储中,可是也只能从存储中加载本身以前导入的,没法加载别人的session信息;
例子:
<Manager className=”org.apache.catalina.session.PersistenManager” saveOnRestart=”true”>
<Store classesName=”org.apache.catalina.session.FileStoore” directory=”/data/tomcat-sessions”/>
</Manager>
Note:每一个用户的会话会被保存至directory指定的目录中的文件中,文件名为<session id>.session;并经过后台线程每隔一段时间(checkInterval参数定义,默认为60秒)检查一次超时会话;
<Manager className=”org.apache.catalina.session.PersistenManager” saveOnRestart=”true”>
<Store classesName=”org.apache.catalina.session.JDBCStore” directory=”com.mysql.jdbc.Driver” connectionURL=”jdbc:mysql://localhost:3306/mydb?user=USER_NAME;password=PASSWORD”/>
</Manager>
DeltaManager:将多个Tomcat节点构建成一个经过组播信道进行通讯的集群,从而实现session共享;每一个节点都会监听在某一端口,用来接收其余节点发来的session信息;能够配置在Engine、Host、或Context中;
web
<Cluster>:定义Cluster;
<Manager>:定义Cluster使用的会话管理器;
<Channel>:定义节点间通讯所使用的信道;
<Menbership>:定义Cluster中的集群成员;
<Receiver>:定义成员节点接收其余节点信息的方式;
<Sender>:定义成员节点传递给其余节点信息的方式;
详细信息请阅读官方资料:https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html
Note:若是某个webapp要支持会话管理器,至进行上面的配置还不够,还要在其对应的web.xml中添加<distribitable/>这一指令才能够;
sql
注:根据马哥视频作的学习笔记,若有错误,欢迎指正;侵删;
apache