NewSQL數據庫VoltDB特性簡介

轉自:

https://blog.csdn.net/dc_726/article/details/41909719

https://blog.csdn.net/jxchinaren/article/details/38394217

 

 

VoltDB是一個革命性的新型數據庫產品,被稱作NewSQL數據庫。它基於H-Store,號稱比當前數據庫產品的吞吐量高45倍,同時又具有很高的擴展性。它的特性主要有以下幾點:

Ø  高吞吐、低延遲:通過內存計算,存儲過程和串行數據訪問實現。

Ø  可擴展性:自動分區和複製,保證性能和可擴展性。

Ø  高可用性:同步的多主複製(在VoltDB中叫K-safety)。

Ø  持久化:數據庫快照與命令日誌(command log)的創新技術組合。

1 高吞吐、低延遲

VoltDB能夠提供高吞吐、低延遲的SQL操作,總體來說,它是通過內存計算避免磁盤阻塞(disk stall),通過存儲過程避免用戶阻塞(user stall),通過集羣結點內的數據訪問串行化,避免傳統數據庫鎖、緩衝管理的開銷。此外,VoltDB並不是純Java開發,其SQL執行引擎是C++寫成的,所以並不受GC暫停的影響。

Ø  內存計算:使VoltDB在事務執行期間無需等待磁盤加載,避免磁盤I/O開銷。充分利用了現代服務器上龐大的內存,將吞吐量最大化。

Ø  存儲過程:避免應用與數據庫之間的多次通信開銷,每個事務被定義成一個存儲過程,因此事務只需一次通信往返。然而,VoltDB並不是只支持存儲過程,從1.1版本開始已經能夠支持來自JDBC、SQL命令行、HTTP/JSON、原生C++/PHP/C#/Node.js等等客戶端的SQL查詢。唯一的限制就是:VoltDB總是自動提交模式,不支持手動控制事務

Ø  數據訪問串行化:傳統數據庫在前面兩種阻塞等待的情況下,會切換執行其他事務,因此會導致很大的鎖(latching and locking)開銷。而一個VoltDB數據庫由許多內存計算引擎組成(叫做partition分區),每個分區都是數據和相關處理過程的集合。VoltDB在集羣內自動分發數據創建分區,每個分區內都是單線程的,從而避免了傳統數據庫對併發控制的開銷。

Ø  C++執行引擎:VoltDB使用原生C++代碼進行表數據的內存分配和SQL的執行,之所以核心不使用Java就是避免將表數據這種長時間存活的數據放置到JVM堆上,同時對內存使用進行更細粒度的控制。此外,像靜態的部署相關和schema相關的數據,儘管是在Java中管理,但也使用DirectByteBuffer分配到堆外內存。所以其實JVM堆只是用來分配事務相關的一些存活期很短的數據,這對於GC來說是合適的負載。

 

如果某個事務只涉及一個單一分區內的數據,則其處理流程如下圖所示:

2 擴展性架構

從架構上看,VoltDB屬於shared nothing架構,因此可以很容易地實現擴展,可以通過增加已存在結點的容量和性能實現垂直擴展,通過動態增加新結點實現水平擴展,而在這個過程中不需要修改任何數據庫schema和應用程序代碼。

 

同時,VoltDB不僅支持表分區,還支持表複製。對於大表,可以通過分區來提高性能。對於頻繁讀取的小表,可以通過複製來減少join。

 

這與分佈式緩存GemFire中的mirrored region和partitioned region的概念很像。在GemFire這,mirrored region包含全量數據,而partitioned region只包含分區數據。但不同的是,VoltDB是根據表的特點選擇複製或分區,而GemFire則通過mirrored region將其他分區數據抓取到一起形成全量的數據鏡像。

 

如果一個事務涉及多個分區的數據訪問,那麼其處理流程如下圖所示。一個結點會充當協調者(coordinator),負責分發任務給其他結點,並收集結果,完成任務。

3 高可用性

不像傳統RDBMS產品依賴第三方的HA解決方案,VoltDB提供三種HA能力:K-safety,網絡故障檢測,存活結點重連(rejoin)。

3.1 K-safety

當配置成K-safety時,VoltDB會自動地複製數據庫分區,K表示副本的個數。例如K=0時表示沒有副本,所以任何一個結點的故障都會導致整個數據庫集羣的停止服務。當K=1時表示有1個副本,即一共2份拷貝。要注意的是:VoltDB中的副本是可以讀寫的,而不是傳統的主從複製關係。

 

關於數據同步問題的解決,任何發生在複製分區上的操作都會發送給各個拷貝的結點去執行,來保證一致性。如果其中一個結點失敗,那麼數據庫會繼續發送這個操作給失敗的結點。因此在這一點上VoltDB與傳統數據庫有很大不同,不存在多主(multi-master)情況下的數據同步衝突問題。所以K-safety也叫做同步多主複製。

3.2 網絡故障檢測

