| 11 | Hypertable 將資料運用主鍵排列儲存在table裡。資料庫所有cell的值都是不解釋的字符數組串,沒有任何類型與型態。Hypertables藉由將tables切割成連續的範圍,並分佈儲存到不同的實體機器上,來擴大規模。Hypertable cluster有兩種server: (1) Range Servers - 掌管一個範圍內的一連串資料; (2) Master Servers - 處理管理工作和監督 Range Servers。單一實體機器可以同時跑 Range Server process 和 Master Server process。單一Range Server可以掌管許多不連續的ranges;單一 Master Server負責很聰明地將它們做分散的規劃管理。如果某單一range滿了的話,range則被分半並重新配置。上半部的range不變,下半部的range則被Master Server重新指定到一個新的Range Server。預設最大的range size是200MB。如果全部的 Range Servers都已滿了, Master Servers則會將ranges搬移到較少較不滿的Range Servers。ranges的清單及它們位在哪裡以METADATA型式存在table裡,如同正規的table一樣與Hypertable共存。而Hyperspace 提供一個類似一般正規檔案系統的命名空間,並為客戶端扮演一個鎖定管理者做控管。 |
| 12 | |
| 13 | 以下是一個例子,顯示了存在Hypertable裡的資料是怎麼樣的,和該如何為非同質性的資料組儲存tags 和reviews。線上商店有許多商品項目,包括玩偶.傢俱和帽子。列識別符為玩偶.傢俱和帽子的名字,並且有許多行用來描述其每個tag 和review。前四行指示這個tag的行家族之資料點是tag,行識別符是標籤的名稱,值是我們想給其加上什麼標籤值。第五第六行家族指示它是個review,識別符是書寫者的名稱,其內容值才是真正的review。 |
| 14 | |
| 15 | ||key ||tag:striped ||tag:fourlegs ||tag:velvet ||tag:male ||tag:comfortable ||review:joey ||review:susan ||price:US ||price:EU |
| 16 | ||Zebra ||803|| 212 ||0 ||6 ||9 ||"I like my zebra" ||||25.00 ||20.00 || |
| 17 | ||Ottoman ||1||343||298 ||0||0||""||"this is an excellent ottoman"||200.00||175.00|| |
| 18 | ||Fedora ||3 ||0||145||34||78||""||"a very fine hat"||50.00||40.00|| |
| 19 | |
| 20 | Hypertable 裡的schemas 非常有彈性, 只有行家族需要事先被定義。建立table的HQL命令如下﹔ |
| 21 | CREATE TABLE Items { |
| 22 | tag, |
| 23 | review, |
| 24 | price |
| 25 | }; |
| 26 | 資料以 key:value組的方式儲存。所有資料的修定版都儲存在Hypertable裡,所以時間戳記是keys裡相當重要的一個部分。每單一資料點的典型key是<row><column-family><column-qualifier><timestamp>。所挑選到的時間戳記通常會以一個range做傳入,然後回傳一整個range的所有值。這可以使得很容易看出資料的舊版本值和看其隨著時間的變化,並且可以確保之前的資料都有被儲存起來而不是被覆寫過去。這預設的行為可以被覆寫而儲存成一個固定號碼的最近版本,並允許較舊的版本做鬆散的垃圾收集。以下為Zebra列的時間戳記版本: |
| 27 | |
| 28 | |
| 29 | ||time ||key ||tag:striped ||tag:fourlegs ||tag:velvet||tag:male||tag:comfortable||review:joey||review:susan||price:US||price:EU|| |
| 30 | ||t=1||Zebra||803||212||0 ||6||9||"I like my zebra"||||25.00||20.00|| |
| 31 | ||t=2||Zebra ||804|||||||||||||||||| |
| 32 | ||t=3||Zebra||||216||1||||||"I REALLY like my zebra"|||||||| |
| 33 | ||t=4||Zebra||||||||||||||||24.99||19.99|| |
| 34 | |
| 35 | 所以在t=4,如果Zebra列有以下這樣的值: |
| 36 | ||t=4 ||Zebra ||804||216||1||6||9||"I REALLY like my zebra" ||24.99||19.99|| |
| 37 | |
| 38 | Hypertable透過使用Cell Caches 和 Cell Stores 可以有效率的處理隨機更新。一個range實際上由許多Cell Stores組成。在一個cell store裡的所有列都是以列識別符做排序。Hypertable當一個寫入的動作發生,此資訊會先被寫入DFS的commit log,然後再存入Cell Cache的記憶體。 當Cell Cache達到大小限制,就會被壓縮並寫到硬碟裡成為Cell Store。Cell stores終究是不連續的,所以Heap Merge scanner負責聚集在cell cache 和cell store裡的key/value pairs,並且回傳排過序後的值。當range達到一個cell store的限制, Heap Merge就會啟動並且壓縮多個cell stores 成一個。不過在理想的狀況下,每個range最好只擁有單一的Cell Store。 |
| 39 | |
| 40 | Hypertable 提供使用者可以透過存取群組機制來控制行資料如何實際地儲存在DFS裡。每一行家族屬於單一存取群組,所有再存取群組裡行家族的資料都實際地一起儲存在硬碟裡。這可以改善被存取頻繁的行家族之讀寫效能。以下舉個例子,一個table有100個行家族,但只有兩個行家族比較常被存取。如果這兩個行家族一起被儲存在他們自己的存取群組,那麼為了要存取它們,系統將作disk I/O只須針對這兩行。若沒有存取群組,即使只有兩行的資料要存取,這100行的資料都將實際地被讀寫。 |
| 41 | |