GoshawkDB:一個分布式、支持事務與容錯的對象存儲
在經過了10個月的全力開發后, GoshawkDB 0.1發布了。這是GoshawkDB的首個公開發布版本,但該版本還是Beta版,因此不建議在生產環境下使用。同時,GoshawkDB服務端二進制文件現在已經可以 下載 ,Go客戶端(Go gettable)也可以使用了。
GoshawkDB是一個對象存儲,提供了完全的事務支持、直觀的語義、分布式、高性能的CP系統、冗余、無模式以及安全等特性。
GoshawkDB的主要特性列舉如下:
對象存儲
在編程語言中,你會通過對象而不是行或列來對數據進行建模。GoshawkDB是個對象存儲,因此無需將對象轉換為表項目,然后再轉換回來:你所使用的只是持久化對象而已。這種直觀且簡單的做法與編程語言之間形成了非常自然的吻合關系。任何對象圖都是可以接受的:它并沒有施加什么限制,因此在使用GoshawkDB時,你無需改變自己對數據進行建模的方式。對象圖的導航以及資源探測都是通過從根對象進行遍歷的,根對象是在GoshawkDB首次啟動時由其所創建的。連接到GoshawkDB集群的所有客戶端都會知道這個根對象,并且會從這個對象開始進行導航。對象值就是普通的字節數組:GoshawkDB不要求使用模式,因此無需解釋對象值。這意味著你可以自由使用任何對象序列化格式:從JSON到ProtoBuf,再到CapnProto等等。這樣,對象就是多語言的了,你只需選擇一種序列化格式即可。此外,這還表示你可以自由加密對象值,因為GoshawkDB根本就不會檢測他們:他們對于GoshawkDB來說是完全透明的。
完全的事務支持
GoshawkDB支持完全的多對象事務,事務是原子和隔離的,無論事務中包含了多少對象,無論這些對象存儲在哪里都是如此。GoshawkDB客戶端支持嵌套事務,諸如Retry等高級特性使得GoshawkDB的事務變得異常強大和靈活。
直觀的語義
如果語義不明確或是非常復雜,那么使用任何數據存儲都是毫無意義的。GoshawkDB對于事務只支持最強的序列化隔離級別。這是最簡單,也是最直觀的隔離級別。GoshawkDB對于在失敗的情況下應該如何做進行了明確的保證,這可以確保你的理解與系統的行為之間不會出現任何偏差。
分布式
GoshawkDB是個分布式數據存儲,無論在云端還是自己的數據中心都如此。結點集群會呈現出一種邏輯存儲,獨特且改進過的一致性哈希形式確保了對象與負載會均勻地散落在各個結點上,同時還提供了可配置的冗余級別。客戶端可以連接到任何結點來訪問數據存儲;所有結點都是等同的。
在傳統數據庫中,數據是存儲在服務器上的,你需要向服務器發送請求。這樣,在傳統的SQL事務中,你對數據庫所執行的每個操作都會在客戶端與服務器之間形成一個來回的通信。服務器還會追蹤你所執行的所有操作,一旦操作完成,它就會以某種方式來驗證這些動作不會違背隔離級別的要求。這會導致非常長且復雜的SQL查詢,從而減小客戶端與服務器之間的來回通信以及事務長度,甚至還會要求我們使用存儲過程。
GoshawkDB的設計則是完全不同的。在GoshawkDB中,事務只運行在客戶端。你可以將客戶端看作是服務器所存儲的對象的不完整緩存。事務是完全運行在客戶端的。所有對象的讀、創建與寫入都是在客戶端累積到一起的,然后一次性發送給服務器進行驗證。這樣,如果客戶端的對象緩存合法,那么無論事務有多么長,客戶端與服務器之間只有一次來回通信。如果由于其他客戶端的修改導致當前客戶端的緩存過期了,那么服務器就會拒絕事務,并要求該客戶端重新運行并更新緩存。客戶端只需應用更新,然后自動重新運行事務即可。
由于這一點,事務就變成了普通的功能,它會使用客戶端API來檢測并修改對象。我們無需再去使用類似于SQL這樣的語言。客戶端會負責在必要的情況下自動重新運行事務。這也意味著在某些情況下,GoshawkDB是無鎖的:一個事務的動作可能永遠不會導致另一個事務被鎖定,從而無法繼續進行,死鎖也就不會發生了。不過,在客戶端提交事務修改前,事務可能需要運行多次,這些修改會成功通過驗證并應用到數據存儲上。
高性能的CP系統
GoshawkDB是個CP系統(Consistency,Partition Tolerance)。這意味著當出現失敗或是分區狀況時不會導致一致性問題;相比于AP系統(Availability,Partition Tolerance)來說,它不會欺騙你。有證據表明CP系統要做的事情比AP系統要多,因此速度上不會很快,不過GoshawkDB獨特的設計考慮到了性能與網絡問題。GoshawkDB只會在必要時開啟事務。與其他很多分布式CP數據存儲不同,對于不變負載來說,GoshawkDB的性能并不會隨著結點的增加而有所降低,相反性能還會得到提升。
冗余
GoshawkDB在多個結點上維護了每個對象的副本。它并未使用leader/follower設計方式:所有結點都是等同的,每個對象的所有副本也都是等同的。事務只需要與每個對象的大多數副本進行通信即可進行,因此GoshawkDB可以在失敗的情況下繼續處理,只要每個對象的大多數副本依然可以使用即可。每個對象的副本數量可能會比集群中的結點數少:GoshawkDB是分片的。GoshawkDB使用了Paxos Synod協議來實現一致性。對象的修改會在客戶端知道事務結果之前被寫到磁盤上。
無模式
GoshawkDB并不要求對數據使用模式;GoshawkDB將對象值看作是普通的字節數組,你可以根據自身情況選擇適合的序列化格式。唯一的要求就是要顯式聲明指向其他對象的指針:如果對象x包含了對對象y的指針,那么你需要讓GoshawkDB知道這一點。
安全
服務器結點之間的所有通信都是通過NaCl crypto庫加密的。客戶端與服務器結點之間的所有通信也都是通過NaCl crypto庫加密的,同時客戶端連接是需要認證的(使用用戶名與密碼)。
GoshawkDB服務器是免費提供的,基于GNU Affero General Public License 3.0。同時也可以使用商業許可。 GoshawkDB Server 0.1 - Linux 64-bit x86 (10587576字節)的sha1sum是5084891dcac0d606a0c30df257310fba18e1052a。可以通過Mercurial瀏覽并克隆其 源代碼 。目前,其預構建的二進制文件只針對64-bit x86 Linux。GoshawkDB可以在支持Go與LMDB的平臺上進行構建。其源代碼在GitHub上也有 鏡像 。
來自: http://www.infoq.com/cn/news/2016/01/goshawkdb-0.1-released