实验1:Tomcat安装
[root@localhost ~]#cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]#uname -r
3.10.0-862.el7.x86_64
使用系统自带的jdk
yum install -y java-1.8.0-openjdk-devel
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr
安装Tomcat
yum install tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp tomcat -y
systemctl start tomcat
tcp/8005,8009,8080都已打开,tomcat已启动
提供一测试类应用
cd /var/lib/tomcat/webapps/
mkdir ./test/{classes,lib,META-INF,WEB-INF} -pv
cd test/
vim index.jsp
<%@ page language="java" %>
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="green">TomcatB.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
通过浏览器访问
实验2:配置nginx反代负载均衡tomcat
按照实验1搭建好两台tomcat主机
配置nginx
yum install nginx -y
vim /etc/nginx/nginx.conf
upstream tomcatsrvs{
server 192.168.91.139:8080;
server 192.168.91.137:8080;
}
server {
server_name www.magedu.com;
location / {
proxy_pass http://tomcatserver;
}
}
实验3:配置httpd反代负载均衡tomcat
yum install -y httpd
vim /etc/httpd/conf.d/httpd_tomcat.conf
<proxy balancer://tomcatserver> 定义后端服务器组,名为tomcatserver
balancermember http://192.168.91.139:8080
balancermember http://192.168.91.137:8080 如果与后端服务器使用ajp协议连接,把http改为ajp
proxyset lbmethod=byrequests 相当于轮询(rr)
</proxy>
<virtualhost *:80>
servername www.magedu.com
proxyrequests off
proxypreservehost on
proxyvia on
<proxy *>
require all granted
</proxy>
proxypass / balancer://tomcatserver/
proxypassreverse / balancer://tomcatserver/
<location />
require all granted
</location>
</virtualhost>
balancermember有后端检查功能,也可定义权重调度算法等等;参考文档:
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
httpd反代相关设置:
http集群调度算法:
byrequests:轮询(默认)
bybusyness:加权轮询
bytraffic:基于流量调度
定义后端调度主机状态status:
D:相当于down不接受请求
I:强行设置为健康
H:热备,相当于backup
E:错误
N:不接受新请求
实验4:httpd实现session sticky
vim /etc/httpd/conf.d/httpd_tomcat.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://tomcatserver>
balancermember http://192.168.91.139:8080 route=TomcatA
balancermember http://192.168.91.137:8080 route=TomcatB
proxyset lbmethod=byrequests
proxyset stickysession=ROUTEID
</proxy>
<virtualhost *:80>
servername www.magedu.com
proxyrequests off
proxypreservehost on
proxyvia on
<proxy *>
require all granted
</proxy>
proxypass / balancer://tomcatserver/
proxypassreverse / balancer://tomcatserver/
<location />
require all granted
</location>
</virtualhost>
发现不论怎么刷新都只会调度都固定的一台后端服务器,并且Session ID不会改变
实验5:Nginx实现session sticky
vim /etc/nginx/nginx.conf
upstream tomcatserver {
server 192.168.91.139:8080;
server 192.168.91.137:8080;
hash $request_uri consistent;
}
实验6:httpd, tomcat cluster实现session sticky
官方文档:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
vim /etc/tomcat/server.xml
在server.xml中的Engine或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.4" ##多播地址
port="45564" ##多播地址监听的端口,同一个集群必须相同
frequency="500" ##每隔0.5s发送一次心跳检测
dropTime="3000"/> ##3s没收到心跳检测表明对方down
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" ##不建议用auto,更改为本机提供服务的IP
port="4000"
autoBind="100" ##自动绑定事件
selectorTimeout="5000"
maxThreads="6"/> ##集群内部最大线程,表明集群中最多有7台主机
<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.JvmRouteSessionIDBinderListener"/> ##官方文档这里有错误,少了结尾的/
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> ####官方文档这里有错误,少了结尾的/
</Cluster>
在对应的站点目录下,创建WEB-INF/web.xml文件,因为是测试所以直接复制全局的web.xml
cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/
vim /var/lib/tomcat/webapps/test/WEB-INF/web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<distributable/> ##添加这一段代码,注意,不要放到注释内部,开头和结尾
systemctl restart tomcat
在httpd主机上
vim /etc/httpd/conf.d/vhost.conf
<proxy balancer://tcsrvs>
BalancerMember http://192.168.91.139:8080
BalancerMember http://192.168.91.137:8080
</Proxy>
<VirtualHost *:80>
ServerName www.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<proxy *>
require all granted
</proxy>
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<location />
require all granted
</location>
</VirtualHost>
测试
发现轮询调度到两台服务器上,但是Session ID保持不变
实验6:使用memcache作为tomcat的session server
简述
memcach是 高性能、分布式的内存对象缓存系统,memcache缓存时键和值都在内存中存储,所以访问速度很快,memcache缓存时要依赖于客户端的智能,缓存的过程是客户端先去访问后端的tomcat服务器,然后再请求memcache将访问的数据缓存下来,下次再访问时就直接会访问memcache中的缓存,这一点与varnish不同,varnish是客户端直接去访问varnish缓存服务器,如果缓存上面没有,varnish会替客户端到后端服务器上去寻找,然后缓存下来,所以memcache就被称为旁挂式缓存,强依赖于客户端的智能
特性
缓存:cache,无持久存储功能,因为存储于内存当中断电就会丢失;
bypass缓存,依赖于客户端的智能;
k/v cache,仅支持存储可流式化数据,也就是发送数据之前打碎,然后到接收端再重组的过程称为可流式化。
安装和配置
yum install memcached
监听的端口:11211/tcp, 11211/udp
memcached -h —可以查看程序命令常用选项
命令:
统计类:stats, stats items, stats slabs, stats sizes
存储类:set, add, replace, append在后面插入值, prepend在前面插入值
命令格式:
<command name> <key> <flags标志位> <exptime> <bytes>
<cas unique>
检索类:get, delete, incr/decr自增和减
清空:flush_all
要想将会话保存至后端memcache中,并且每个memcache都保存相同的会话,需要一个管理项目memcached-session-manager
项目地址:https://github.com/magro/memcached-session-manager
下载如下jar文件至各tomcat的/usr/share/tomcat/lib/目录中,其中的
v
e
r
s
i
o
n
要
换
成
你
所
需
要
的
版
本
号
,
t
c
{version}要换成你所需要的版本号,tc
version要换成你所需要的版本号,tc{6,7,8}要换成与tomcat版本相同的版本号。
asm-6.0.jar
minlog-1.3.1.jar
kryo-4.0.1.jar
msm-kryo-serializer-2.1.1.jar
kryo-serializers-0.42.jar
objenesis-2.6.jar
memcached-session-manager-2.1.1.jar
reflectasm-1.11.3.jar
memcached-session-manager-tc7-2.1.1.jar
spymemcached-2.11.1.jar
vim /etc/tomcat/context.xml
<Context>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.91.139:11211,n2:192.168.91.137:11211"
lockingMode="auto"
sticky="false"
sessionBackupAsync="false"
sessionBackupTimeout= "1000"
copyCollectionsForSerialization="true"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
yum install -y memcached
systemctl start tomcat memcached
实现前端httpd反代
<proxy balancer://tomcatserver> 定义后端服务器组,名为tomcatserver
balancermember http://192.168.91.139:8080
balancermember http://192.168.91.137:8080 如果与后端服务器使用ajp协议连接,把http改为ajp
proxyset lbmethod=byrequests 相当于轮询(rr)
</proxy>
<virtualhost *:80>
servername www.magedu.com
proxyrequests off
proxypreservehost on
proxyvia on
<proxy *>
require all granted
</proxy>
proxypass / balancer://tomcatserver/
proxypassreverse / balancer://tomcatserver/
<location />
require all granted
</location>
</virtualhost>
systemctl start httpd
测试
请求轮询调度到后台服务器上,Session ID始终不变