Linux Tomcat Cluster


    当一台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 &quot;%r&quot; %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 &quot;%r&quot; %s %b" />
                        </Context>
                  </Host>

        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>

                    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>

                    <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>

                    <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中;
 


                    <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/>这一指令才可以;
        

          注:根据马哥视频做的学习笔记,如有错误,欢迎指正;侵删;
 

原文地址:https://www.cnblogs.com/guowei-Linux/p/11072858.html