5 分鐘介紹幫 12306 解決數億人訂票問題的 Geode
概述
Geode是一個提供實時、一致訪問大型分布式云平臺下數據密集型應用的數據管理平臺。
Geode 通過跨多進程,把內存、CPU、網絡資源和可選的本地磁盤匯集起來,來管理應用程序對象及其行為。它使用動態復制和數據分片技術,來實現高可用性,改善性能、可伸縮性和容錯。Geode 除了是一個分布式數據容器,它還是一個內存數據管理系統,提供了可靠的異步事件通知和有保證的消息傳遞。
Geode 是一個非常成熟、健壯的產品,它的前身可以追溯到第一個由 Smalltalk 構造的對象數據庫:GeoStone。作為一個事務性、低延遲的數據引擎,多個華爾街交易平臺首次將 Geode(稱為GemFire?)部署在金融部門。如今已有超過 600 家企業用戶將 Geode 用于大規模、7*24 業務核心應用程序中。其中一個應用案例包括 中國國家鐵路 將 Geode 用于整個國家的鐵路票務系統,10 個節點集群管理著 2TB 的內存熱數據,以及 10 個備份節點作為高可用性和彈性擴展。
主要概念和組件
在 Geode 分布式系統中,“緩存”是用來形容一個節點的抽象概念。
在每個緩存中,由您定義 數據區域 。數據區域(Data region)類似于關系型數據庫的表,并且作為“name/value 對”以分布式方式管理數據。 復制區域(replicated region) 存儲著 {分布式系統中每個緩存成員數據的} 相同副本。 分區區域(partitioned region) 在緩存成員之間傳播數據。系統配置之后,客戶端應用 {在不了解底層系統架構的情況下} 也可訪問區域中的分布式數據。當數據發生改變的時候,您可以定義監聽器來接收通知,并且您也可以定義過期條件,來刪除區域中的過期數據。
定位器(Locator)提供發現服務和負載均衡服務。您可通過定位器服務列表來配置客戶端,定位器維護著一個動態成員服務器列表。默認情況下,Geode 客戶端和服務器使用40404端口,以及通過使用多播互相通信。
Geode 包含以下特性:
- 結合冗余、復制和“非共享”的持久化架構,來實現故障安全可靠性 (譯者解釋:高可用,防止單點故障) 和性能。
- 可水平擴展至成千上萬個緩存成員,并結合多個緩存拓撲來滿足不同的企業需求。該緩存可以分布在多個計算機中。
- 異步和同步緩存更新傳播(propagation)。
- Delta 僅在一個對象(delta)新舊不同版本之間傳播,而不是整個對象,從而極大降低了分發成本。
- 可靠的異步事件通知,優化后的、低延遲的分布層保證了消息傳遞。
- 無需額外的硬件,應用程序即可提速 4~40 倍。
- 數據敏感和實時業務智能。如果在您檢索時數據發生更改,您能立即看到數據的變化。
- 與 Spring 框架集成,以加速并簡化可擴展的事務型企業應用程序的開發。
- 支持 JTA 事務。
- 整個集群范圍的配置,可以持久化,并可導出到其他集群。
- 通過 HTTP 即可實現對集群遠程管理。
- 為 REST 應用程序開發提供 REST API 支持。
- 在主版本發布之間滾動升級。 </ul>
Geode 5分鐘入門
從 Pivotal 獲取源文件,從源文件中提取并構建(注:目前 Geode 支持 jdk1.7.75):
$ cd geode $ ./gradlew build installDist
啟動定位器和服務器:
$ cd gemfire-assembly/build/install/geode $ ./bin/gfsh gfsh> start locator --name=locator gfsh> start server --name=server
創建一個區域:
gfsh> create region --name=region --type=REPLICATE
編寫一個客戶端應用程序:
HelloWorld.java
import java.util.Map; import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.client.*;public class HelloWorld { public static void main(String[] args) throws Exception { ClientCache cache = new ClientCacheFactory() .addPoolLocator("localhost", 10334) .create(); Region<String, String> region = cache .<String, String>createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY) .create("region");
region.put("1", "Hello"); region.put("2", "World"); for (Map.Entry<String, String> entry : region.entrySet()) { System.out.format("key = %s, value = %sn", entry.getKey(), entry.getValue()); } cache.close();
} }</pre>
編譯并運行 HelloWorld.java。classpath 中應包含 gemfire-core-dependencies.jar 包:
javac -cp /some/path/geode/gemfire-assembly/build/install/geode/lib/gemfire-core-dependencies.jar HelloWorld.java java -cp .:/some/path/geode/gemfire-assembly/build/install/geode/lib/gemfire-core-dependencies.jar HelloWorld應用程序開發
Geode 應用程序可以用很多種客戶端技術實現:
- Java 通過使用 Geode 客戶端 API,或者嵌入式使用 Geode API
- Spring Data GemFire 或 Spring Cache
- Python
- REST
- memcached </ul> 原文 http://blog.jobbole.com/87810/