Project Voldemore 是一套分散式 key-value 的儲存系統(distributed key-value storage system).
- 此系統主要的特點, 在於任何的查詢, 都可以經過計算找到位置, 不需要找中央控管的 Server.
- 資料會自動重複儲存於多台 servers.
- 更多詳細可見: Project Voldemore
- 註: 此套目前 LinkedIn 正在使用. 詳可見:
Project Voldemort: Scaling Simple Storage at LinkedIn
Project Voldemort 結構
官方的 Project Voldemort Design / 結構 介紹, 下述簡單紀錄 Project Voldemort Design 的相關筆記.(請搭配原文參考, 只是想架設玩玩, 可以跳過這一區塊.)
System Architecture
- 看圖時可以搭配下面的 Hash Ring 參考: Hash Ring 的圖是 R = 3 的狀況: 順時針向右旋轉, 所以是 [A,C,B] (遇到 A 重覆跳過), [B,D,C], [D,B,A].
Data partitioning and replication
- S: server 數量
- p: 掛掉的可能性
- key => K on R servers
- R server key => a = K % S, a, a + 1 ... a + r
Data Format & Queries
- 系統的 Key 都是 唯一(unique)的.
Data Model & Serialization
- 資料儲存可以考慮 json / string / java-serialization / protobuf / identify (推薦 json)
Consistency & Versioning
在寫入 / 讀取 會有 replicate 狀況時,
如何保持資料一致性, 這邊有三種解法:
- Two-Phase Commit:
- 優點: locking protocol, 將機器經過兩 rounds 交叉排列, 是完美的一致性解法.
- 缺點: 沒辦法容忍錯誤 / 機器掛掉, 非常慢.
- Paxos-style consensus:
- 這個協定是來確保值的一致性, 這個的錯誤容忍度較高.
- Read-repair:
- 前面兩個 approach 是預防不一致性, 這個 approach 是保持資料一致性 和 即時偵測衝突狀況, 並解決這個問題.
- 這要靠 分類 + 複雜的錯誤容忍度, 需加上應用程式的邏輯來解決這個衝突.
- Versioning in a distributed system
- 我們有 versioning system 就是要防止同時寫入, 但是資料不同的狀況, 會透過偵測衝突然後讓 client 變一致性的工具.
基本環境 (Ant Java)
在架設之前, Ant Java 的觀念需要稍微知道一點, 下述轉載自: Ant 入門(1)- 什麼是 Ant?
官方網站
- Ant 的 官方網站:http://ant.apache.org/
- Ant 使用者手冊:http://ant.apache.org/manual/index.html
Ant 是以 Java 為基礎的構建工具,理論上,它有些類似Make,但沒有Make的缺點,並具有純Java撰寫的可攜性優點.
簡單的歸納一下Ant可以幫您自動完成的任務:
- 編譯Java原始碼
- 建立jar、war、zip檔案
- 自動測試與生成報告
- 從CVS等管理系統取得原始碼
Project Voldemort 環境架設
- Project Voldemort 環境架設參考: Quick start 此篇.
安裝步驟 - Ant & Java 環境
- apt-get install ant
- apt-get install sun-java6-jdk
- mv /usr/bin/java /usr/bin/java-gij
- ln -s /usr/lib/jvm/java-6-sun-1.6.0.12/bin/java /usr/bin/java
- 若不安裝 sun-java6-jdk, 並使用 sun 的 java, 執行 ant 時, 會出現下述錯誤.
ant Compliance level '1.4' is incompatible with target level '1.5'. A compliance level '1.5' or better is required
- 註: Debian 預設 java 環境是 gij / gcj (GNU libgcj)
安裝步驟 - Project Voldemort 環境
- svn checkout http://project-voldemort.googlecode.com/svn/trunk/ project-voldemort # 或下載 project-voldemort-0.4a.tgz 皆可
- cd project-voldemort
- ant # 若有任何錯誤, 可以 ant --execdebug 看詳細的訊息.
- bin/voldemort-server.sh config/single_node_cluster > /tmp/voldemort.log & # 啟動
- bin/voldemort-shell.sh test tcp://localhost:6666 # 執行 Shell Client 做簡單測試
測試
- > put "hello" "world" # 建立 key 是 "hello", value 是 "world"
- > get "hello" # 取得 key "hello" 的資料
version(0:1): "world" # 得到 world. version() 代表: cluster.xml 設定的 機器id、partitions ex: version(機器id : 哪個partitions)
- > delete "hello" # 刪除 key "hello" 的資料
- > get "hello" # 取得 key "hello" 的資料
null # 無此資料
- > exit
網頁監控
- http://MACHINE_IP:8081/admin # 啟動後, 可於此處做管理.
- http://MACHINE_IP:8081/query # web.xml 是有此介面, 但是試不出如何使用, source code:
src/java/voldemort/server/http/gui/QueryServlet.java
- 註: 有 store / key / key_type(string) / value / action 的參數可以用
資料庫儲存位置
- project-voldemort/config/single_node_cluster/data/bdb/00000000.jdb # *.jdb
Project Voldemort 操作命令
Project Voldemort 只有簡單的幾個命令:
- put key value -- Associate the given value with the key.
- get key -- Retrieve the value associated with the key.
- delete key -- Remove all values associated with the key.
- locate key -- Determine which servers host the give key.
- help -- Print this message.
- exit -- Exit from this shell.
設定 store.xml
- name: table name
- replication-factor: 資料被儲存的總次數, 一台 replication-factor 是n, 代表可以容忍 n-1 node failures 資料不會遺失.
- preferred-factor: 優先讀取
- required-factor: 最少需要幾台讀取
- 更多詳細可見: Project Voldemort - configuration
- 設定多台的範例: project-voldemort-config.tgz (註: 此設定僅供參考, 此設定於其中機器死掉時, 會有資料遺失, 還在測試是哪邊設定有誤)