2017 11-02 tomcat 应用

作者: 楠人帮 | 来源:发表于2017-11-07 21:18 被阅读30次

    一.实现nginx与tomcat的反向代理负载均衡的应用

    实验原理图: 搜狗截图20171106231142.png

    实验环境准备:一个客户端主机,一个调度器(反向代理服务器),两个tomcat后端服务器
    实验步骤:
    1.两个后端服务器Yum安装 tomcat tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
    并yum install java-1.8.0-openjdk-devel.x86_64
    在代理服务器上安装httpd和nginx
    2.在后端服务器上创建目录
    mkdir -pv /usr/share/tomcat/webapps/myapp/WEB-INF
    编辑 index.jsp vim -pv /usr/share/tomcat/webapps/myapp/index.jsp

          <%@ page language="java" %>
      2  <html>
      3   <head><title>TomcatA</title></head>
      4   <body>
      5     <h1><font color="red">TomcatA.magedu.com</font></h1>
      6     <table align="centre" border="1">
      7          <tr>
      8                 <td>Session ID</td>
      9                 <% session.setAttribute("magedu.com","magedu.com"); %>
     10                 <td><%= session.getId() %></td>
     11                 </tr>
     12                 <tr>
     13                          <td>Created on</td>
     14                         <td><%= session.getCreationTime() %></td>
     15                  </tr>
     16                  </table>
     17                </body>
     18         </html>
    

    在另一主机上做相同操作,只需要将"red"改为blue做区分即可
    在网页上测试: 172.18.254.242/myapp和172.18.254.31/myapp


    搜狗截图20171106220419.png
    搜狗截图20171107143334.png

    可以看出不同的效果,证明编辑成功
    3.设置nginx服务器
    vim /etc/nginx/nginx.conf

    upstream tcsrvs {
         server 192.168.136.134:8080;
         server 192.168.136.170:8080;
    }
            location / {
             proxy_pass http://tcsrvs;
    }
    

    配置好后重启nginx服务
    在网页客户端进行测试 172.18.25.62/myapp
    通过结果显示代理成功


    搜狗截图20171106221356.png

    (4)在虚拟机客户端使用curl命令来显示是否均衡调度

    for i in {1..10};do curl -s 172.18.25.62/myapp/index.jsp |grep -i tomcat ;done
      <head><title>TomcatA</title></head>
        <h1><font color="blue">TomcatA.magedu.com</font></h1>
      <head><title>TomcatA</title></head>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
      <head><title>TomcatA</title></head>
        <h1><font color="blue">TomcatA.magedu.com</font></h1>
      <head><title>TomcatA</title></head>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
      <head><title>TomcatA</title></head>
        <h1><font color="blue">TomcatA.magedu.com</font></h1>
      <head><title>TomcatA</title></head>
        <h1><font color="blue">TomcatA.magedu.com</font></h1>
      <head><title>TomcatA</title></head>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
      <head><title>TomcatA</title></head>
        <h1><font color="blue">TomcatA.magedu.com</font></h1>
      <head><title>TomcatA</title></head>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
      <head><title>TomcatA</title></head>
        <h1><font color="blue">TomcatA.magedu.com</font></h1>
    

    显示结果为均衡调度
    (5)使用httpd来实现调度
    关掉nginx服务器,打开httpd
    vim /etc/httpd/conf.d/host-tomcat.conf

    <proxy balancer://tcsvrs>
        BalancerMember http://172.18.254.242:8080
        BalancerMember http://172.18.254.31:8080
        ProxySet lbmethod=byrequests——相当于轮询调度算法,如果后端tomcat服务器有权重会按权重来进行调度
     </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>
    
    

    经过测试,httpd代理也成功
    (6)扩展,实现权重的调度
    BalancerMember http://172.18.254.242:8080 loadfactor=1
    BalancerMember http://172.18.254.31:8080 loadfactor=3
    在客户端测试,实现3:1的调度
    (7)健康性检查
    将tomcat后端服务器关闭一个,再到客户端进行测试结果不会再往故障的tomcat服务器上进行调度
    或者在host-tomcat.conf上
    BalancerMember http://172.18.254.242:8080 status=D
    BalancerMember http://172.18.254.31:8080
    这样就将242主机关闭,此时只会往31的服务器上进行调度
    也可以设置为
    BalancerMember http://172.18.254.242:8080 status=H 设置为备用,只有当31主机不可用时,该主机才会上线进行工作
    BalancerMember http://172.18.254.31:8080
    (7)使用ajp协议来调度
    BalancerMember ajp://172.18.254.242:8009
    BalancerMember ajp://172.18.254.31:8009
    实现相同的调度,只需要将端口和协议名称改变即可
    (8)启用内键管理器
    <Location /balancer-manager>
    SetHandler balancer-manager——启用内键的管理器
    ProxyPass !——不会往后端调度而是自己进行管理
    Require all granted——在实际应用中不可以这样授权,应该设置管理登录来实现
    </Location>
    </VirtualHost>

    二.session回话保持的实现

    三种保持方法:
    (1)session sticky
    source_ip
    nginx: ip_hash
    haproxy: source
    lvs: sh
    cookie:
    nginx:hash
    haproxy: cookie
    (2) session cluster:delta session manager
    (3) session server:redis(store), memcached(cache)

    1.首先实现session sticky绑定的实现

    在nginx或是apache服务器上进行设置
    vim /etc/httpd/conf.d/http.tomcat.conf

    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED——加入的请求的报文首部
                                       <proxy balancer://tcsrvs>
                                            BalancerMember http://172.18.254.242:8080  loadfactor=1 route=tcA——一定要加这个标识符,否则无法实现绑定的目的
                                            BalancerMember http://172.18.254.31:8080   loadfactor=1 route=tcB——同上
                                            ProxySet lbmethod=byrequests
                                            ProxySet stickysession=ROUTEID——新加入的内容,routeid进行会话绑定
                                          </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>
    

    在后端tomcat服务器上vim /etc/tomcat/server.xml
    在此加入jvmRoute="tcA" <Engine name="Catalina" defaultHost="localhost" jvmRoute="tcA">
    同理在另一个后端服务器上做相同操作
    配置完成后在网页上进行测试查看效果
    显示结果是只要第一次选中了一个后端tomcat服务器,那么只要是同一个客户端发来的相同的请求就会往同一地址调度

    2实现session cluster服务

    步骤:此时在调度服务器上只需要将header和 ProxySet stickysession=ROUTEID注释掉即可
    在tomcat服务器上
    vim /etc/tomcat/server.xml

     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
    132                  channelSendOptions="8">
    133 
    134           <Manager className="org.apache.catalina.ha.session.DeltaManager"
    135                    expireSessionsOnShutdown="false"
    136                    notifyListenersOnReplication="true"/>
    137 
    138           <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    139             <Membership className="org.apache.catalina.tribes.membership.McastService"
    140                         address="228.0.25.62"——手动设置一个新的多播地址
    141                         port="45564"
    142                         frequency="500"
    143                         dropTime="3000"/>
    144             <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
    145                       address="172.18.254.242"——设置为tomcat的服务器的ip地址
    146                       port="4000"
    147                       autoBind="100"
    148                       selectorTimeout="5000"
    149                       maxThreads="6"/>
    150 
    151             <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
    152               <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    153             </Sender>
    154             <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    155          <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
    156           </Channel>
    157 
    158           <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
    159                  filter=""/>
    160           <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
                     <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
    163                     tempDir="/tmp/war-temp/"
    164                     deployDir="/tmp/war-deploy/"
    165                     watchDir="/tmp/war-listen/"
    166                     watchEnabled="false"/>
    167 
    168           <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>——注意在官方文档上没有后面的“/”符号,在设置时一定要加上,否则无法启动tomcat
    169           <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>——同上
    170         </Cluster>
    

    在另一个服务器上做相同操作,只需要将ip地址改为172.18.254.31即可
    其次要设置 cp /etc/tomcat/web/xml /usr/share/tomcat/webapps/myapp/下
    然后vim web.xml加入 <distributable/>实现集群会话
    另一个主机同上操作
    最后在网页上进行测试
    结果是,进行多次访问时,虽然调度到不同的主机上,但是sessionID不发生变化


    搜狗截图20171107122743.png
    搜狗截图20171107122916.png

    如图所示,sessionID未发生改变
    注意细节:要同步各主机的时间,否则会影响实验结果
    用nginx 和ajp协议访问结果相同

    三.session server的实现
    session server得实现方法:
    (1)memcached
    (2)redis
    (3)couchbase
    首先实现基于memcached的方法来实现
    1.memcached的介绍
    memcached是高性能、分布式的内存对象缓存系统
    缓存服务器特点:
    缓存:cache,无持久存储功能;
    bypass缓存,依赖于客户端的智能;
    k/v cache,仅支持存储可流式化数据;
    k/v cache:仅可存储可序列化数据;存储项:k/v;
    智能性一半依赖于客户端(调用memcached的API开发程序),一半依赖于服务端;
    分布式缓存:互不通信的分布式集群;
    分布式系统请求路由方法:取模法,一致性哈希算法;
    算法复杂度:O(1)
    清理过期缓存项:
    缓存耗尽:LRU
    缓存项过期:惰性清理机制
    2.memcached的下载安装
    yum install memcache


    搜狗截图20171107171412.png

    下载成功后直接开启服务systemctl start memcached
    ss -ntlu 监听端口为11211
    3.协议格式:memcached协议
    支持 文本格式和二进制格式,如果没有文本格式就yum install libmemcached来支持二进制的格式
    vim /usr/share/doc/memcached-1.4.15/protocol.txt来查看memcached使用的文档协议


    搜狗截图20171107172113.png
    使用telnet命令来演示
    搜狗截图20171107173250.png
    搜狗截图20171107173747.png
    4.memcached程序的常用选项:
            -m <num>:Use <num> MB memory max to use for object storage; the default is 64 megabytes.
                -c <num>:Use <num> max simultaneous connections; the default is 1024.
                -u <username>:以指定的用户身份来运行进程;
                -l <ip_addr>:监听的IP地址,默认为本机所有地址;
                -p <num>:监听的TCP端口, the default is port 11211.
                -U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.
                -M:内存耗尽时,不执行LRU清理缓存,而是拒绝存入新的缓存项,直到有多余的空间可用时为止;
                -f <factor>:增长因子;默认是1.25;
                -t <threads>:启动的用于响应用户请求的线程数;
                
            memcached默认没有认证机制,可借用于SASL进行认证;
                SASL:Simple Authentication Secure Layer
                
            API:
                php-pecl-memcache
                php-pecl-memcached
                python-memcached
                libmemcached
                libmemcached-devel
    

    5.启动memcached后,实现session server的配置
    (1)在实际应用中,tomcat无法直接将缓存存放到memcached中,需要借助第三方的工具来实现,因此我们需要进入www.github.com

    搜狗截图20171107174901.png
    搜狗截图20171107175051.png
    搜狗截图20171107175132.png
    搜狗截图20171107175726.png
    搜狗截图20171107175827.png

    (2)了解过后开始进行配置
    在虚拟机上vim /etc/tomcat/server.xml

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tcA">
    <Context  path="/myapp"  docBase="/usr/share/tomcat/webapps/myapp" reloadable="true"  >
      
      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="172.18.2544.242:11211,n2:172.18.254.31:11211"
        failoverNodes="n1"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
        />
    </Context>
    

    复制该文件到172.18.254.31 另一个jvmRoute="tcB"
    (3)mkdir kryo
    下载相关文件


    搜狗截图20171107210707.png

    另一台主机也下载相同配置文件
    重启服务后,在客户端测试查看结果


    搜狗截图20171107213022.png 搜狗截图20171107213044.png

    相关文章

      网友评论

        本文标题:2017 11-02 tomcat 应用

        本文链接:https://www.haomeiwen.com/subject/djsrmxtx.html