1. 程式人生 > >Apache Geode/GemFire入門(1)-基本概念和模組

Apache Geode/GemFire入門(1)-基本概念和模組

在這個入門中我們將走一遍GemFire應用程式程式碼,學習GemFire Enterprise基本的特性。這個應用詳解了GemFire怎麼在VMs宕機情況下並不中斷服務。當應用執行時動態地新增更多的儲存,並且提供更小的延遲來訪問你的資料。

入門概覽

主要的概念

本入門涵蓋了以下概念:

GemFire Distributed

System

執行在GemFire上的VMs組成了分散式系統。每一個MV都作為一個GemFire對等體存在。啟動GemFire對等體,在每個VM對等體上你建立了一個快取。每一個快取管理到其他VM對等體的連線。通過UDP多播或者TCP位置服務,互相發現。

Regions

Region是一個分散式系統之上的抽象概念。一個Region允許你在系統的多個VM中儲存資料,不用考慮資料存在那個對等體上。Region給你一個map介面能透明地從合適的VM上獲取資料。這個Region類擴充套件了java.util.Map介面,

但是他也支援查詢和事務。

Replicated regions

一個Replicated region儲存著所有分割槽的資料拷貝

Partitioned regions

Partitioned regions只儲存一部分分割槽的資料拷貝

Client caching

GemFire分散式系統是一個網格結構,所有的Peer直接互相連線。GemFire也支援客戶端,客戶端有他們自己的本地資料快取,他們能夠更新他們的本地快取,通過註冊伺服器來更新改變的資料。

Shared-nothing persistence

GemFire支援’非共享’持久化,每一個peer持久化資料到本地磁碟,GemFire持久化也允許你在磁碟上維護一份配置的資料拷貝。

分散式系統和Region

1.開始一個locator

通過UDP多播或者TCP位置服務GemFire能夠動態發現成員,其中執行TCP位置服務的被稱為Locator,Locator作為單獨的程序執行,每一個新的VM連線到已有的Peer上。在這個例子中我們將要使用Locator。

5818de1730f2e6796abf6cd6bc110473ad08b763

2.建立一份快取

你將要在GemFire對等體上儲存一些資料。第一步啟動GemFire對等體建立一份快取。快取是GemFire的中心模組。他管理著到其他GemFire對等體的連線。

— ”locators” 屬性告訴快取哪一個locator用來發現其他的GemFire VM。

—“mcast-port” 屬性告訴GemFire是否用多播發現來找到對等體。

—“log-level” 屬性控制GemFire內部日誌級別。設定error是為了限制訊息的數量,這個將在”console”中顯示。在呼叫建立結束後,對等體已經發現了其他的對等體同時連線他們。

3.啟動對等體

執行IDE中執行兩次peer.java ,對等體啟動,互相連線。

4.建立People region(a replicated region)

GemFire Region是一個鍵值集合。他擴充套件了java.util.concurrent.ConcurrentMap介面。Region最簡單的型別就是replicated region。每一個擁有replicated region的peer都儲存一份整個region的拷貝。對replicated region所做的任何改變都同步傳送到所有的peer中。

5fc6426f57ba26daac0113733e529fa9a4e9ef83

a.檢視一下GemFireDAO中initPeer方法,用RegionFactory建立region,在這個例子中,people region用RegionShortcut.REPLICATE構造,告訴工廠使用replicated region的配置,這個方法添加了快取監聽器到region。當region中的資料改變,你能夠利用快取監聽器接受改變通告。這個應用包含了LoggingCacheListener類,他能把改變列印到控制檯,能夠讓你看到條目怎麼被分佈的。

b.看一下addPerson方法。通過呼叫region.put()方法新增條目到region。

    public void addPerson(String name, Profile profile) {

     people.put(name, profile);

    }

通過分佈people物件到所有的對等體當中。在完成呼叫之後,每一份對等體都有一份person拷貝。

c.新增people。在控制檯中鍵入

>person Isabella
>person Ethan

你將在視窗中看到

In region people created key Isabella value Profile [friends=[]]
In region people created key Ethan value Profile [friends=[]]

5.建立Posts region(partitioned region)

你建立了大量的posts。如果你不想在每一臺伺服器上都擁有一份拷貝。

你能儲存一份在partitioned region當中。一個partitioned region讓你在你的分散式系統當中控制拷貝數量。資料在所有的對等體中分割槽。GemFire自動維護了每個分割槽的拷貝數量。    

deca5c6732882345e9e3b9658da7c79d8f1577c7

看一下GemFireDAO的initPeer方法,你能使用PARTITION_XXX快捷鍵建立分割槽。建立posts區,這個方法使用PARTITIONED_REDUNDANT快捷鍵告訴GemFire建立一個分割槽來維護主備

拷貝。

5.啟動對等體應用

再啟動一個對等體

6.新增一個帖子

你將要看到只有一個VM上的監聽器被呼叫。這是因為分割槽選擇其中一份拷貝到主拷貝中。預設情況下,GemFire只調用了維護主拷貝的對等體的監聽器。

7.用posts命令列出可用的posts命令

GemFire會從每一個各自的對等體中獲取他們,

如果你殺了一個VMs,你仍然能夠列出所有的條目。這就是VM的備份能力。