當網絡發生故障時,VoltDB的結點彼此之間被物理隔離開,而認爲對方已經發生故障。那麼K-safety機制會使這兩側的結點繼續分別提供服務。如果不及時檢測到的話,這種“分離的大腦”(split brain)會導致嚴重的數據同步問題。因此,VoltDB會自動檢測網絡故障,立即評估出那一側結點應該繼續服務,並快照另一側的結點數據後停掉服務。當網絡故障解決時,可以直接使用下面將介紹到的存活結點重連技術將結點重新加入到集羣中。

3.3 存活結點重連

離線的VoltDB結點可以通過rejoin操作重新加入到集羣中。具體過程是:首先從兄弟結點獲得一份數據拷貝,當追趕上兄弟結點時,此存活結點就可以回到正常狀態,接受任務了。

4 持久化

儘管VoltDB的HA能夠降低當機概率,但故障還是偶爾會發生,而且DBA有時也要定期地停機維護。因此,VoltDB提供了高性能的快照和命令日誌(command log)來支持各種持久化需求。對於日誌,VoltDB支持同步和異步,以及刷新到磁盤的時間間隔等配置。

 

那command log與傳統的WAL(write-ahead log)有什麼區別呢?(待深入研究)

總結

但這樣也不代表VoltDB是萬能的,其設計和特性決定了其應用場景,VoltDB比較適合高頻率請求、短事務的應用,像金融、零售、Web2.0等,以及流式數據應用,像推薦引擎、實時廣告平臺、點擊流處理、欺詐交易檢測等。

參考資料

1 VoltDB Technical Overview

2 Using VoltDB

Debunking Myths about the VoltDB in-memory database

Impact of Java Garbage Collection on in-memory databases

Command logging vs. Write-ahead Logging

 

****************************************************************************************

 

VoltDB內存數據庫的十大FAQ

1. VoltDB是什麼?

->VoltDB是一家新型關係型分佈式內存數據庫管理系統,以解決OLTP爲初衷,正在不斷增加處理OLAP,提供BI的功能。VoltDB與傳統數據庫(如DB2,Oracle,MySQL等)最大的不同點就是,VoltDB把全部數據放在內存裏,並且可以scale out,運行在一個集羣上,集羣上的每個節點都可以執行部分數據處理任務。

VoltDB官網:http://voltdb.com/

 

2. VoltDB支持SQL嗎?支持Transaction嗎?

-> VoltDB支持大多數SQL語句,目前還在不斷增加對SQL的支持。VoltDB的單個SQL語句和Stored procedure都支持Transaction的所有ACID屬性,是一個完完全全的支持事務處理的系統。這點與key-value等系統等是有很大區別的。

VoltDB還支持JDBC,ODBC(soon)等接口,客戶端也支持語言C#,C++,Erlang,Go,Java,JSON,Node.js,PHP,Python,Ruby等。

 

3. VoltDB適用於什麼類型的應用?

->大數據領域可以分兩類:a)數據總量大,b)單個數據元小,但數據產生快,有大量高併發。VoltDB主要是來解決Big Data下面Fast Data的問題,同時也在增加處理大數據量的能力。因此,VoltDB更加適合OLTP類型的應用,可以有效提高數據庫高併發下的系統吞吐量,常見的應用有幾類:a)需要實時交互的大型多人在線遊戲,b)在線廣告業務,c)移動電信通訊業務,d)銀行或股票交易系統,e)在線商城(如淘寶,京東等),f)網絡實時監控或傳感器應用等

換句話講,任何需要strong consistency的高併發業務,都是VoltDB最擅長的。同時實時交互的BI和OLAP也是VoltDB很不錯的領域。當然如果你的數據規模是PB以上級別的OLAP話,就目前而言,那還是選擇基於Hadoop的分析系統比較合適。

 

4. VoltDB數據庫性是用什麼語言寫的?

VoltDB使用的語言大致分兩種,底層引擎是C/C++,上層的SQL語義處理,併發管理,分佈式集羣等任務都是Java。另外,還有些工具使用Python,JS等做的。

底層Engine的任務包括:數據存儲,內存管理及SQL具體執行的數據處理

 

5. VoltDB數據庫性能到底怎麼樣?

VoltDB的吞吐量很高,尤其是單位節點的吞吐量,應該是市面上數據庫系統最高的了。單臺家用筆記本上,也能跑出7,8萬TPS(transactions per second)。根據不同的筆記本性能,吞吐量也略有差別。

這裏推薦兩篇關於VoltDB性能的文章:

a)http://www.csdn.net/article/2013-04-11/2814850-877000-tps-with-erlang-and-voltdb :這是一家遊戲公司Eonblast Corporation的CEO自己用Erlang客戶端測VoltDB性能的博文,文中測試吞吐量的結果爲:87.7萬的TPS,完成了350萬的QPS。

