1. Introduction
Terracotta 在其官方文檔中的定義是一種透明的集群服務(wù),也可以看成是JVM級別的集群。其中“透明”的含義并不是指已有程序無(wú)需做任何改動(dòng)就可以使用Terracotta ,但是使用Terracotta 的代碼無(wú)需實(shí)現特定的接口,也不依賴(lài)各種magic beans。通常意義上的“集群”是指多個(gè)應用通過(guò)網(wǎng)絡(luò )通信、共享數據等,但是這種集群方式通常要求在應用程序中加入集群相關(guān)的代碼。Terracotta 是在應用程序之下,JVM級別上的集群。這使得應用程序從復雜的集群相關(guān)的邏輯中解放出來(lái),從而可以關(guān)注在業(yè)務(wù)邏輯本身。

Terracotta是開(kāi)源的,并且可以集成在很多主流的開(kāi)源軟件中,如Jetty、Tomcat、Spring、Geronimo和EHCache等。Terracotta 的核心組件有兩個(gè):客戶(hù)端類(lèi)庫(client libraries)和服務(wù)端進(jìn)程(Terracotta server),它們之間通過(guò)TCP/IP通信。Terracotta server獨立于各個(gè)應用程序,它負責對集群的集中管理;客戶(hù)端類(lèi)庫則用于加入集群。
Terracotta 的最新版本是2.7.3,可以從http://www.terracotta.org/下載。其Windows安裝文件100多M。默認的安裝目錄是C:\Program Files\Terracotta。安裝后進(jìn)入到bin目錄執行start-tc-server.bat就可以啟動(dòng)Terracotta server。從Windows開(kāi)始菜單TerraCotta 2.7.3 -> Administrator Console啟動(dòng)Terracotta 的管理控制臺。啟動(dòng)管理控制臺后,使用默認的Server Host和JMX Port,點(diǎn)擊Connect按鈕。當TerraCotta管理控制臺連接到Terracotta server之后,會(huì )顯示類(lèi)似于下圖的界面:

其左側樹(shù)形控件的Servers節點(diǎn)會(huì )顯示連接到的Terracotta server的詳細信息。此時(shí)由于沒(méi)有客戶(hù)端程序連接到Terracotta server,因此Cluster Object節點(diǎn)和Clients節點(diǎn)內容為空。接下來(lái)演示一個(gè)Terracotta 附帶的例子應用。通過(guò)Terracotta 2.7.3 -> Terracotta Welcome啟動(dòng)Terracotta Welcome程序,單擊Sample Applications鏈接。在Sample Application Launcher中單擊Shared Graphics Editor下邊的Launch鏈接。在Shared Editor啟動(dòng)后,隨意繪制幾個(gè)圖形。然后 回到Sample Application Launcher中再次單擊Shared Graphics Editor下邊的Launch鏈接。第二次啟動(dòng)的Shared Editor中會(huì )顯示出之前繪制的圖形,并且在任何一個(gè)Shared Editor中繪制的圖形都會(huì )被同步到另外的Shared Editor中。接下來(lái)回到Terracotta 管理控制臺,可以看到Clients節點(diǎn)中包含了兩個(gè)客戶(hù)端程序的信息。Cluster Object節點(diǎn)中包含了共享對象的信息。此時(shí)如果把所有的Shared Editor都關(guān)閉,那么Clients節點(diǎn)的內容變?yōu)榭?,但是Cluster Object節點(diǎn)中仍然包含了共享對象的信息。如果再次啟動(dòng)一個(gè)Shared Editor,那么這個(gè)Shared Editor中會(huì )顯示之前的Shared Editor關(guān)閉時(shí)的圖形。最后,通過(guò)bin目錄中的stop-tc-server.bat停止Terracotta server。
最常見(jiàn)的應用Terracotta 的場(chǎng)景是分布式緩存、Session復制和網(wǎng)格計算等。通過(guò)Terracotta 在集群中共享的對象不必是可序列化的(但必須是portable的,portable是Terracotta 引進(jìn)的一個(gè)概念,會(huì )在以后詳細介紹)。當集群中的某個(gè)應用對共享對象進(jìn)行修改的時(shí)候,這些修改會(huì )被同步到Terracotta server。Terracotta server可以對這些修改進(jìn)行持久化保存,同時(shí)Terracotta server可以被配置成Master/Slave模式,這些都提供了高可用性。
設想一個(gè)使用Terracotta 進(jìn)行Session復制的場(chǎng)景: Tomcat A、B和C通過(guò)TerraCotta進(jìn)行session復制,如果使用sticky load balancing,那么相同session的多個(gè)請求都會(huì )被發(fā)送到相同的Tomcat,比如A。A對該session的修改會(huì )被同步到Terracotta server,但是Terracotta server不會(huì )將這些修改同步到B和C(因為在B和C上不會(huì )訪(fǎng)問(wèn)到這個(gè)session),這樣就減少了數據同步的次數。假設A由于某種故障而停止,那么load balancer可能會(huì )將該session的請求發(fā)送給B,在B的應用訪(fǎng)問(wèn)這個(gè)session的時(shí)候,TerraCotta才會(huì )將A之前對這個(gè)session的修改同步到B。此外,由于Terracotta 在同步的時(shí)候并沒(méi)有使用序列化機制,因此它在同步數據的時(shí)候并不是每次都將整個(gè)session對象序列化后進(jìn)行傳輸,而只是對session里改變的部分進(jìn)行同步(Terracotta 使用了字節碼加強的技術(shù),攔截了包括內存讀寫(xiě)在內的指令),這樣就大大減少了網(wǎng)絡(luò )傳輸的數據量。
聯(lián)系客服