key-value 存儲系統 Keyspace
Keyspace 是一家叫做 Scalien 的創業公司開發的高可靠 key-value 存儲系統。比起 Redis、Tokyo Tyrant 等系統來說,Keyspace 還非常新,才上線幾個月。有一篇 white paper 詳細介紹了 Keyspace 的設計和架構。Keyspace 強調的技術點是高可靠性,有以下一些特點:
- Key-value store:一個 key-value 數據存儲系統,只支持一些基本操作,如:SET(key, value) 和 GET(key) 等;
- 分布式:多臺機器(nodes)同時存儲數據和狀態,彼此交換消息來保持數據一致,可視為一個完整的存儲系統。為了更可靠,Keyspace 推薦使用奇數個 nodes,比如:3,5,7等;
- 數據一致:所有機器上的數據都是同步更新的、不用擔心得到不一致的結果,Keyspace 使用著名的 Paxos 分布式算法;
- 冗余:所有機器(nodes)保存相同的數據,整個系統的存儲能力取決于單臺機器(node)的能力;
- 容錯:如果有少數 nodes 出錯,比如重啟、當機、斷網、網絡丟包等各種 fault/fail 都不影響整個系統的運行;
- 高可靠性:容錯、冗余等保證了 Keyspace 的可靠性。
架構
Keyspace 的整個架構不復雜很清晰,最核心的就是 Leslie Lamport 的 Paxos consensus algorithm,這是分布式系統的經典的算法,具體可以看 VPSee 的這篇文章:Paxos 算法。(八卦一下,Leslie Lamport 大牛還是 LaTeX 的創建者和早期開發人員,現在在 Microsoft Research 工作)
Paxos 通過一個消息層來發消息給其他 nodes,Paxos 本身并不假設每次消息都能發送成功,因為消息可能在發送的過程中丟失、延遲、重組等。面臨這些可能會出現的 fail 以及對應的容錯措施都是由 Paxos 算法本身來處理的。Keyspace 是一個 master-slave 系統,如果 master node 出錯、當機了怎么辦?Keyspace 中的每個 node 都可以得到 master lease 并且一次可以占用5秒鐘,當然可以繼續占有這個 master lease 只要 node 沒 fail 掉,如果 fail 的話,master lease 就會過期(超過5秒),自動釋放了 master lease,這個時候另一個 node 就接過 master lease 充當起 master,Keyspace 用 PaxosLease Protocol 來釋放 master lease。PaxosLease 算法和其他 lease 算法一樣對時鐘很敏感,所以要正常運行 Keyspace 的話必須同步每個 node 的時鐘,如可以用 Unix 上面的標準 Network Time Protocol (NTP) 來同步。為了同時支持 TCP 和 UDP 協議,Keyspace 做了一個 Message Transport 層,這樣就可以用 UDP 來發小消息,用 TCP 來發包含很多數據的大消息。圖中的 Paxos 層用來實現 Paxos 算法,用 Paxos 來冗余數據庫的寫操作,這里的 Paxos 只是用來找 consensus,一旦確定 consensus 后各個 nodes 都會被通知到 consensus 值已經找到。一旦 consensus 被確定,ReplicatedLog 層就會把寫操作交給 KeyspaceDB 模塊,由這個模塊負責把寫數據寫到本地硬盤上。Keyspace 使用 Berkeley DB 的 Transactional Data Store 引擎存儲數據。圖中最上面的 HTTP 和 Keyspace Protocol 提供了接口給用戶使用,用戶可以通過這些 API 來操作 Keyspace 存儲系統。
操作
Keyspace 是一個 master based 的冗余數據庫,一些操作只能由 master node 來執行,如:
write 操作(SET, TEST-AND-SET, ADD, DELETE, REMOVE, PRUNE and SUBMIT)
safe read 操作(GET, LIST-KEYS, LIST-KEYVALUES)
也有一些操作可以由任意的 node 來執行,如:
get current master 操作(GET-MASTER)
dirty read 操作(DIRTY-GET, DIRTY-LIST-KEYS, DIRTY-LIST-KEYVALUES)
dirty read 操作可以從任意 node 上讀取結果,但是返回的結果可能會不一致,所以稱為 “dirty”。如果要修改數據庫的話必須連上 master 在 master 上操作,如果只是讀取數據庫而且不是很在意數據一致性的話可以連上任意 node 進行 dirty read 操作。如果需要數據一致怎么辦?可以層通過修改應用程序的邏輯來取得數據的一致性,比如在讀之前停止所有寫操作。
所有操作都可以通過 HTTP 的 GET 來執行,所以可以通過瀏覽器來執行這些操作。不過 HTTP 只用來測試,因為每個操作會創建一個新 TCP/HTTP 連接,系統開銷太大而且沒有必要。Keyspace APIs 使用 Keyspace protocol 來操作 Keyspace 系統。
安裝
安裝 Keyspace 的過程很簡單,安裝完必要軟件包后下載 keyspace 源代碼編譯:
# yum install gcc-c++ db4 db4-devel
# wget http://scalien.com/releases/keyspace/keyspace-1.0.1.tgz
# tar zxvf keyspace-1.0.1.tgz
# cd keyspace-1.0.1
# make
使用
在單機上運行 Keyspace:
# script/safe_keyspaced bin/keyspaced test/0/keyspace.conf test/0
# script/safe_keyspaced bin/keyspaced test/1/keyspace.conf test/1
# script/safe_keyspaced bin/keyspaced test/2/keyspace.conf test/2
然后通過 HTTP 訪問 Keyspace:
# curl http://localhost:8080/getmaster
0
I’m the master# curl http://localhost:8081/getmaster
0
I’m a slave# curl http://localhost:8082/getmaster
0
I’m a slave
如果想在多臺機器運行需要修改每臺機器的 keyspace.conf 配置文件。
介紹內容來自 http://www.ha97.com/2794.html