2017 11-02 tomcat 應用

一.實現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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容