Terrocotta - 基于JVM的Java應(yīng)用集群解決方案_第1頁
Terrocotta - 基于JVM的Java應(yīng)用集群解決方案_第2頁
Terrocotta - 基于JVM的Java應(yīng)用集群解決方案_第3頁
Terrocotta - 基于JVM的Java應(yīng)用集群解決方案_第4頁
Terrocotta - 基于JVM的Java應(yīng)用集群解決方案_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、置頂Terrocotta - 基于JVM的Java應(yīng)用集群解決方案 分類: Terracotta Java 集群 2009-08-22 04:31 2638人閱讀 評論(5) 收藏 舉報 前言越來越多的企業(yè)關(guān)鍵應(yīng)用都必須采用集群技術(shù),實現(xiàn)負載均衡(Load Balancing)、容錯(Fault Tolerance)和災(zāi)難恢復(fù)(Failover)。以達到系統(tǒng)可用性(High Availability)和可伸縮性(Scalability)的要求。關(guān)于J2EE集群技術(shù)的基本原理和常用實現(xiàn)方式,TheServerS有一篇經(jīng)典的文章:

2、/tt/articles/article.tss?l=J2EEClusteringCSDN上,陶建風(fēng)先生在他的博客中也作了翻譯:/ESoftWind/archive/2006/10/19/.aspx這篇文章雖然發(fā)表于2005年,但它對集群技術(shù)的概念、原理和實現(xiàn)的基本描述至今依然適用。剛剛接觸集群技術(shù)的朋友不妨閱讀一下這篇文章,以便掌握集群技術(shù)的基本知識。我寫這篇文章是想介紹一個新的Java集群技術(shù),Terracotta。它采用了與眾不同的手段,解決了傳統(tǒng)集群技術(shù)面臨的一些關(guān)鍵問題??梢哉f為Java集群技術(shù)的實現(xiàn)吹來了一股新鮮的空氣。Terracotta(h

3、ttp://)是一個開源的框架。他的創(chuàng)始人Ari Zilka原本是W的首席架構(gòu)師。他于2003年成立Terracotta公司,并且將產(chǎn)品開源。該產(chǎn)品在2006年左右趨于成熟,在很多財富500強企業(yè)獲得成功應(yīng)用。2009年Terracotta在該年度的JavaOne會議中獲得Duke獎,并由Java創(chuàng)始人James Gosling先生親自把該獎頒發(fā)給了Ari Zilka先生。本文著重介紹Terracotta技術(shù)的基本原理,尤其是它與其它集群技術(shù)的根本區(qū)別之處。然后會用一個簡單的例子說明Terracotta的基本使用方式。在以后的文章里,我會陸續(xù)詳細介

4、紹Terrocotta的不同應(yīng)用場景和技巧?;驹鞹erracotta最大的特點是它使用Java二進制代碼增強的方式(binary code injection)截獲集群節(jié)點對數(shù)據(jù)的修改和獲取的請求,利用單獨的Terracotta服務(wù)器調(diào)配數(shù)據(jù)的流向,以達到最高的網(wǎng)絡(luò)效率。這兩點可以說是與傳統(tǒng)集群技術(shù)采用的序列化和網(wǎng)絡(luò)廣播機制在實現(xiàn)思路上的根本不同。另外從開發(fā)人員角度來說,Teraccotta隱藏在Java API之后,開發(fā)人員不需要學(xué)習(xí)新的API。只需要使用標(biāo)準(zhǔn)的JDK數(shù)據(jù)結(jié)構(gòu)(java.util.*, java.concurent.*等)、內(nèi)置Java協(xié)同、加鎖機制(synchroniz

5、ed, object.wait, object.notify等)開發(fā)代碼,在Terracotta平臺之上就可以把單機基于POJO的應(yīng)用擴展到多機集群上。因此開發(fā)人員的學(xué)習(xí)曲線很短。Terracotta集群方案由兩部分組成:Terracotta驅(qū)動器和Terracotta服務(wù)器:其中驅(qū)動器部分(也稱為Terracotta客戶端)與應(yīng)用程序執(zhí)行在相同的JVM中。實際上應(yīng)用程序是由Terracotta驅(qū)動器載入到內(nèi)存中的。載入的同時,會對Java二進制代碼進行增強。用戶提供Terracotta配置文件指定本地程序中哪些數(shù)據(jù)需要在集群中共享。這樣Terracotta就可以通過增強的代碼截獲對這些共享數(shù)

6、據(jù)的讀寫請求,并且與Terracotta服務(wù)器協(xié)作,實現(xiàn)共享數(shù)據(jù)在集群中的一致性。對于Java代碼中使用的“鎖”也是利用相同的機制實現(xiàn)全局協(xié)同;Terracotta服務(wù)器則首先記錄所有節(jié)點對共享數(shù)據(jù)和鎖的訪問信息,為讀取數(shù)據(jù)的節(jié)點提供最新數(shù)據(jù),把修改的數(shù)據(jù)通知給正在使用中這些數(shù)據(jù)的節(jié)點等等。服務(wù)器除了協(xié)調(diào)節(jié)點間數(shù)據(jù)的獲取和變化通知以外,還利用其本地內(nèi)存和硬盤實現(xiàn)共享數(shù)據(jù)的緩存和持久化。由于Terracotta驅(qū)動器和服務(wù)器都有緩存數(shù)據(jù)的能力,有時我們也稱Terracotta驅(qū)動器為一級緩存L1,服務(wù)器為二級緩存L2。Terracotta這一體系架構(gòu)跟其它集群解決方案相比,有如下幾點好處:1、避

7、免Java序列化,只把被修改的字段的數(shù)據(jù)傳遞給服務(wù)器和使用節(jié)點,大大減少CPU和內(nèi)存消耗;2、避免數(shù)據(jù)的廣播,只把修改的數(shù)據(jù)通知給正在使用該數(shù)據(jù)的節(jié)點,大大降低了網(wǎng)絡(luò)流量;3、利用服務(wù)器實現(xiàn)網(wǎng)絡(luò)擴展內(nèi)存,使得有限內(nèi)存的客戶端節(jié)點可以訪問遠大于其內(nèi)存容量的數(shù)據(jù)結(jié)構(gòu),而不必擔(dān)心發(fā)生內(nèi)存逸出的異常;4、通過服務(wù)器實現(xiàn)共享數(shù)據(jù)持久化,通過服務(wù)器集群實現(xiàn)容錯性等等5、無須學(xué)習(xí)新的API,大大降低開發(fā)成本企業(yè)版的Terracotta服務(wù)器還提供了數(shù)據(jù)分片(striping)的功能,使得集群吞吐量隨著Terracotta服務(wù)器數(shù)量的增加達到線性增長。Terracotta插件在核心產(chǎn)品的基礎(chǔ)上,Terraco

8、tta制定了通用擴展機制Terracotta Integration Module TIM。Terracotta本身提供了大量的插件,應(yīng)用于不同的集群應(yīng)用場景,比如Tomcat session復(fù)制、Spring Security整合、與Hibernate的整合、異步數(shù)據(jù)庫持久化等等。所有官方TIM可以在如下網(wǎng)站中找到:/releases/projects.html用戶也可以開發(fā)新的TIM,以適應(yīng)自己的應(yīng)用需求。比如TIM-Session實現(xiàn)了Web應(yīng)用服務(wù)器結(jié)點間session信息的共享。由于它利用了Terracotta集群間高效數(shù)據(jù)共享的機

9、制實現(xiàn)session共享,整個集群的吞吐量可以隨著服務(wù)器節(jié)點的增加而線性增長。與之相比,Tomcat自帶的session集群實現(xiàn),最多只能支持到4個節(jié)點左右。當(dāng)節(jié)點數(shù)目進一步增加的時候,各節(jié)點的CPU使用率和網(wǎng)絡(luò)負載會達到極限,反而降低整個集群的吞吐量?;赥erracotta的Tomcat集群可以達到幾十個節(jié)點甚至更多。我會在以后的文章中詳細介紹重要的TIM插件和他們的應(yīng)用場景?;赥erracotta的Java集群下面用一個簡單的Java程序描述如何利用Teracotta事件Java集群。這個例子大概只比一般的Hello World稍微復(fù)雜一點。目的主要是介紹使用Terracotta的最簡

10、單流程。我會在以后的文章中詳細介紹不同應(yīng)用場景下Terracotta不用的使用方式和解決問題的方法。首先看看Java代碼。這是一個簡單的多線程程序,啟動后生成兩個線程,給一個共享的計數(shù)器加一,然后打印出計數(shù)器的值:1. package simpleparallel;2.3. public class Main implements Runnable4. 5. private Object lock = new Object();6. private int count = 0;7. private static Main inst = new Main();8.9. /*10. * param

11、 args11. */12. public static void main(String args) 13. new Thread(inst).start();14. new Thread(inst).start();15. 16.17. public void run() 18. /keep increasing count by one every few seconds19.20. while(true)21. synchronized(lock)22. count+;23. System.out.println(Thread.currentThread().getName() + i

12、ncreased count to:+count);24. 25. try26. Thread.sleep(int)(5000*Math.random();27. 28. catch(Exception e)29. e.printStackTrace();30. 31. 32. 33. 34.35. 36.Details注意代碼中沒有任何特殊的JDK以外的API。單獨執(zhí)行這個程序,會看到如下現(xiàn)實的結(jié)果?,F(xiàn)在我們要把這個代碼放到集群上。目的是讓多個JVM共同訪問同一個計數(shù)器,并且能夠互斥地對它進行累加,而在全集群范圍內(nèi)不會產(chǎn)生數(shù)據(jù)沖突。具體的操作步驟如下:1、下載并安裝JDK 1.5或1.6,設(shè)

13、置系統(tǒng)的JAVA_HOME環(huán)境變量2、下載、安裝Terracotta環(huán)境 目前最新的Terracotta版本是3.0.1, 不過3.1馬上就要發(fā)布了,所以我們使用3.1 stable1,可以從下列地址下載:/web/display/orgsite/Download或者直接從這個地址下載3.1 stable1 。 用 java -jar terracotta-3.1.0-stable1-installer.jar 啟動安裝程序,把Terracotta安裝到指定的目標(biāo)目錄。假設(shè)安裝目錄是 $TC_HOME(Unix/Linux)或%TC_HOME%(Wind

14、ows) 3、到剛才的Java代碼的開發(fā)目錄下,確認代碼已經(jīng)用javac編譯好。假設(shè)編譯目標(biāo)文件在bin目錄下。4、創(chuàng)建一個文本文件tc-config.xml, 把下面的配置保存在該文件中:1. 2. 3. 4. 5. 95106. 95207. terracotta/server-data8. terracotta/server-logs9. terracotta/cluster-statistics10. 11. 12. 13. terracotta/client-logs14. terracotta/client-statistics/%D15. 16. 17. 18. 19. 20.

15、simpleparallel.Main21. 22. 23. 24. 25. simpleparallel.Main.inst26. 27. 28. 29. 30. void simpleparallel.Main.run()31. write32. 33. 34. 35. 36. 37.Details5、啟動Terracotta服務(wù)器:$TC_HOME/bin/start-tc-server.sh or%TC_HOME%/bin/start-tc-server.bat6、打開兩個或者更多的Terminal或DOS窗口,分別啟動一個測試程序:$TC_HOME/bin/dso-java.sh -

16、cp . simpleparallel.Mainor%TC_HOME%/bin/dso-java.bat -cp . simpleparallel.Main下圖是同時執(zhí)行三個程序的屏幕截圖:可見計數(shù)器已經(jīng)在集群中被3個Java程序?qū)嵗蚕?。每個程序有兩個線程訪問計數(shù)器。這樣整個集群中實際上有6個線程在同時累加計數(shù)器。從上面的啟動順序看,整個Java代碼沒有作任何改動。只是增加了一個tc-config.xml文件,并且用Terracotta的dso-java啟動程序啟動這個Java程序就可以了。tc-config.xml文件是使用Terracotta時最重要的配置文件。這里面最重要的幾個配置為

17、:1、roots:用來制定集群中要共享的數(shù)據(jù)。 simpleparallel.Main.inst 我們的例子制定共享Main類的inst對象,它包含的count和lock對象也就隨之被整個集群共享了。2、locks:用來制定對共享數(shù)據(jù)操作的時候采用的加鎖機制。 void simpleparallel.Main.run() write 這個例子中給Main.run()方法定義了自動鎖(autolock)。他告訴Teraccotta當(dāng)這個方法對共享的數(shù)據(jù)加鎖的時候(注意:Main.lock對象是共享的),使得這個鎖在整個集群范圍內(nèi)生效。這樣一來集群中任何一個線程鎖住這個對象的時候,其它任何線程都要等這個鎖解除后才能訪問被保護的數(shù)據(jù)(Main.count)。這樣計數(shù)器的訪問也就在整個集群中得到了保護。 總結(jié)Terracotta是唯一一個在JVM層實現(xiàn)Java集群的平臺。開發(fā)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論