2017 11-02 tomcat 應用

一.實現(xiàn)nginx與tomcat的反向代理負載均衡的應用

實驗原理圖:
搜狗截圖20171106231142.png

實驗環(huán)境準備:一個客戶端主機,一個調(diào)度器(反向代理服務器)刮便,兩個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.在后端服務器上創(chuàng)建目錄
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做區(qū)分即可
在網(wǎng)頁上測試: 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服務
在網(wǎng)頁客戶端進行測試 172.18.25.62/myapp
通過結(jié)果顯示代理成功


搜狗截圖20171106221356.png

(4)在虛擬機客戶端使用curl命令來顯示是否均衡調(diào)度

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>

顯示結(jié)果為均衡調(diào)度
(5)使用httpd來實現(xiàn)調(diào)度
關掉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——相當于輪詢調(diào)度算法氢架,如果后端tomcat服務器有權(quán)重會按權(quán)重來進行調(diào)度
 </Proxy>

                                <VirtualHost *:80>
                                        ServerName www.magedu.com
                                        ProxyVia On
                                        ProxyRequests Off——關閉正向代理
                                        ProxyPreserveHost On
                                        <Proxy *>
                                                Require all granted——授權(quán)
                                        </Proxy>
                                        ProxyPass / balancer://tcsrvs/——代理服務器地址
                                        ProxyPassReverse / balancer://tcsrvs/
                                        <Location />
                                                Require all granted ——授權(quán)
                                        </Location>
                                </VirtualHost>

經(jīng)過測試碌尔,httpd代理也成功
(6)擴展浇辜,實現(xiàn)權(quán)重的調(diào)度
BalancerMember http://172.18.254.242:8080 loadfactor=1
BalancerMember http://172.18.254.31:8080 loadfactor=3
在客戶端測試,實現(xiàn)3:1的調(diào)度
(7)健康性檢查
將tomcat后端服務器關閉一個唾戚,再到客戶端進行測試結(jié)果不會再往故障的tomcat服務器上進行調(diào)度
或者在host-tomcat.conf上
BalancerMember http://172.18.254.242:8080 status=D
BalancerMember http://172.18.254.31:8080
這樣就將242主機關閉柳洋,此時只會往31的服務器上進行調(diào)度
也可以設置為
BalancerMember http://172.18.254.242:8080 status=H 設置為備用,只有當31主機不可用時叹坦,該主機才會上線進行工作
BalancerMember http://172.18.254.31:8080
(7)使用ajp協(xié)議來調(diào)度
BalancerMember ajp://172.18.254.242:8009
BalancerMember ajp://172.18.254.31:8009
實現(xiàn)相同的調(diào)度熊镣,只需要將端口和協(xié)議名稱改變即可
(8)啟用內(nèi)鍵管理器
<Location /balancer-manager>
SetHandler balancer-manager——啟用內(nèi)鍵的管理器
ProxyPass !——不會往后端調(diào)度而是自己進行管理
Require all granted——在實際應用中不可以這樣授權(quán),應該設置管理登錄來實現(xiàn)
</Location>
</VirtualHost>

二.session回話保持的實現(xiàn)

