「本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!」前端
1. HTAP數據庫背景及現狀
1.1 起源
- 大型實時分析應用的逐漸流行(實時庫存/訂價、欺詐檢測,風險分析,物聯網等);
- 這些系統須要一個分佈式的數據管理系統,要求能處理高併發的TP請求,同時支持對近期的數據進行分析;
- 有些應用甚至會在TP請求中進行AP操做;
- Gartner:即有事務又支持分析的系統叫HTAP;
- 實時分析:指的是實時交易過程當中的分析需求,不是數據時效性上的實時。
1.2 方案1:一套系統同時支持OLTP和OLAP
- 傳統的DBMS能夠在一套系統上支持TP和AP,但對這兩種業務場景都不高效;
- 基於內存的行存( VoltDB, Hekaton, MemSQL, Silo)和列存( MonetDB , Vertica , BLU , SAP HANA)系統,這些系統開始只是爲一個場景專門設計的,後來爲了支持HTAP增量了另外一場景的支持。
1.2.1 底層數據分開存儲
- SAP HANA 和 Oracle’s TimesTen 最初是爲OLAP專門設計的,同時也支持ACID事務操做;不過事務的數據時以行存方式支持的,而分析操做是經過列存支持的;
- MemSQL最初是爲in-memory OLTP設計的,後來也支持分析。對於TP數據是以行存方式存在內存中的,當數據須要寫到磁盤中時,會轉換成列存;
- IBM dashDB也是從傳統的行存向HTAP演進的系統。經過行列混合的方式來分別支持TP和AP;
- HyPer是從一開始就爲HTAP設計的,最初使用行存來同時支持TP和AP,不過如今也支持經過列存方式來更好的支持AP場景。
1.2.2 底層用一種方式存儲數據
- H2TAP,學術項目,以行存的方式同時支持TP和AP;
- Hive,SQL-on-hadoop的解決方案之一,AP系統,在0.13版本開始經過ORCFile支持事務,但主要的應用場景是維度表更新以及實時流數據攝取;
- Impala + kudu:支持SQL分析及數據的更新和刪除。
這類系統跟傳統DBMS面臨一樣的問題,沒辦法同時爲AP和TP進行優化。對於採用列存的系統,須要經過批量的方式來提升事務的吞吐能力;對於採用行存的系統,沒法實現最佳的分析效果。
1.3 方案2:兩套系統來組合來支持OLTP和OLAP
1.3.1 解耦AP和TP的底層存儲
現狀算法
- 須要用戶的應用程序本身來協調AP和TP系統的使用;
- 數據在兩個系統之間是經過ETL方式同步的;
- 這類方案在目前的大數據系統中很是常見,一般使用kv系統(如cassandra)來承載TP負載,而後將數據轉換成 Parquet or ORC 文件存儲到HDFS中,再使用SQL-on-hadoop方案進行數據分析。
1.3.2 AP和TP共享底層存儲
這類系統一般是使用Spark之類的系統,在原有數據上支持大規模分析的場景。因爲數據只有一份,所以AP分析的數據是實時數據。sql
- SAP HANA Vora:TP業務負載有vora直接支撐,而分析場景則經過Spark-SQL來支持;
- SnappyData:使用GemFire來承載TP業務,經過Spark生態來支持AP業務;
- HBase 和Cassandra等kv系統被普遍應用在須要實時更新的場景,而對這些數據的分析場景在經過組合SQL-on-Hadoop的解決方案來實現。TP和AP系統訪問的是同一份數據,這須要開發一些額外的擴展,以使得AP引擎能直接讀取TP存儲中的數據,好比Spark HBase connector,Spark Cassandra connector等。經過connector來進行AP分析一般很是慢;
- 另一些SQL-on-hadoop系統,使用HBase做爲支持快速更新的存儲引擎,如: HIVE, Impala, IBM Big SQL, and Actian VectorH。數據的處理是經過HBase的處理引擎來實現的;
- Splice Machine 、 Phoenix則是在HBase之上構建了SQL引擎;
- 基於HBase的AP系統,在處理AP任務時都比較慢,由於在HBase上執行Scan很是慢。HBase適合快速更新和點查的場景;
- Wildfire:IBM最近開發的一套HTAP系統,使用列存方式來同時支持AP和TP,使用的是Parquet格式。Wildfire能夠當即分析最近提交的更新,同時支持使用Spark生態來執行大規模並行分析任務,提交給SparkSQL的請求會被儘量的下沉到Wildfire引擎來進行數據處理。
1.4. 現狀總結
-
目前沒有一個系統支持true-HTAP;數據庫
- 大多數系統已經分別支持了AP請求和TP請求的處理,可是沒有系統支持在TP中執行AP的場景;
- 要支持真正的HTAP,須要支持在同一個請求中既有TP又有AP的場景。
-
目前大多數系統須要組合各類解決方案來達到HTAP場景的需求,這對用戶部署和維護系統帶來挑戰;後端
-
目前大多數TP系統爲了加速TP的更新和點查,將索引所有放在了內存中,可是對於更大規模數據的場景,索引所有在內存中會致使TP系統變慢,應當考慮一種僅保留部分索引在內存中的方案,以提升經常使用數據的訪問性能;markdown
-
爲AP場景設計的存儲引擎,一般使用對象存儲或者共享文件系統來存儲數據。這些存儲格式主要是爲scan場景進行優化,沒法提供高效的點查和更新能力。目前這仍是一個未解決的難題。數據結構
1.5. 設計HTAP系統要作的一些決策
- Query processing and ingestion engines(數據分析和數據攝取引擎)
- Storage options (存儲方式:一套存儲仍是混合存儲)
- Data organization (數據組織格式:行存仍是列存)
- Transactional semantics (事務語義)
- Recency of data being read by OLAP
- Indexing support(索引支持)
2. HTAP類數據庫分析
2.1 TiDB
2.1.1 TiSpark
所屬分類架構
- 兩套系統來組合來支持OLTP和OLAP(採用Spark生態)
- AP和TP共享底層存儲
TiSpark 是將 Spark SQL 直接運行在 TiDB 存儲引擎 TiKV 上的 OLAP 解決方案併發
- TiSpark 深度整合了 Spark Catalyst 引擎, 能夠對計算提供精確的控制,使 Spark 可以高效的讀取 TiKV 中的數據,提供索引支持以實現高速的點查
- 經過多種計算下推減小 Spark SQL 須要處理的數據大小,以加速查詢;利用 TiDB 的內建的統計信息選擇更優的查詢計劃
2.1.2 TiFlash
所屬分類app
技術實現
- TiFlash 基於列存和向量化分析引擎(Clickhouse)實現;
- TiFlash 做爲 TiDB 的另一個存儲層,經過raft learner從TiDB 複製數據,並保證數據的事務性;
- TiFlash目前不支持SQL直接寫數據,所以其角色目前不能成爲leader或者follower;
- TiFlash節點若是發生故障,須要從TP集羣從新同步數據;
- TiFlash做爲TiDB的擴展,屬於TiDB集羣的一部分;
- 經過全局時間戳來保證用戶從TiFlash中讀到的是最新的數據;
- 經過LSM-Tree來解決列存的更新帶來的寫放大問題;同時利用其局部有序性來解決AP場景對scan的需求;
- 能夠經過動態增減不一樣類型的節點來增減,TP或AP能力;
- TP節點和AP節點在系統層面有不一樣的標籤,當啓發式算法任務用戶下發的SQL是一個AP運算時,會將請求路由到AP節點上執行。在必定程度上隱藏了AP和TP的具體角色分配;
- 一條join語句的兩部分數,一份數據須要全表掃描、另外一份能夠利用索引,則能夠分別將這兩個子查詢調度到不一樣類型的節點上執行,一部分利用TiFlash的scan能力、一部分利用TiKV的點查能力。
後續計劃
- 支持SQL直接更新TiFlash中的數據
- TiFlash支持MPP,從而能夠將TiDB或TiSpark的一部分計算下推到TiFlash執行
- 從新設計TiFlash的存儲引擎,從而將性能提高2倍(目前TiSpark+TiFlash的性能,與Spark+Parquet的性能差很少)
TiKV
對應yugabyte的TabletServer(即DocDB),定位和實現框架幾乎差異不大,都是在實現一個支持事務的分佈式kv。TiKV是一個單獨的項目,更解耦(意味着性能要差)。
- 都是提供RPC接口
- 都是Raft
- 都是基於rocksdb
2.2 MemSQL
技術細節
所屬分類
- 一套系統同時支持OLTP和OLAP
- 底層數據分開存儲
技術實現
-
completely in-memory rowstore(行存,所有在內存中,爲TP/HTAP服務,主要針對實時場景)
-
disk-backed columnstore(數據寫到磁盤時,改爲列存,爲AP以及須要查詢大量歷史數據的HTAP應用服務)
-
一條查詢語句能夠同時查詢內存和磁盤中的數據
-
也支持內存沒法承載狀況下的OLTP任務(使用hash indexes)
-
主從複製模式,支持同步和異步。同步會致使寫延遲變高,異步複製則從節點數據落後一段時間
-
沒看到如何實現列數據的更新的(MemSQL開啓了列存的表不適合頻繁更新的場景<參考>)
-
MVCC + lock free 充分發揮內存的性能
- 每當事務修改一行時,MemSQL都會建立一個新版本,該版本位於現有版本之上。該版本僅對進行修改的事務可見。Read查詢訪問同一行,「查看」該行的舊版本;
- MemSQL僅在同一行發生寫-寫衝突的狀況下才使用鎖;
- MemSQL爲死鎖實現了鎖等待超時。默認值爲60秒;
- MemSQL將已修改的行排入垃圾收集器。經過避免全表掃描,垃圾收集器能夠很是有效地清理舊版本;
- MemSQL儘量將單行更新查詢優化爲簡單的原子操做;
-
skip list 代替btree,以提供更好的擴展性(skip list能夠實現lock free訪問,更適合純內存場景)
-
code gen,提升SQL查詢性能
- 將SQL編譯成C++代碼,而後用GCC編譯成native code,動態加載到MEMSQL進程。該過程是在SQL首次執行時進行的,而且編譯後的代碼重啓後仍舊有效;
- 編譯後的結果會被存儲到hash表中,下次若是有相同模式的sql請求,直接使用編譯後的代碼執行。
-
CPU效率意味着更高的吞吐量。因爲MemSQL每一個查詢使用較少的指令,所以它們能夠實現更高的吞吐量
-
無鎖數據結構擴展性好,同時也減小了數據爭用期間致使的CPU浪費。MemSQL引擎的每一個組件都創建在無鎖的數據結構上:鏈表,隊列,堆棧,跳錶和哈希表
-
內存數據持久化:定時快照+WAL
- 事務首先提交到內存緩衝區中,而後異步開始寫入磁盤。日誌刷新器線程每隔幾毫秒將事務刷新到磁盤一次,經過批量提交來提升磁盤IO吞吐;
- 當日志文件達到已經大小時(2G),會壓縮成快照。快照更緊湊、恢復更快;
- MemSQL徹底避免了頁面交換,而且能夠保證在讀/寫查詢上具備一致的高吞吐量SLA。MemSQL中的任何讀取查詢都不會等待磁盤。此屬性對於對數TB的數據進行實時分析掃描極爲重要。
-
Aggregator:專門的聚合節點,相似Gateway,負責接收用戶的查詢請求,將請求調度到leaf節點,對查詢結果進行聚合,返回最終結果給客戶端。根據系統負載,能夠配置任意數量的Aggregator節點
-
對於開啓了列存的表,數據也會先寫到內存中的面向行的skip list中,而後批量往列存中刷;只要數據寫到內存skip list中,對客戶端就是可見的
特性&定位
- 支持從各類數據源(文件、kafka、數據庫、S三、HDFS)load數據
- 能夠在一條語句中對實時數據和歷史數據進行操做
- Full SQL. MemSQL supports full SQL and transactional semantics.
- 只支持READ COMMITTED隔離級別
- 支持冗餘和持久化
- 面向高併發、高吞吐、小事務的場景
- 面向須要使用MEMSQL賺錢的場景:由於純內存架構比較昂貴
- 解決實時需求,能回答當前正在發生什麼事情的場景
- 提供實時分析功能,如:min、max、distinct、average
- 不是和BI場景
- Write-heavy, read-heavy workloads:Machine data、Traffic spikes、Streaming data
2.3 HyPer
簡介
HyPer最開始是一個學術項目,產出了很多最新的研究成果。目前已經被收購。
3. 其餘數據庫
-
kudu
- HTAP: 放棄事務,只保留TP系統的高性能點查、插入特性;列存:提升OLAP的性能
參考資料
Hybrid Transactional and Analytical Processing - A Survey
blog.csdn.net/tidb_pingca…
blog.csdn.net/TiDB_PingCA…
docs.memsql.com
www.hyper-db.de/
www.memfiredb.com