b)http://voltdb.com/blog/voltdb-in-memory-database-achieves-best-in-class-results-running-in-the-cloud-on-the-ycsb-benchmark-3/:文中對比了YCSB benchmark在雲端的測量數據,結論是:VoltDB系統吞吐量可以根據集羣的節點數線性增長,Workload B用12個節點跑出72.4萬的TPS。要知道12年的MySQL和Cassandra在相似的機器上才跑出不到18萬的TPS,現在的VoltDB跑Key-Value的應用,性能是當時他們的4倍之多。

C)https://www.sgi.com/pdfs/4238.pdf:SGI公司對VoltDB性能做了測試:10個節點能跑出120萬的TPS,30個節點跑出了337萬的TPS。

 

6. VoltDB是內存數據庫,數據會不會容易丟失?如何實現高可用性?

數據庫中數據的安全,一定是最爲關鍵的問題。作爲內存數據庫,VoltDB有很多種科技手段來保證數據的可靠性。VoltDB已有不上金融領域的商業應用,這已經證明了內存數據庫VoltDB在數據可靠性上是沒問題的。

K-safety:VoltDB的數據是分區的,設定K-safety(即同步的分區拷貝數量)參數,可以確保整個集羣的穩定性。如果K設置爲1,每個分區都在集羣內有一個拷貝,如果有一臺機器當機了,整個VoltDB集羣可以正常運行。

Snapshot(快照):用戶可以根據應用設置snapshot的週期,VoltDB可以對數據做snapshot,然後將其寫入Disk,數據就永久性的存在了。如果意外當機,VoltDB可以根據磁盤上已有的snapshot文件,進行數據恢復操作。恢復數據速度很快,我自己測試的60多G的數據,完成恢復需要2分鐘左右。

Command Logging(命令日誌):這個功能是VoltDB特有的,和Snapshot一起使用,記錄了保存兩次snapshot之間所有寫(write)操作的日誌,是爲了確保不會有任何transaction丟失。讀操作(read)不改變數據,所以不被記錄。

Database Replication:這個是傳統數據庫已經有的功能了,就是在另一個地方,做一個完全一摸一樣的數據拷貝,如果主集羣不工作了(如集體斷電),立刻講服務切換到附屬集羣上去,通常附屬集羣要設立在一個物理範圍上不同的地區。

以上內容有免費的網上學習視頻,會英語的同學強烈推薦:http://voltdb.com/resources/volt-university/tutorials/section-1-6/

 

7. VoltDB是分佈式數據庫,有哪些特點?

VoltDB分佈式內存數據庫的性能,沒兩臺機器之間不共享任何內存和數據,可以完全看做獨立的兩臺機器,而只是用網絡連接在一起。VoltDB的性能可以線性增長,支持動態添加節點,節點自動恢復等功能。

動態添加節點:不同業務可能會有自己的高峯期,打個比方,如果不滿足現在3臺機器的性能(吞吐量),可以動態增加節點,提高數據庫服務器處理的性能。

節點自動恢復:如果集羣中一臺機器當機,K-safety參數設置大於或等於1,VoltDB依然可以正常運行。之後,等該機器維修好之後(當然也可換一臺新機器),可以動態再添加到集羣當中來。

 

8. 誰在使用VoltDB?VoltDB的客戶有哪些?

VoltDB的客戶數量在400多個,合作伙伴也有30個左右,其中包括惠普HP,雅虎這樣的大型IT公司。業務範圍也大多是之前提到的VoltDB比較擅長的領域,涉及fast data和高併發的應用。具體情況可以參考鏈接:

http://voltdb.com/about/customers/

http://voltdb.com/partners/voltdb-partners/

 

9. VoltDB是否開源?有哪些資料參考和學習?

VoltDB有開源版本,免費試用。同時也有商業版,包含有更多功能。下載需要到官網親自下載,例如數據恢復,command logging等功能是需要需要商業版的,商業版本有30天免費試用的。如果你是開發人員,希望研讀源代碼或者爲VoltDB做貢獻,GitHub的Wiki頁面上也有如何設置Java eclipse,進行開發。

開源版本下載地址:https://github.com/VoltDB/voltdb/releases

開源代碼在GitHub上:https://github.com/VoltDB/voltdb

VoltDB免費在線視頻學習課程(會英文的同學,強烈推薦學習):http://voltdb.com/resources/volt-university/tutorials/

VoltDB的JIRA系統:https://issues.voltdb.com/

VoltDB的社區論壇:https://forum.voltdb.com/

VoltDB的支持郵箱:有任何疑問都可以發到此郵箱 support at voltdb.com

 

10. VoltDB商業版本費用如何?

具體的收費規則,我不是很清楚,但我可以確定,一定比傳統大型數據庫Oracle,SQL Server,DB2啥的便宜好多,比起SAP HANA也要便宜好多好多。

具體情況可以發郵件到support at voltdb.com詢問,一定有人會回複相關問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章