NewSQL数据库VoltDB特性简介
VoltDB是一個(gè)革命性的新型數(shù)據(jù)庫產(chǎn)品,被稱作NewSQL數(shù)據(jù)庫。它基于H-Store,號(hào)稱比當(dāng)前數(shù)據(jù)庫產(chǎn)品的吞吐量高45倍,同時(shí)又具有很高的擴(kuò)展性。它的特性主要有以下幾點(diǎn):
???高吞吐、低延遲:通過內(nèi)存計(jì)算,存儲(chǔ)過程和串行數(shù)據(jù)訪問實(shí)現(xiàn)。
???可擴(kuò)展性:自動(dòng)分區(qū)和復(fù)制,保證性能和可擴(kuò)展性。
???高可用性:同步的多主復(fù)制(在VoltDB中叫K-safety)。
???持久化:數(shù)據(jù)庫快照與命令日志(command log)的創(chuàng)新技術(shù)組合。
1?高吞吐、低延遲
VoltDB能夠提供高吞吐、低延遲的SQL操作,總體來說,它是通過內(nèi)存計(jì)算避免磁盤阻塞(disk stall),通過存儲(chǔ)過程避免用戶阻塞(user stall),通過集群結(jié)點(diǎn)內(nèi)的數(shù)據(jù)訪問串行化,避免傳統(tǒng)數(shù)據(jù)庫鎖、緩沖管理的開銷。此外,VoltDB并不是純Java開發(fā),其SQL執(zhí)行引擎是C++寫成的,所以并不受GC暫停的影響。
???內(nèi)存計(jì)算:使VoltDB在事務(wù)執(zhí)行期間無需等待磁盤加載,避免磁盤I/O開銷。充分利用了現(xiàn)代服務(wù)器上龐大的內(nèi)存,將吞吐量最大化。
???存儲(chǔ)過程:避免應(yīng)用與數(shù)據(jù)庫之間的多次通信開銷,每個(gè)事務(wù)被定義成一個(gè)存儲(chǔ)過程,因此事務(wù)只需一次通信往返。然而,VoltDB并不是只支持存儲(chǔ)過程,從1.1版本開始已經(jīng)能夠支持來自JDBC、SQL命令行、HTTP/JSON、原生C++/PHP/C#/Node.js等等客戶端的SQL查詢。唯一的限制就是:VoltDB總是自動(dòng)提交模式,不支持手動(dòng)控制事務(wù)。
???數(shù)據(jù)訪問串行化:傳統(tǒng)數(shù)據(jù)庫在前面兩種阻塞等待的情況下,會(huì)切換執(zhí)行其他事務(wù),因此會(huì)導(dǎo)致很大的鎖(latching and locking)開銷。而一個(gè)VoltDB數(shù)據(jù)庫由許多內(nèi)存計(jì)算引擎組成(叫做partition分區(qū)),每個(gè)分區(qū)都是數(shù)據(jù)和相關(guān)處理過程的集合。VoltDB在集群內(nèi)自動(dòng)分發(fā)數(shù)據(jù)創(chuàng)建分區(qū),每個(gè)分區(qū)內(nèi)都是單線程的,從而避免了傳統(tǒng)數(shù)據(jù)庫對(duì)并發(fā)控制的開銷。
???C++執(zhí)行引擎:VoltDB使用原生C++代碼進(jìn)行表數(shù)據(jù)的內(nèi)存分配和SQL的執(zhí)行,之所以核心不使用Java就是避免將表數(shù)據(jù)這種長(zhǎng)時(shí)間存活的數(shù)據(jù)放置到JVM堆上,同時(shí)對(duì)內(nèi)存使用進(jìn)行更細(xì)粒度的控制。此外,像靜態(tài)的部署相關(guān)和schema相關(guān)的數(shù)據(jù),盡管是在Java中管理,但也使用DirectByteBuffer分配到堆外內(nèi)存。所以其實(shí)JVM堆只是用來分配事務(wù)相關(guān)的一些存活期很短的數(shù)據(jù),這對(duì)于GC來說是合適的負(fù)載。
?
如果某個(gè)事務(wù)只涉及一個(gè)單一分區(qū)內(nèi)的數(shù)據(jù),則其處理流程如下圖所示:
2?擴(kuò)展性架構(gòu)
從架構(gòu)上看,VoltDB屬于shared nothing架構(gòu),因此可以很容易地實(shí)現(xiàn)擴(kuò)展,可以通過增加已存在結(jié)點(diǎn)的容量和性能實(shí)現(xiàn)垂直擴(kuò)展,通過動(dòng)態(tài)增加新結(jié)點(diǎn)實(shí)現(xiàn)水平擴(kuò)展,而在這個(gè)過程中不需要修改任何數(shù)據(jù)庫schema和應(yīng)用程序代碼。
?
同時(shí),VoltDB不僅支持表分區(qū),還支持表復(fù)制。對(duì)于大表,可以通過分區(qū)來提高性能。對(duì)于頻繁讀取的小表,可以通過復(fù)制來減少join。
?
這與分布式緩存GemFire中的mirrored region和partitioned region的概念很像。在GemFire這,mirrored region包含全量數(shù)據(jù),而partitioned region只包含分區(qū)數(shù)據(jù)。但不同的是,VoltDB是根據(jù)表的特點(diǎn)選擇復(fù)制或分區(qū),而GemFire則通過mirrored region將其他分區(qū)數(shù)據(jù)抓取到一起形成全量的數(shù)據(jù)鏡像。
?
如果一個(gè)事務(wù)涉及多個(gè)分區(qū)的數(shù)據(jù)訪問,那么其處理流程如下圖所示。一個(gè)結(jié)點(diǎn)會(huì)充當(dāng)協(xié)調(diào)者(coordinator),負(fù)責(zé)分發(fā)任務(wù)給其他結(jié)點(diǎn),并收集結(jié)果,完成任務(wù)。
3?高可用性
不像傳統(tǒng)RDBMS產(chǎn)品依賴第三方的HA解決方案,VoltDB提供三種HA能力:K-safety,網(wǎng)絡(luò)故障檢測(cè),存活結(jié)點(diǎn)重連(rejoin)。
3.1 K-safety
當(dāng)配置成K-safety時(shí),VoltDB會(huì)自動(dòng)地復(fù)制數(shù)據(jù)庫分區(qū),K表示副本的個(gè)數(shù)。例如K=0時(shí)表示沒有副本,所以任何一個(gè)結(jié)點(diǎn)的故障都會(huì)導(dǎo)致整個(gè)數(shù)據(jù)庫集群的停止服務(wù)。當(dāng)K=1時(shí)表示有1個(gè)副本,即一共2份拷貝。要注意的是:VoltDB中的副本是可以讀寫的,而不是傳統(tǒng)的主從復(fù)制關(guān)系。
?
關(guān)于數(shù)據(jù)同步問題的解決,任何發(fā)生在復(fù)制分區(qū)上的操作都會(huì)發(fā)送給各個(gè)拷貝的結(jié)點(diǎn)去執(zhí)行,來保證一致性。如果其中一個(gè)結(jié)點(diǎn)失敗,那么數(shù)據(jù)庫會(huì)繼續(xù)發(fā)送這個(gè)操作給失敗的結(jié)點(diǎn)。因此在這一點(diǎn)上VoltDB與傳統(tǒng)數(shù)據(jù)庫有很大不同,不存在多主(multi-master)情況下的數(shù)據(jù)同步?jīng)_突問題。所以K-safety也叫做同步多主復(fù)制。
3.2?網(wǎng)絡(luò)故障檢測(cè)
當(dāng)網(wǎng)絡(luò)發(fā)生故障時(shí),VoltDB的結(jié)點(diǎn)彼此之間被物理隔離開,而認(rèn)為對(duì)方已經(jīng)發(fā)生故障。那么K-safety機(jī)制會(huì)使這兩側(cè)的結(jié)點(diǎn)繼續(xù)分別提供服務(wù)。如果不及時(shí)檢測(cè)到的話,這種“分離的大腦”(split brain)會(huì)導(dǎo)致嚴(yán)重的數(shù)據(jù)同步問題。因此,VoltDB會(huì)自動(dòng)檢測(cè)網(wǎng)絡(luò)故障,立即評(píng)估出那一側(cè)結(jié)點(diǎn)應(yīng)該繼續(xù)服務(wù),并快照另一側(cè)的結(jié)點(diǎn)數(shù)據(jù)后停掉服務(wù)。當(dāng)網(wǎng)絡(luò)故障解決時(shí),可以直接使用下面將介紹到的存活結(jié)點(diǎn)重連技術(shù)將結(jié)點(diǎn)重新加入到集群中。
3.3?存活結(jié)點(diǎn)重連
離線的VoltDB結(jié)點(diǎn)可以通過rejoin操作重新加入到集群中。具體過程是:首先從兄弟結(jié)點(diǎn)獲得一份數(shù)據(jù)拷貝,當(dāng)追趕上兄弟結(jié)點(diǎn)時(shí),此存活結(jié)點(diǎn)就可以回到正常狀態(tài),接受任務(wù)了。
4?持久化
盡管VoltDB的HA能夠降低當(dāng)機(jī)概率,但故障還是偶爾會(huì)發(fā)生,而且DBA有時(shí)也要定期地停機(jī)維護(hù)。因此,VoltDB提供了高性能的快照和命令日志(command log)來支持各種持久化需求。對(duì)于日志,VoltDB支持同步和異步,以及刷新到磁盤的時(shí)間間隔等配置。
?
那command log與傳統(tǒng)的WAL(write-ahead log)有什么區(qū)別呢?(待深入研究)
總結(jié)
但這樣也不代表VoltDB是萬能的,其設(shè)計(jì)和特性決定了其應(yīng)用場(chǎng)景,VoltDB比較適合高頻率請(qǐng)求、短事務(wù)的應(yīng)用,像金融、零售、Web2.0等,以及流式數(shù)據(jù)應(yīng)用,像推薦引擎、實(shí)時(shí)廣告平臺(tái)、點(diǎn)擊流處理、欺詐交易檢測(cè)等。
參考資料
1 VoltDB Technical Overview
2 Using VoltDB
3?Debunking Myths about the VoltDB in-memory database
4?Impact of Java Garbage Collection on in-memory databases
5?Command logging vs. Write-ahead Logging
?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaomaohai/p/6157666.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的NewSQL数据库VoltDB特性简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode】69. Sqrt(x
- 下一篇: WINIO64位模拟键鼠操作