集群配置(一):Tomcat集群配置
相關(guān)文檔請參見各個工具相應(yīng)提供的文檔,工具的安裝此處不再介紹,默認(rèn)地,將Apache安裝在$APACHE目錄,并將mod_jk-apache-
2.2.2.so改名為mod_jk.so放在$APACHE/ modules下(注意JK與Apache httpd的版本關(guān)系),兩個Tomcat
的安裝路徑都在$TOMCAT1和$TOMCAT2。
二、負(fù)載均衡
1、基于request的負(fù)載均衡
該 種方式下,負(fù)載均衡器 (load balancer)會根據(jù)各個node的狀況,把每個 http request進行分發(fā)。使用這樣的均衡策略,就必 須在多個節(jié)點之間復(fù)制用戶的session,實時保持整個集群的用 戶狀態(tài)同步,這種操作被稱為session復(fù)制 (session replication)。
該方法的優(yōu)點是客戶不會被綁定都具體的node,只要還有一個node存活,用戶狀態(tài)都不會丟失,cluster都能夠繼續(xù)工作。缺點是隨著節(jié)點的增加,可能會因廣播風(fēng)暴而導(dǎo)致性能大幅度下降
2、 基于session的負(fù)載均衡
該 種方式下,當(dāng)用戶發(fā)出第一個request后,負(fù)載均衡器動態(tài)的把該用戶分配到某個節(jié)點,并記錄該節(jié)點的jvm路由,以后該用戶的所有request 都會被綁定這個jvm路由,用戶只會與該server發(fā)生交互,這種策略被稱為粘性session(session sticky)。該方法的優(yōu)點是響應(yīng) 速度快,多個節(jié)點之間無須通信。缺點也很明顯,某個node死掉以后,它負(fù)責(zé)的所有用戶都會丟失session。
3、Broker負(fù)載均衡
將節(jié)點進行分片,每個分片組成一個對外的服務(wù)整體,在片內(nèi)使用基于request的負(fù)載均衡,而在片外使用基于session的負(fù)載均衡,使用這種處理將 使地Session復(fù)制的廣播保持為一個常量,不因為節(jié)點增加而導(dǎo)致性能下降,同時又保持高可靠性,不因為某個節(jié)點的崩潰而導(dǎo)致所有的Session數(shù)據(jù) 的丟失
這里將著重介紹第一和第二種負(fù)載均衡的配置
三、基于session的負(fù)載均衡
1)Apache配置,在$APACHE/conf/httpd.conf中增加如下配置:
2)在$APACHE/conf/中創(chuàng)建workers.properties,內(nèi)容如下,關(guān)于Worker的詳細(xì)配置,請參見Jarkarta-Tomcat的Connector文檔
在上面中,loadbalancer是一個虛擬Worker,并不代表任何節(jié)點,僅用于管理其他的Worker(注意其type為lb)
3)兩個Tomcat的配置
根據(jù)上面的workers.properties配置修改$TOMCAT/conf/server.xml的端口配置,并修改
< Engine name="Catalina" defaultHost="localhost">為<Engine name= "Catalina" defaultHost="localhost" jvmRoute="server1/2">
啟動Tomcat、Apache,到功告成
四、基于request的負(fù)載均衡
在如上配置的基礎(chǔ)上增加如下配置:
1)workers.properties的worker.loadbalancer.sticky_session值改為0
2)server.xml中的Cluster配置注釋去掉(注意端口,如果在同臺機上進行負(fù)載均衡,注意端口不要沖突)
3)在應(yīng)用的web.xml中增加<distributable/>
2.創(chuàng)建User類和hbm文件
3.Hibernate配置文件(hibernate.cfg.xml)
4.TreeCache配置(treecache.xml,與hibernate.cfg.xml),更詳細(xì)配置請參見JBoss TreeCache文檔
5. 例子代碼:通過其輸出的SQL代碼來看工作的正常情況
進程1:隔一段時間修改密碼
進程2:隔一段時間讀取密碼
二、負(fù)載均衡
1、基于request的負(fù)載均衡
該 種方式下,負(fù)載均衡器 (load balancer)會根據(jù)各個node的狀況,把每個 http request進行分發(fā)。使用這樣的均衡策略,就必 須在多個節(jié)點之間復(fù)制用戶的session,實時保持整個集群的用 戶狀態(tài)同步,這種操作被稱為session復(fù)制 (session replication)。
該方法的優(yōu)點是客戶不會被綁定都具體的node,只要還有一個node存活,用戶狀態(tài)都不會丟失,cluster都能夠繼續(xù)工作。缺點是隨著節(jié)點的增加,可能會因廣播風(fēng)暴而導(dǎo)致性能大幅度下降
2、 基于session的負(fù)載均衡
該 種方式下,當(dāng)用戶發(fā)出第一個request后,負(fù)載均衡器動態(tài)的把該用戶分配到某個節(jié)點,并記錄該節(jié)點的jvm路由,以后該用戶的所有request 都會被綁定這個jvm路由,用戶只會與該server發(fā)生交互,這種策略被稱為粘性session(session sticky)。該方法的優(yōu)點是響應(yīng) 速度快,多個節(jié)點之間無須通信。缺點也很明顯,某個node死掉以后,它負(fù)責(zé)的所有用戶都會丟失session。
3、Broker負(fù)載均衡
將節(jié)點進行分片,每個分片組成一個對外的服務(wù)整體,在片內(nèi)使用基于request的負(fù)載均衡,而在片外使用基于session的負(fù)載均衡,使用這種處理將 使地Session復(fù)制的廣播保持為一個常量,不因為節(jié)點增加而導(dǎo)致性能下降,同時又保持高可靠性,不因為某個節(jié)點的崩潰而導(dǎo)致所有的Session數(shù)據(jù) 的丟失
這里將著重介紹第一和第二種負(fù)載均衡的配置
三、基于session的負(fù)載均衡
1)Apache配置,在$APACHE/conf/httpd.conf中增加如下配置:
|
2)在$APACHE/conf/中創(chuàng)建workers.properties,內(nèi)容如下,關(guān)于Worker的詳細(xì)配置,請參見Jarkarta-Tomcat的Connector文檔
|
在上面中,loadbalancer是一個虛擬Worker,并不代表任何節(jié)點,僅用于管理其他的Worker(注意其type為lb)
3)兩個Tomcat的配置
根據(jù)上面的workers.properties配置修改$TOMCAT/conf/server.xml的端口配置,并修改
< Engine name="Catalina" defaultHost="localhost">為<Engine name= "Catalina" defaultHost="localhost" jvmRoute="server1/2">
啟動Tomcat、Apache,到功告成
四、基于request的負(fù)載均衡
在如上配置的基礎(chǔ)上增加如下配置:
1)workers.properties的worker.loadbalancer.sticky_session值改為0
2)server.xml中的Cluster配置注釋去掉(注意端口,如果在同臺機上進行負(fù)載均衡,注意端口不要沖突)
3)在應(yīng)用的web.xml中增加<distributable/>
2006-7-26
WebWork+FreeMarker與JSF比較 WebWork
是一種傳統(tǒng)的MVC框架,其簡單而又不失強大,架構(gòu)非常靈活、擴展性強,完成最核心的功能也僅通過實現(xiàn)Action接口,而擴展的功能基本上可以通過其攔
截器結(jié)構(gòu)完成,另外,從WebWork2開始與ServletAPI的解耦也使其具備比較強的可測試性。然而其缺點也是非常地明顯,一方面其用戶群比較
少,缺少足夠文檔,另一方面,由于其開發(fā)團隊與Struts團隊合并以WebWork為核心開發(fā)新的MVC框架Struts Ti ,
WebWork2.2已經(jīng)是其最終版本,缺乏后續(xù)版本的支持,而StrutsTi前途也還是個未知數(shù)。 JSF是JCP出品Sun力推的標(biāo) 準(zhǔn),雖然出現(xiàn)較遲但可以說是來勢洶洶,大有想要一統(tǒng)MVC的架勢。JSF的優(yōu)點在于其標(biāo)準(zhǔn),附帶而來的好處是豐富的JSF組件可供選擇,其另一個賣點是拖 拽式的界面開發(fā)模式。然而,其JSF本身架構(gòu)的復(fù)雜性足以讓人望而生畏,一方面,JSF組件的使用一旦出現(xiàn)問題非常難以調(diào)試,而其出錯信息往往沒有多少有 價值的東西,另一方面,一旦標(biāo)準(zhǔn)組件不能滿足需求需要獨立開發(fā)的話,難度非常高。 下面將對這兩種技術(shù)進行比較: 一、控制層: 1.耦合度 1)與ServletAPI的耦合 兩者都可以完全與ServletAPI的解耦,在開發(fā)時也都應(yīng)該盡量避免與ServletAPI的耦合 2)與框架API的耦合 WebWork:所有的控制類必須實現(xiàn)Action接口 JSF:FacesBean不需要繼承任何JSF接口。但有時需要與界面元素(譬如列表框)產(chǎn)生耦合,開發(fā)時應(yīng)該盡量將該部分隔離 評價:這兩種技術(shù)都是低耦合的,不相上下 2.IOC能力 WebWork本身提供了部分的IOC能力,但功能比較弱,已不被推薦。兩者都可以通過與Spring的結(jié)合獲 得IOC的能力,相對而言,JSF更簡單而且提供更多的功能。 評價:不相上下,JSF稍微勝出 3.AOP能力 WebWork:其攔截器功能本身就是一種AOP方式 JSF:可以通過與Spring的結(jié)合獲得AOP能力 評價:WebWork的AOP能力與WebWork的核心結(jié)合地更緊密,WebWork稍微勝出 4.配置 WebWork的配置本身不夠簡潔,而與Spring的結(jié)合更是出現(xiàn)重復(fù)的配置情況,相比而言,JSF更簡潔 評價:JSF勝出 5.可測試性 WebWork:WebWork本身的簡潔和靈活使其具備非常高的可測試性,可以脫離容器測試其控制層的行為 JSF:不清楚,似乎不能脫離容器獨立測試配置 評價:似乎是WebWork勝出 二、表現(xiàn)層: 1.組件化 FreeMarker:可以通過FreeMarker的宏能力將一些常用的組件,開發(fā)比較簡單,但同時,自己開發(fā)組件時間和質(zhì)量上可能無法保障 JSF:JSF本身就是為組件而生,由于其標(biāo)準(zhǔn)化,有豐富的組件可以使用,在項目的前期投入少,不需要專門開發(fā)組件 評價:隨著項目的開展,組件化的優(yōu)勢應(yīng)該會越來越明顯。在這點上,JSF壓倒性勝出 2.可調(diào)試性 FreeMarker:FreeMarker本身的出錯定位能力非常強,往往出錯信息非常直觀,但一旦進行組件包裝,可調(diào)試性將大打折扣 JSF:JSF的組件本身比較復(fù)雜,調(diào)試性差,往往很難根據(jù)出錯信息定位出錯情況,更多的時候需要依靠經(jīng)驗來解決 評價:FreeMarker稍勝出 3.擴展 FreeMarker:FreeMarker的宏功能非常簡單,功能擴展非常方便,但不足之處在于其邏輯表達能力比較差 JSF:JSF的組件的復(fù)雜性導(dǎo)致擴展新的功能是一個不小的代價,但Java語言強大的表達能力也使其能開發(fā)出復(fù)雜的功能 評價:FreeMarker稍勝出 4.表現(xiàn)邏輯能力 FreeMarker+WebWork:在WebWork的最新版本中提供了Ajax的客戶端驗證能力,但仍然比較原始 JSF:JSF有些客戶端驗證組件,但總的來說,仍然需要加強 評價:都比較差 5.Ajax FreeMarker+WebWork:WebWork在最新版本中提供了Ajax支持,但包裝暫時還是比較原始 JSF:有各種具備Ajax特性的界面組件存在,同時可使用AjaxAnywhere提供更好的用戶體驗 評價:JSF稍勝出 從如上的比較可以看出,WebWork+FreeMarker和JSF可以說各有勝場,我的看法是,WebWork+FreeMarker具有更平緩的學(xué) 習(xí)曲線,使用比較簡單,在應(yīng)付小項目和小團隊上,略勝一籌;而面向大項目和大團隊,JSF的組件化在項目的進展中將發(fā)揮更大的作用。 除此之外,JSF的拖拽式的界面開發(fā)也是一個賣點,但我的看法是,對于一個熟手來說,其帶來的效率上的提高是微乎其微的,此外,一個提供這種功能的IDE,以下兩個問題是應(yīng)該考慮的: 1)對第三方JSF組件的支持 2)自動化生成的代碼的維護 |
2006-7-24
在Hibernate3使用TreeCache
|
2.創(chuàng)建User類和hbm文件
|
|
3.Hibernate配置文件(hibernate.cfg.xml)
|
4.TreeCache配置(treecache.xml,與hibernate.cfg.xml),更詳細(xì)配置請參見JBoss TreeCache文檔
|
5. 例子代碼:通過其輸出的SQL代碼來看工作的正常情況
進程1:隔一段時間修改密碼
|
進程2:隔一段時間讀取密碼
以下內(nèi)容為程序代碼: package ayufox.hibernate.jbosscache; import java.text.SimpleDateFormat; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class Test2 { private final static SimpleDateFormat FORMAT = new SimpleDateFormat( "HH:mm:ss"[img]/images/wink.gif[/img]; public static void main(String[] args) throws Exception { SessionFactory factory = new Configuration().configure() .buildSessionFactory(); while (true) { Session session = factory.openSession(); User u = (User) session.load(User.class, "ayufox0"[img]/images/wink.gif[/img]; System.out.println("date:" + FORMAT.format(new Date(new Long(u.getPassword())))); u = null; session.close(); Thread.sleep(5000); } } } 2006-7-21
2006-7-17
2006-7-14
一、在開始了解HS VM之前,先了解一些垃圾回收的基礎(chǔ)理論。 1.垃圾檢測: 任何虛擬機的回收算法都包括兩個步驟:檢測垃圾和回收垃圾。當(dāng)一個對象被創(chuàng)建時,其是活動的對象,此時其是可用的,而在運行過程中,該對象的引用不再被使 用,這時該對象就成為垃圾,一般采用兩種方式來區(qū)別活動對象和垃圾對象:引用計數(shù)和跟蹤。當(dāng)一個對象被其它對象引用時,其引用計數(shù)加1,當(dāng)不再被其它對象 引用時,計數(shù)減1,當(dāng)其引用計數(shù)為0時,該對象就成為垃圾,引用計數(shù)的缺點是無法檢測循環(huán)引用和維護引用計數(shù)的代價,在現(xiàn)代虛擬機中一般不采用該方式。而 跟蹤指的是虛擬機追蹤從根對象出發(fā)的有向?qū)ο髨D,如果一個對象不能被追蹤到,則該對象為垃圾,采用追蹤算法的垃圾回收器也叫標(biāo)記并回收回收器。 2.避免堆碎片: 在進行垃圾回收之后,由于內(nèi)存分配時,垃圾對象和活動對象可能相鄰存在,則可能會在堆中出現(xiàn)堆碎片,采用標(biāo)記并回收回收器的虛擬機一般采用兩種方法來對付 堆碎片:壓縮和拷貝。壓縮回收是指當(dāng)進行垃圾回收之后,將剩下的活動對象推向堆的另一端,則當(dāng)垃圾回收完畢之后在另一端形成連續(xù)的堆??截惢厥罩傅氖潜3? 兩個同樣大小的堆,在對一個隊進行垃圾回收過程中,對于檢測出來的活動對象拷貝到另一個堆并連續(xù)存放。參見下圖 ![]() 3.分代回收 拷貝回收的一個缺點在于有些對象是長期存在的,但在回收過程中仍然必須將這些對象多次拷貝,分代回收指的是,對不同年齡(在內(nèi)存存在的時間的長短)將對象 放入不同的代堆中,并對不同的代堆采用不同的回收算法。事實上,大部分的對象屬于“短命”對象,我們可以更多地對年輕的代堆進行垃圾回收,而對于年老的代 堆則減少回收頻度。 二、接下來我們介紹HS VM的一些垃圾回收調(diào)優(yōu)。 1.順序垃圾回收器 JDK5.0 的VM支持四種垃圾回收器,默認(rèn)的,HS VM采用順序垃圾回收器,順序垃圾回收器是一種single-threaded, stop-the- world回收器,即單線程,非并行(運行時,阻塞其他操作)的回收器。當(dāng)虛擬機初始化時,一個JVM所需的最大的內(nèi)存區(qū)地址空間被保留,但并沒有馬上分 配內(nèi)存而是需要時才分配(見下Virtual)。內(nèi)存空間分為三個區(qū)域:年輕代區(qū)(Young)、年老代區(qū)(Tenured)和永久區(qū)(Perm)。其分 布見下圖 ![]() 年輕區(qū)分為三個區(qū),一個Eden區(qū)和兩個Survivor區(qū)(拷貝回收),當(dāng)對象創(chuàng)建時,放入Eden區(qū),而總有一個Survivor區(qū)是空的,隨著每一 次的垃圾回收,從Eden區(qū)和非空Survivor區(qū)的存活對象放入空survior區(qū),當(dāng)一個對象經(jīng)過多次回收仍然存在,則將其轉(zhuǎn)入年老區(qū)。而永久區(qū)用 于保存一些永久對象,譬如一個類的描述和方法,常量等等。 以下是一些設(shè)置參數(shù)例子(下面例子的值都是Solaris Operating Environment SPARC Platform Edition使用的默認(rèn)值): 堆空間設(shè)置: -XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=70 -Xms3670k -Xmx64m 第一個表示當(dāng)空閑空間在代空間中比例低于40%時,將調(diào)整代空間將以使得空閑空間達到或者超過40%;第二個表示當(dāng)空閑空間在代空間中比例高于70%時, 將調(diào)整代空間以使得空閑空間不超過70%;第三個表示虛擬機初始化時將至少分配3670K內(nèi)存空間;第四個表示虛擬機最大使用的內(nèi)存空間不超過64M。 HSVM的建議是:一般來說,對于大型應(yīng)用,-Xmx64m是比較小的,應(yīng)根據(jù)內(nèi)存情況將其調(diào)整到盡量大的一個值。 代空間設(shè)置: -XX:NewRatio=2 -XX:NewSize=2228k -XX:MaxNewSize=unlimited(默認(rèn)是不限制的,如果需設(shè)置,在該處填相應(yīng)的值) -XX:SurvivorRatio=32 第一個表示Young空間和Tenured空間的比例是1比2;第二個和第三個分別表示Young空間的最小和最大的邊界;第四個表示Eden和 Surivor空間的比例,譬如32,則表示Survivor空間占Young空間的1/34,當(dāng)Survivor空間太小時,當(dāng)Survivor空間填 滿,則將剩余的部分填到Tenured空間,而當(dāng)Survivor空間太大,則可能導(dǎo)致空閑空間太多,浪費內(nèi)存,可能通過-XX:+ PrintTenuringDistribution輸出Young空間的對象在各個區(qū)的情況。HSVM的建議是:盡量給Young空間足夠多的空間,除 非你認(rèn)為花在收集Tenured的時間過多,然而當(dāng)Young空間超過堆空間的一半時,結(jié)果可能會適得其反,當(dāng)增加處理器時,相應(yīng)地增加Young空間的 大小,因為內(nèi)存的分配可以并行進行。 2.其他垃圾回收器 HS VM其他的垃圾回收器包括:吞吐量回收器、并行回收器和漸進回收器(火車算法)。 吞吐量回收器對Young空間采用并行回收的策略,而Tenured空間則采用與順序回收器相同的策略,特點是吞吐量大(吞吐量是(工作時間—垃圾回收時 間)/工作時間),使用-XX:+UseParallelGC參數(shù)啟用吞 吐量回收器,當(dāng)系統(tǒng)擁有多個處理器時可使用該參數(shù),并可通過指定參數(shù)-XX: ParallelGCThreads=<desired number>來設(shè)置回收線程數(shù)。 并行回收器對 Tenured空間采用并行回收的方式,特點是因回收垃圾而暫停的時間較小,使用-XX:+UseConcMarkSweepGC參數(shù)起用并行回收器,如 果與-XX:+UseParNewGC相結(jié)合,則Young空間也采用并行回收的方式,當(dāng)你可以從垃圾回收時間較小中得到好處時,可使用該參數(shù),譬如人機 交互用戶對反應(yīng)時間比較敏感時可使用。 漸進回收器對Tenured空間采用漸進回收方式,即每一次回收并不對整個空間進行垃圾回收,而只 回收一部分,同樣的,其特點是回收垃圾而暫停的時間較小,然而,如果考慮到總的吞吐量,其回收速度比較Tenured空間默認(rèn)回收器還慢,使用- Xincgc參數(shù)啟用漸進回收器,當(dāng)系統(tǒng)負(fù)載不重可以經(jīng)常做垃圾回收時,使用該參數(shù)比較合適。 無論如何,系統(tǒng)調(diào)優(yōu)都是一件艱難的工作,如上列出來的只是一個簡單的介紹和一些常用的配置,而具體的情況則需要在系統(tǒng)開發(fā)中根據(jù)相應(yīng)的情況再做相應(yīng)的調(diào)整,以獲得令人滿意的系統(tǒng)的性能 參考:《深入Java虛擬機》 ![]() 2006-7-7
|