<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                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來說是合適的負載。 如果某個事務只涉及一個單一分區內的數據,則其處理流程如下圖所示: ![](https://box.kancloud.cn/2016-08-31_57c6b138397b0.jpg) ### 2?擴展性架構 從架構上看,VoltDB屬于shared nothing架構,因此可以很容易地實現擴展,可以通過增加已存在結點的容量和性能實現垂直擴展,通過動態增加新結點實現水平擴展,而在這個過程中不需要修改任何數據庫schema和應用程序代碼。 同時,VoltDB不僅支持表分區,還支持表復制。對于大表,可以通過分區來提高性能。對于頻繁讀取的小表,可以通過復制來減少join。 ![](https://box.kancloud.cn/2016-08-31_57c6b13853d91.jpg) 這與分布式緩存GemFire中的mirrored region和partitioned region的概念很像。在GemFire這,mirrored region包含全量數據,而partitioned region只包含分區數據。但不同的是,VoltDB是根據表的特點選擇復制或分區,而GemFire則通過mirrored region將其他分區數據抓取到一起形成全量的數據鏡像。 ![](https://box.kancloud.cn/2016-08-31_57c6b138686e2.jpg) 如果一個事務涉及多個分區的數據訪問,那么其處理流程如下圖所示。一個結點會充當協調者(coordinator),負責分發任務給其他結點,并收集結果,完成任務。 ![](https://box.kancloud.cn/2016-08-31_57c6b1387e062.jpg) ### 3?高可用性 不像傳統RDBMS產品依賴第三方的HA解決方案,VoltDB提供三種HA能力:K-safety,網絡故障檢測,存活結點重連(rejoin)。 ### 3.1 K-safety 當配置成K-safety時,VoltDB會自動地復制數據庫分區,K表示副本的個數。例如K=0時表示沒有副本,所以任何一個結點的故障都會導致整個數據庫集群的停止服務。當K=1時表示有1個副本,即一共2份拷貝。要注意的是:VoltDB中的副本是可以讀寫的,而不是傳統的主從復制關系。 ![](https://box.kancloud.cn/2016-08-31_57c6b13893699.jpg) 關于數據同步問題的解決,**任何發生在復制分區上的操作都會發送給各個拷貝的結點去執行**,來保證一致性。如果其中一個結點失敗,那么數據庫會繼續發送這個操作給失敗的結點。因此在這一點上VoltDB與傳統數據庫有很大不同,不存在多主(multi-master)情況下的數據同步沖突問題。所以K-safety也叫做同步多主復制。 ### 3.2?網絡故障檢測 當網絡發生故障時,VoltDB的結點彼此之間被物理隔離開,而認為對方已經發生故障。那么K-safety機制會使這兩側的結點繼續分別提供服務。如果不及時檢測到的話,這種“分離的大腦”(split brain)會導致嚴重的數據同步問題。因此,VoltDB會自動檢測網絡故障,立即評估出那一側結點應該繼續服務,并快照另一側的結點數據后停掉服務。當網絡故障解決時,可以直接使用下面將介紹到的存活結點重連技術將結點重新加入到集群中。 ![](https://box.kancloud.cn/2016-08-31_57c6b138a7279.jpg) ### 3.3?存活結點重連 離線的VoltDB結點可以通過rejoin操作重新加入到集群中。具體過程是:首先從兄弟結點獲得一份數據拷貝,當追趕上兄弟結點時,此存活結點就可以回到正常狀態,接受任務了。 ### 4?持久化 盡管VoltDB的HA能夠降低當機概率,但故障還是偶爾會發生,而且DBA有時也要定期地停機維護。因此,VoltDB提供了高性能的快照和命令日志(command log)來支持各種持久化需求。對于日志,VoltDB支持同步和異步,以及刷新到磁盤的時間間隔等配置。 ![](https://box.kancloud.cn/2016-08-31_57c6b138c0aac.jpg) 那command log與傳統的WAL(write-ahead log)有什么區別呢?(待深入研究) ![](https://box.kancloud.cn/2016-08-31_57c6b138d4e88.jpg) ### 總結 但這樣也不代表VoltDB是萬能的,其設計和特性決定了其應用場景,VoltDB比較適合高頻率請求、短事務的應用,像金融、零售、Web2.0等,以及流式數據應用,像推薦引擎、實時廣告平臺、點擊流處理、欺詐交易檢測等。 ### 參考資料 1 VoltDB Technical Overview 2 Using VoltDB 3?[Debunking Myths about the VoltDB in-memory database](http://voltdb.com/blog/debunking-myths-about-voltdb-memory-database) 4?[Impact of Java Garbage Collection on in-memory databases](http://voltdb.com/blog/impact-java-garbage-collection-memory-databases) 5?[Command logging vs. Write-ahead Logging](http://stackoverflow.com/questions/14181180/why-do-sql-databases-use-a-write-ahead-log-over-a-command-log)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看