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

相關文章
相關標籤/搜索