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