Linux初学者学习笔记

20171107 Tomcat(二)

2017-11-09  本文已影响8人  哈喽别样
  • 会话保持
  • Tomcat Cluster
  • Tomcat实现会话粘滞
  • Tomcat实现会话集群
  • Tomcat实现会话服务器

一、会话保持

三种实现方式:

二、Tomcat Cluster:Tomcat 集群

httpd或nginx作为调度器,三种实现方式:

(一)nginx作为调度器

(1)配置tomcat cluster
ntpdate 172.18.0.1

// 分别将两台主机命名为node1.hellopeiyang.com和node2.hellopeiyang.com
hostnamectl set-hostname node1.hellopeiyang.com
hostnamectl set-hostname node2.hellopeiyang.com

yum install java-1.8.0-openjdk-devel tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps
systemctl start tomcat
mkdir -pv /usr/share/tomcat/webapps/myapp/WEB-INF

vim /usr/share/tomcat/webapps/myapp/index.jsp
// node1主机上的内容
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
        <h1><font color="red">TomcatA.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>
// node2主机上的内容
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
        <h1><font color="blue">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>

分别测试node1和node2的tomcat服务,成功运行

(2)配置nginx调度器
ntpdate 172.18.0.1
yum install nginx
systemctl start nginx
hostnamectl set-hostname www.hellopeiyang.com

vim /etc/nginx/nginx.conf
upstream tcsrvs {
        server 192.168.136.130:8080;
        server 192.168.136.131:8080;
}

server {
        listen  80 default_server;
        server_name www.hellopeiyang.com;
        root /usr/share/nginx/html;
        location / {
                proxy_pass http://tcsrvs;
        }
}

nginx -t
nginx -s reload

登录nginx服务器的文本服务,成功调度

(二)httpd作为调度器,通过http协议

ntpdate 172.18.0.1
yum install httpd

vim /etc/httpd/conf.d/httpd-tomcat.conf
<proxy balancer://tcsrvs>
        BalancerMember http://192.168.136.130:8080
        BalancerMember http://192.168.136.131:8080
        ProxySet lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
        ServerName www.hellopeiyang.com
        ProxyVia On
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
        ProxyPass / balancer://tcsrvs/
        ProxyPassReverse / balancer://tcsrvs/
        <Location />
                Require all granted
        </Location>
</VirtualHost>

systemctl start httpd

测试成功进行调度

(三)httpd作为调度器,通过ajp协议

mv /etc/httpd/conf.d/httpd-tomcat.conf /etc/httpd/conf.d/httpd-tomcat.conf.bak

vim /etc/httpd/conf.d/ajp-tomcat.conf
<proxy balancer://tcsrvs>
        BalancerMember ajp://192.168.136.130:8009 loadfactor=2
        BalancerMember ajp://192.168.136.131:8009 loadfactor=1
        ProxySet lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
        ServerName www.hellopeiyang.com
        ProxyVia On
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
        ProxyPass / balancer://tcsrvs/
        ProxyPassReverse / balancer://tcsrvs/
        <Location />
                Require all granted
        </Location>
</VirtualHost>

httpd -t
systemctl restart httpd

测试成功按照权重进行调度

当后端服务器出现故障不能提供服务时,调度器具备健康状态检查功能;
当将后端node2服务器的tomcat服务关闭时,自动全部调度至node1

(四)启用httpd的调度器管理接口

vim /etc/httpd/conf.d/ajp-tomcat.conf    // 添加以下几行内容
<Location /balancer-manager>
      SetHandler balancer-manager
      ProxyPass !
      Require all granted     // 演示用,实际工作要具体设置权限,并设置账号认证
</Location> 

systemctl restart httpd

三、Tomcat实现会话粘滞(session sticky)

vim /etc/httpd/conf.d/ajp-tomcat.conf 
// 添加自定义cookie属性ROUTEID
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e;path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://tcsrvs>
// 给cookie的ROUTEID赋值,下一条语句作用相似
        BalancerMember ajp://192.168.136.130:8009 loadfactor=2 route=TomcatA
        BalancerMember ajp://192.168.136.131:8009 loadfactor=1 route=TomcatB
        ProxySet lbmethod=byrequests
// 设置以ROUTEID作为会话粘滞的依据
        ProxySet stickysession=ROUTEID     // 设置以ROUTEID作为会话粘滞的依据
</Proxy>

<VirtualHost *:80>
        ServerName www.hellopeiyang.com
        ProxyVia On
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
        ProxyPass / balancer://tcsrvs/
        ProxyPassReverse / balancer://tcsrvs/
        <Location />
                Require all granted
        </Location>
</VirtualHost>
<Location /balancer-manager>
        SetHandler balancer-manager
        ProxyPass !
        Require all granted
</Location>

httpd -t
systemctl reload httpd

在浏览器上测试成功,从客户端的第二次请求开始,请求报文都包含有cookie信息,内容中存在设置的ROUTEID

四、Tomcat实现会话集群(session cluster)

// 配置启用集群,将下列配置放置于<engine>或<host>中
vim /etc/tomcat/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.58.5.8"           // 多播地址必须相同
                port="45564"
                frequency="500"
                dropTime="3000"/>
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                address="192.168.136.132"      // 填入每台服务器的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.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>

// 确保Engine的jvmRoute属性配置正确
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">     //每个服务器的jvmRoute值不同

// 配置webapps
vim /usr/share/tomcat/webapps/myapp/WEB-INF/web.xml
<distributable/>     // 在web-app标签下添加

// 重启tomcat服务
systemctl restart tomcat

调度器可以使用nginx, httpd调度,在浏览器测试,成功进行了session cluster

从测试结果看出:尽管调度器分别调度至后台的两台tomcat服务器,但是两台服务器提供服务的session id相同,证明通过集群实现了会话保持

五、Tomcat实现会话服务器(session server)

(一)memcached:高性能、分布式的内存对象缓存系统

(1)特性:
(2)安装配置:
(3)命令:
(4)memcached程序的常用选项:

(二)实现memcached缓存下的session server

(1)实现环境:

使用memcached-session-manager作为会话管理器,需要下载相应的jar包
项目地址:https://github.com/magro/memcached-session-manager

(2)实现过程:
cp memcached-session-manager-${version}.jar /usr/share/java/tomcat/
cp memcached-session-manager-tc${6,7,8}-${version}.jar /usr/share/java/tomcat/
cp spymemcached-${version}.jar /usr/share/java/tomcat/
cp msm-kryo-serializer-${version}.jar  /usr/share/java/tomcat/
cp kryo-serializers-${0.34+}.jar /usr/share/java/tomcat/
cp kryo-${3.x}.jar /usr/share/java/tomcat/ 
cp minlog.${version}.jar /usr/share/java/tomcat/
cp reflectasm.${version}.jar /usr/share/java/tomcat/
cp asm-${5.x}.jar /usr/share/java/tomcat/
cp objenesis-${2.x}.jar /usr/share/java/tomcat/
vim /etc/tomcat/server.xml
<Context path="/myapp" docBase="/usr/share/tomcat/webapps/myapp" reloadable="true">
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.136.131:11211,n2:192.168.136.132:11211"
        failoverNodes="n2"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
        />
</Context>
systemctl start memcached
systemctl start tomcat

在浏览器中测试,可以确定session ID在负载均衡环境中保持不变

上一篇 下一篇

猜你喜欢

热点阅读