8.kill掉peers

Client/server 快取

你有一個全工作系統,但是現在UI程式碼正執行在相同的VM上,這些用例工作地很好,

但是對於其他人不需要,比如,如果你在UI層有一個web server,你可能想到增加或者減少web server的數量而不改變data server。或者你只需要100G的伺服器,但是可能有數萬個客戶端會訪問它。對於這個例子,有一個專門的GemFire伺服器來服務GemFire客戶端會更有意義。

01d194057522a648731011c1e4754186079bb87a

GemFire伺服器是GemFire對等體,但是他們也能監聽客戶端連線的埠,而GemFire客戶端連線一個限制數量的伺服器。

對於傳統的peers,GemFire伺服器仍然需要定義region。你可能已經有了peer程式碼,又建立了一個CacheServer,但是這個例子使用了cacheserver指令碼。Cacheserver指令碼從cache xml檔案中讀取了cache配置。Cache.xml 以宣告的方式在快取中定義region。

1.用xml配置GemFire

所有在java程式碼能做的也都能在xml中定義,

<cache>
  <region name="people" refid="REPLICATE">
    <region-attributes>
      <cache-listener>
        <class-name>com.gemstone.gemfire.tutorial.storage.LoggingCacheListener</class-name>
      </cache-listener>
    </region-attributes>
  </region>
                       <region name="posts" refid="PARTITION_REDUNDANT">
    <region-attributes>
      <cache-listener>
        <class-name>com.gemstone.gemfire.tutorial.storage.LoggingCacheListener</class-name>
      </cache-listener>
    </region-attributes>
  </region>
</cache>

1.啟動快取伺服器

Cacheserver 指令碼啟動了jaguar對等體(監聽客戶端連線),又啟動了兩個快取伺服器,

3.啟動一個客戶端

啟動一個客戶端和啟動GemFire peer是一樣的。在Jaguar客戶端上,你創造一個ClientCache

連線到Locator來發現伺服器,看一下GemFire DAO.initClient方法。這個方法所做的就是建立ClientCache。

一旦你建立一個ClientCache,他便維護了一個類似於JDBC的連線池。然而你不需要用GemFire從池中來做查詢連線和返回他們,這個是自動發生的。池定位屬性告訴你客戶端怎麼發現伺服器。客戶端使用相同的Locator發現快取伺服器。

設定訂閱功能開啟,訂閱冗餘屬性執行客戶端訂閱更新服務端條目。如果你訂閱通告(任何人新增的),這個更新被非同步傳送到客戶端。因為更新被非同步傳送,他們需要在服務端佇列化。提交冗餘設定控制多少佇列拷貝在服務端維護。

設定冗餘級別為1意味著你能宕掉1個伺服器而沒有任何的訊息丟失。

4.建立一個proxy region,在客戶端發Post訊息

在客戶端建立一個region類似於在peer中建立region。有兩個型別的client region,proxy region和caching region。Proxy region並不在客戶端存資料。CACHING_PROXY region允許客戶端儲存鍵值。這個例子使用了大量的posts,這樣你不用在客戶端快取任何的posts。你能建立一個帶有PROXY 的proxy region。看一看GemFireDAO.initPeer方法。這個方法建立了posts region

  posts = cache.<PostID, String>createClientRegionFactory(PROXY)
      .create("posts");

5.在客戶端建立一個cache proxy region,People

你並沒有很多people,所以在這個例子當中客戶端快取所有的people。第一你建立了一個有本地儲存的region,ClientRegionShortcut.CACHING_PROXY。在initClient方法中,people region被建立。

6.呼叫registerInterest方法訂閱從伺服器上來的通告。

通過建立一個CACHING_PROXY,你能告訴GemFire快取任何的people你從客戶端創建出來的。然而,你也能選擇任何的更新到people region的從其他的peer 或者別的客戶端通過呼叫registerInterest方法。在這個案例中,你在所有people中想要register interest,這樣你快取整個people region在客戶端。正則表示式匹配了所有的鍵值在people region中的。看一下initClient方法呼叫registerInterestRegex,

    people.registerInterestRegex(".*");

當registerInterestRegex方法被呼叫時,客戶端下載已經存在的people。當一個new person 被新增到server上時,他被推到客戶端。

7.從client中迭代鍵值

public Set<String> getPeople() {
    return people.keySet();
  }
  public Set<PostID> getPosts() {
    if(isClient) {
      return posts.keySetOnServer();
    } else {
      return posts.keySet();
    }
  }

8.在IDE中執行客戶端應用程式

新增和停止Cache Servers

你能夠動態的新增peers到伺服器中當系統正在執行時。New peers動態地被其他peer和客戶端發現。New peer自動接受一份拷貝由replicated region建立的。然而, partitioned region並不自動地分佈資料到new peer如果你不顯式地命令GemFire負載均衡partitioned region。

在cacheserver指令碼中, 你能通過一個命令列來指定一個new peer將要觸發一個所有partitioned region的負載均衡。

停止cache servers

1.停止其中之一的cacheservers

資料仍然可用, 客戶端自動忽略死掉的伺服器。

2.在移動到下一步之前, 停止其他的快取伺服器。你能保持客戶端處於執行狀態。