三種保持方法:
(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.首先實現(xiàn)session sticky綁定的實現(xiàn)

在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——一定要加這個標識符募书,否則無法實現(xiàn)綁定的目的
                                        BalancerMember http://172.18.254.31:8080   loadfactor=1 route=tcB——同上
                                        ProxySet lbmethod=byrequests
                                        ProxySet stickysession=ROUTEID——新加入的內(nèi)容绪囱,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">
同理在另一個后端服務器上做相同操作
配置完成后在網(wǎng)頁上進行測試查看效果
顯示結(jié)果是只要第一次選中了一個后端tomcat服務器,那么只要是同一個客戶端發(fā)來的相同的請求就會往同一地址調(diào)度

2實現(xiàn)session cluster服務

步驟:此時在調(diào)度服務器上只需要將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/>實現(xiàn)集群會話
另一個主機同上操作
最后在網(wǎng)頁上進行測試
結(jié)果是道盏,進行多次訪問時而柑,雖然調(diào)度到不同的主機上,但是sessionID不發(fā)生變化


搜狗截圖20171107122743.png

搜狗截圖20171107122916.png

如圖所示荷逞,sessionID未發(fā)生改變
注意細節(jié):要同步各主機的時間媒咳,否則會影響實驗結(jié)果
用nginx 和ajp協(xié)議訪問結(jié)果相同

三.session server的實現(xiàn)
session server得實現(xiàn)方法:
(1)memcached
(2)redis
(3)couchbase
首先實現(xiàn)基于memcached的方法來實現(xiàn)
1.memcached的介紹
memcached是高性能、分布式的內(nèi)存對象緩存系統(tǒng)
緩存服務器特點:
緩存:cache种远,無持久存儲功能涩澡;
bypass緩存,依賴于客戶端的智能坠敷;
k/v cache妙同,僅支持存儲可流式化數(shù)據(jù)射富;
k/v cache:僅可存儲可序列化數(shù)據(jù);存儲項:k/v粥帚;
智能性一半依賴于客戶端(調(diào)用memcached的API開發(fā)程序)胰耗,一半依賴于服務端;
分布式緩存:互不通信的分布式集群芒涡;
分布式系統(tǒng)請求路由方法:取模法柴灯,一致性哈希算法;
算法復雜度:O(1)
清理過期緩存項:
緩存耗盡:LRU
緩存項過期:惰性清理機制
2.memcached的下載安裝
yum install memcache


搜狗截圖20171107171412.png

下載成功后直接開啟服務systemctl start memcached
ss -ntlu 監(jiān)聽端口為11211
3.協(xié)議格式:memcached協(xié)議
支持 文本格式和二進制格式费尽,如果沒有文本格式就yum install libmemcached來支持二進制的格式
vim /usr/share/doc/memcached-1.4.15/protocol.txt來查看memcached使用的文檔協(xié)議


搜狗截圖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>:監(jiān)聽的IP地址,默認為本機所有地址旱幼;
            -p <num>:監(jiān)聽的TCP端口查描, the default is port 11211.
            -U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.
            -M:內(nèi)存耗盡時,不執(zhí)行LRU清理緩存柏卤,而是拒絕存入新的緩存項冬三,直到有多余的空間可用時為止;
            -f <factor>:增長因子闷旧;默認是1.25长豁;
            -t <threads>:啟動的用于響應用戶請求的線程數(shù);
            
        memcached默認沒有認證機制忙灼,可借用于SASL進行認證;
            SASL:Simple Authentication Secure Layer
            
        API:
            php-pecl-memcache
            php-pecl-memcached
            python-memcached
            libmemcached
            libmemcached-devel

5.啟動memcached后钝侠,實現(xiàn)session server的配置
(1)在實際應用中该园,tomcat無法直接將緩存存放到memcached中泽艘,需要借助第三方的工具來實現(xiàn)澎迎,因此我們需要進入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

另一臺主機也下載相同配置文件
重啟服務后直撤,在客戶端測試查看結(jié)果


搜狗截圖20171107213022.png
搜狗截圖20171107213044.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冕象,一起剝皮案震驚了整個濱河市子库,隨后出現(xiàn)的幾起案子揍异,更是在濱河造成了極大的恐慌现拒,老刑警劉巖蔓腐,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叮阅,死亡現(xiàn)場離奇詭異刁品,居然都是意外死亡,警方通過查閱死者的電腦和手機浩姥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門挑随,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勒叠,你說我怎么就攤上這事兜挨「嗝希” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵拌汇,是天一觀的道長柒桑。 經(jīng)常有香客問我,道長噪舀,這世上最難降的妖魔是什么幕垦? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮傅联,結(jié)果婚禮上先改,老公的妹妹穿的比我還像新娘。我一直安慰自己蒸走,他們只是感情好仇奶,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著比驻,像睡著了一般该溯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上别惦,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天狈茉,我揣著相機與錄音,去河邊找鬼掸掸。 笑死氯庆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的扰付。 我是一名探鬼主播堤撵,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羽莺!你這毒婦竟也來了实昨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤盐固,失蹤者是張志新(化名)和其女友劉穎荒给,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刁卜,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡志电,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了长酗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溪北。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出之拨,到底是詐尸還是另有隱情茉继,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布蚀乔,位于F島的核電站烁竭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吉挣。R本人自食惡果不足惜派撕,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睬魂。 院中可真熱鬧终吼,春花似錦、人聲如沸氯哮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喉钢。三九已至姆打,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肠虽,已是汗流浹背幔戏。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留税课,地道東北人闲延。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像伯复,于是被迫代替她去往敵國和親慨代。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容