Apache&Tomcat集群
2010年五一晚上做的測試采用的軟件:
1) apache_
2) apache-tomcat-
3) mod_jk
還有什么JDK了,操作系統(tǒng)了廢話沒用的就不提了。
1) 理論環(huán)節(jié)
先說下為什么要用Apache,用Apache的目的是為了做負(fù)載均衡。啥是個(gè)負(fù)載均衡?簡單點(diǎn)說就是把請求你服務(wù)的數(shù)量分配開了,別讓我一個(gè)人(是一個(gè)WEB服務(wù)器)來處理,大家一起來幫我處理,所以就產(chǎn)生了這么個(gè)名詞,也由此就誕生了一種分配結(jié)構(gòu)。畫個(gè)圖看看:
WEB服務(wù)器 WEB服務(wù)器A WEB服務(wù)器B WEB服務(wù)器C
前面一個(gè)領(lǐng)導(dǎo)后面一堆干活的,這個(gè)整體的事情叫負(fù)載均衡,前面的那個(gè)領(lǐng)導(dǎo)就是Apache大蝦,此蝦就是分配任務(wù)的頭,有很多大蝦都可以當(dāng)此領(lǐng)導(dǎo),Apache,nginx等等,Tomcat其實(shí)也可以的。用的最多是Apache,最厲害的是nginx,其實(shí)有它不均衡也可以了,哥們單挑支持3萬并發(fā)連接,正好是Apache的10倍,據(jù)說新浪、網(wǎng)易、 騰訊都用它,可想而知。我還沒驗(yàn)證過,大家沒事telnet下三個(gè)大網(wǎng)站看看是不是。Tomcat用在這有點(diǎn)笨,分配任務(wù)的時(shí)候據(jù)說沒原則,領(lǐng)導(dǎo)的領(lǐng)導(dǎo)們不好控制他所以用的人少。
2) Apache操作
現(xiàn)在開始來實(shí)現(xiàn)負(fù)載均衡的操作:
i. 先裝apache_
選這版本是因?yàn)橛玫娜硕?,網(wǎng)上資料把我決定了(版本很重要,待會(huì)兒告訴你為什么),畢竟學(xué)別人的東西。
ii. 配置
a) 在http.conf最后加一句:include conf/mod_jk.conf
b) 創(chuàng)建mod_jk.conf,并添加內(nèi)容
以下是我配置的原樣:()
LoadModule jk_module modules/mod_jk.so #加載mod_jk Module
JkWorkersFile conf/workers.properties #指定 workers.properties文件路徑
JkMount /* controller #對所有的請求進(jìn)行分流
c) 創(chuàng)建workers.properties文件,并添加內(nèi)容
以下內(nèi)容是我配置的原樣本:按此段第二條的的配置位置創(chuàng)建
worker.list = controller,tomcat1,tomcat2 #server 列表
#========tomcat1========
worker.tomcat1.port=8888 #ajp13 端口號,在tomcat下server.xml配置,默認(rèn)8009
worker.tomcat1.host=localhost #tomcat的主機(jī)地址,如不為本機(jī),請?zhí)顚?/span>ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加權(quán)比重,值越高,分得的請求越多
#========tomcat2========
worker.tomcat2.port=9999 #ajp13 端口號,在tomcat下server.xml配置,默認(rèn)8009
worker.tomcat2.host=localhost #tomcat的主機(jī)地址,如不為本機(jī),請?zhí)顚?/span>ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加權(quán)比重,值越高,分得的請求越多
#========controller,負(fù)載均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分擔(dān)請求的tomcat
worker.controller.sticky_session=1
d) mod_jk.so文件
這個(gè)文件就是本段第一句在http.conf中首先設(shè)置的內(nèi)容。到Apache那下載, 它是The Apache Tomcat Connector,就是Tomcat和別的服務(wù)器連接的插件,這類插件有很多種,有連IIS、Sun、apache,netscape等。其實(shí)下載的不叫mod_jk.so叫mod_jk-apache-
把這個(gè)文件放置到此段第二條的的配置的位置
iii. 補(bǔ)充闡述
現(xiàn)在說下版本的問題,最關(guān)鍵的是什么版本的mod_jk能支持你采用的Apache,且又和你選的Tomcat配套。因?yàn)槲抑苯酉铝藗€(gè)最新的Tomcat5.529的,Tomcat Connector 提供的是mod_jk-1.2.30-httpd-2.2.3.so,實(shí)驗(yàn)的時(shí)候折騰了1個(gè)小時(shí)都沒成功,Apache就是啟動(dòng)不了。換了個(gè)2.0.55的,還是啟動(dòng)不了,最后發(fā)現(xiàn)是一句漢語注釋沒有加“#“,害的我死勁的讀apache的英語模板,學(xué)了半天英語。
還有就是把下載的連接器改名為mod_jk.so。
You should first have mod_jk.so (unix) or mod_jk.dll (Windows) installed in your Apache module directory (see your Apache documentation to locate it)
其實(shí)改不改無所謂,就是王八的屁股,叫‘龜腚’!,造做就好懶的管它為什么。
忘了說那個(gè)workers.properties文件了,那個(gè)文件很好理解,猜猜就可以了猜不錯(cuò)。就是讓領(lǐng)導(dǎo)的領(lǐng)導(dǎo)(說白了就是我或者你)配置領(lǐng)導(dǎo)下面有那些干活的和哪些活由誰來干的,Apache的Quick Start講的很清楚,高級需求時(shí)再看看。
舉例:
JkMount /*.jsp tomcat1 就是說所有請求的是jsp文件的tomcat1搞定。
JkMount /*.do tomcat2 就是說把所有.do請求的交給tomcat2處理。
JkMount /* controller 就是說領(lǐng)導(dǎo)按照一定比例隨機(jī)分配給下面干活的,這個(gè)"controller"就是在workers.propertise里指定的負(fù)載分配控制器。
3) TOMCAT操作
i. 安裝Tomcat
把下載的解壓版本解壓一份,按住ctrl點(diǎn)擊后拖一下,兩份改改名,Ta/Tb
ii. 配置Server.xml
改端口:要啟多個(gè)Tomcat需要改的端口改了再說:
Ta | 端口功能 | Tb |
<Server port="9005" | 關(guān)閉使用端口 | <Server port="8005" |
<CONNECTOR port="9080" | http使用端口 | <CONNECTOR port="8090" |
<CONNECTOR port="8888" | Apache通訊端口 | <CONNECTOR port="9999" |
到此Apache的工作就結(jié)束了,也就是說后臺可以有多個(gè)兄弟們幫你干活了。
1) 理論環(huán)節(jié)
什么是集群,這里的集群主要說的是會(huì)話集群。舉個(gè)例子好比打日本人一樣:中國有兩個(gè)團(tuán)(A團(tuán)和B團(tuán)),小日本部隊(duì)一來,A團(tuán)就知道他們是哪個(gè)部隊(duì)(假如鳩山由紀(jì)夫來了),B團(tuán)也知道他們是哪個(gè)部隊(duì)了,為什么呢?因?yàn)橹醒?/span>(就是Apache)已經(jīng)明確告訴A團(tuán)去處理下,弄死倭寇。A團(tuán)就特別高興,很炫耀的把這個(gè)消息告訴B團(tuán)了,來者是鳩山由紀(jì)夫。
集群說的其實(shí)就是最終這個(gè)功效,大家是一個(gè)集體,來的這個(gè)敵人我清楚你也清楚。很明顯把鳩山由紀(jì)夫來了這個(gè)事情復(fù)制到B團(tuán),也就是復(fù)制了一份Session, 福田康夫來了也一樣他的session也會(huì)被大家一起知道。
個(gè)人感覺叫集群有點(diǎn)不合適,就是Session的同步,假如你程序里用到了Application,不知道是什么情況,有時(shí)間驗(yàn)證下。
2) 技術(shù)環(huán)節(jié)
i. 主要配置server.xml
a) 把<Cluster></Cluster>這個(gè)結(jié)點(diǎn)的注釋去掉。
b) 修改Ta的tcpListenPort="4001" Tb的tcpListenPort="4002"就OK了。
ii. 補(bǔ)充方法
a) 默認(rèn)法
我看了Tomcat的文檔,里面給出了好幾種策略,研究了下,最快最穩(wěn)的就是用默認(rèn),不用去掉<Cluster></Cluster>結(jié)點(diǎn)的注釋,直接新加一句:
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" defaultMode="true" />
b) 細(xì)節(jié)說明
Tomcat的維機(jī)百科說的很多,都是一些疑問性的內(nèi)容,如:在Windos without network 的情況下要設(shè)置mcastBindAddress="127.0.0.1"(默認(rèn)228.0.0.4),linux加上路由route add -host 228.0.0.4 dev eth0 *,重點(diǎn)就是那么幾個(gè)屬性,Tomcat的文檔比我講的還明白。
c) Engine元素
這個(gè)元素的那個(gè)屬性我沒有實(shí)驗(yàn),因?yàn)榫W(wǎng)友們已經(jīng)聲名有問題,以下原文:
在這兩個(gè)Tomcat的以下結(jié)點(diǎn)添加jvmRoute屬性:
<ENGINE name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<ENGINE name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
然而實(shí)際我配置的時(shí)候還不能加jvmRoute屬性,配置了反而有問題。刷新瀏覽器窗口總是在某一個(gè)tomcat控制臺輸出形如 :
SessionID:154678FA6D4D0ABD57658B750E
或者
SessionID:
由控制臺打印的結(jié)果可以看出,SessionID在哪個(gè)tomcat上產(chǎn)生,那么后續(xù)該會(huì)話的請求將總是會(huì)這個(gè)tomcat來處理。并且注意到SessionID的形式比通常情況多了一個(gè)后綴.tomcat1或.tomcat2,還搞不清楚是為什么。
我實(shí)驗(yàn)得出這個(gè)是由session是不是可粘貼而控制的,就是那個(gè)workers.properties文件的:worker.controller.sticky_session=true或者false控制。
以上的集群配置就算完成!
1) 測試工程
某個(gè)工程如果要使用集群必須要在它的Web.xml文件上加上<distributable/>結(jié)點(diǎn)
2) A團(tuán)離線
我測試兩個(gè)Tomcat都配置好了以后,正常集群的情況下,如果一個(gè)離線,另一個(gè)完全正常接管后面的程序處理,Session不會(huì)出問題,其他的訪問什么都沒問題。
離線后重新上線,啟動(dòng)后大約在20秒內(nèi)所有的Session都可以正常同步完成。
3) 其他問題
主要是Tomcat提示的問題:
確定所有節(jié)點(diǎn)擁有相同的時(shí)間, 并且通過網(wǎng)絡(luò)時(shí)間服務(wù)(NTP)同步操作系統(tǒng)的時(shí)間!
你的所有會(huì)話屬性值必須實(shí)現(xiàn)java.io.Serializable,Session
應(yīng)該是已經(jīng)序列化了,要不然怎么復(fù)制的,沒注意過它的源碼,有三種復(fù)制的方法Tomcat Doc說很好,咋這種就是內(nèi)存的COPY。注意
appBase一定要指向webapps,把webapps/ROOT刪除,但動(dòng)態(tài)頁面路徑會(huì)出問題,網(wǎng)絡(luò)上傳說的。
URL從外面看必須是相同的,其實(shí)就是說的兩個(gè)Tomcat的集群工程應(yīng)該是完全一樣的
4) 遇到的問題
使用的端口多了,經(jīng)常出現(xiàn)被占的情況。我配的時(shí)候UUSee經(jīng)常和我搶端口。
解決辦法:netstat –ano
參數(shù)o 是說看的時(shí)候列出進(jìn)程的PID,查到pid后任務(wù)管理器,選擇出PID這個(gè)列,就是知道是什么進(jìn)程了, Kill掉就可以了。
5) jvmRoute名稱
兩個(gè)Tomcat配置文件Host節(jié)點(diǎn)的域名配置必須一樣,server.xml中的jvmRoute名稱必須和worker.properties中的tomcat實(shí)例名稱一致,不然無法實(shí)現(xiàn)session_stricky。
如果不想實(shí)現(xiàn)粘性session, jvmRoute可以不配制。
如果不想實(shí)現(xiàn)session復(fù)制,Cluster配制的注釋就無需去掉
6) 分工問題
worker.loadbalancer.sticky_session=false,true表示會(huì)話具有粘性。意味著用戶和1開始會(huì)話,以后用戶從瀏覽器A發(fā)出的請求只要處于同一個(gè)會(huì)話中,負(fù)載均衡器就會(huì)始終讓1來處理請求。這時(shí)候,集群不會(huì)進(jìn)行會(huì)話復(fù)制。默認(rèn)為false。前者為false,時(shí)候,后者的設(shè)置沒什么影響。如果前者為true,后者也為true時(shí)候,表示始終連接。比如1異常終止,那么,服務(wù)端會(huì)返回500的錯(cuò)誤。False的話,就發(fā)給2了,有可能不存在會(huì)話信息。
7) 網(wǎng)卡問題
集群中的tomcat服務(wù)器之間使用組播的形式來通信。如果tomcta所在的機(jī)器上有多個(gè)網(wǎng)卡,或者配置了虛擬網(wǎng)卡,有可能導(dǎo)致組播失敗,從而復(fù)發(fā)復(fù)制會(huì)話。比如,tomcat1已經(jīng)啟動(dòng),tomcat2出現(xiàn)信息:
No members activein cluster group
一上信息表明,2沒有識別到1,組播失敗。這是,應(yīng)該在cluste的membership的配置中,確保設(shè)置了如下bind屬性,它用于明確地設(shè)置組播綁定地址:
<Membership className="org.apache.catalina.tribes.membership.McastService"
bind="127.0.0.1"
address="228.0.0.4" 。。。。。>
8) 路由問題
出現(xiàn)這個(gè)錯(cuò)誤:Error receiving mcast package (errorCounter=10). Try Recovery!
是路由問題。server.xml加mcastBindAddress="127.0.0.1"。如果加了ROUTE ADD 那么就要去掉這行mcastBindAddress="127.0.0.1"
9) 最后
tcpListenAddress="127.0.0.1" 要是多個(gè)tomcat在不同機(jī)器上就改這里。
大“工”告成 !還沒有寫總結(jié),寫了技術(shù)文檔了。
聯(lián)系客服