來源:https://www.sohu.com/a/230384121_411876

作者介紹

王磊(Ivan),現任光大銀行科技部數據領域架構師,曾任職於IBM全球諮詢服務部從事技術諮詢工作,具有十餘年數據領域研發及諮詢經驗。目前負責全行數據領域系統的日常架構設計、評審及內部研發等工作,對分佈式數據庫、Hadoop等基礎架構研究有濃厚興趣。個人公衆號:金融數士。

隨着大規模互聯網應用的廣泛出現,分佈式數據庫成爲近兩年的一個熱門話題。同樣,在銀行業主推X86限制主機與小型機的背景下,傳統的單機數據庫逐漸出現了一些瓶頸,馬上會面臨是否引入分佈式數據庫的問題。

近期,我在個人公衆號就“銀行引入分佈式數據庫的必要性”做過一些展望,並收到了一些朋友的反饋,除了對分佈式數據庫具體技術探討外,還有一類很有趣的建議,“能不能也講講Teradata、Greenplum這類MPP,這些也是分佈式數據庫,但老闆總是認爲OLTP場景下的纔算數”。

的確,爲了解決OLAP場景需求,其實很早就出現了分佈式架構的產品和解決方案,其與目前的OLTP方案有很多共通的地方。而且我相信,今後OLAP和OLTP兩個分支技術的發展也必然是交錯前行,可以相互借鑑的。

鑑於此,本文會將OLAP類場景的分佈式數據也納入進來,從兩個維度對“分佈式數據庫”進行拆解,第一部分會橫向談談不同的“分佈式數據庫”,把它們分爲五類並對其中OLAP場景的三類做概要分析;第二部分結合NoSQL與NewSQL的差異,縱向來談談OLTP場景“分佈式數據庫”實現方案的關鍵技術要點,是前文的延伸,也是分佈式數據庫專題文章的一個總綱,其中的要點也都會單獨撰文闡述。

首先,我們從橫向談談不同的“分佈式數據庫”:

一、萬法同宗RDBMS

1990年代開始,關係型數據庫(RDBMS)成爲主流,典型的產品包括Sybase、Oracle、DB2等,同期大約也是國內IT產業的起步階段。RDBMS的基本特徵已有學術上的定義,這裏不再贅述。

但從實際應用的角度看,我認爲有兩點最受關注:

內部以關係模型存儲數據,對外支持ANSI SQL接口;

支持事務管理ACID特性,尤其是強一致性(指事務內的修改要麼全部失敗要麼全部成功,不會出現中間狀態)。

而後出現的各種“分佈式數據庫”,大多都是在這兩點上做權衡以交換其他方面的能力。

“數據庫”雖然有經典定義,但很多大數據產品或許是爲了標榜對傳統數據庫部分功能的替代作用,也借用了“數據庫”的名號,導致在實踐中這個概念被不斷放大,邊界越來越模糊。本文一個目標是要釐清這些產品與經典數據庫的差異與傳承,所以不妨先弱化“數據庫”,將其放大爲“數據存儲”。

那麼怎樣纔算是“分佈式數據存儲”系統?

“分佈式”是一種架構風格,用其實現“數據存儲”,最現實的目的是爲了打開數據庫產品的性能天花板,並保證系統的高可靠,進一步展開,“分佈式數據庫”的必要條件有兩點:

支持水平擴展,保證高性能

通過增加機器節點的方式提升系統整體處理能力,擺脫對專用設備的依賴,並且突破專用設備方案的性能上限。這裏的機器節點,通常是要支持X86服務器。

廉價設備+軟件,保證高可靠

在單機可靠性較低的前提下,依靠軟件保證系統整體的高可靠,又可以細分爲“數據存儲的高可靠”和“服務的高可靠”。總之,任何單點的故障,可能會帶來短時間、局部的服務水平下降,但不會影響系統整體的正常運轉。

將這兩點作爲“分佈式數據庫”的必要條件,我大致歸納了一下,至少有五種不同的“分佈式數據庫”:

NoSQL

NewSQL

MPP

Hadoop技術生態

Like-Mesa

注:也許有些同學會提到Kafka、Zookeeper等,這些雖然也是分佈式數據存儲,但因爲具有鮮明的特點和適用場景,無需再納入“數據庫”概念進行探討。

這五類中,前兩類以支持OLTP場景爲主,後三類則以OLAP場景爲主。我將按照時間線,主要對OLAP場景下的三類進行概要分析。

二、OLAP場景下的分佈式數據庫

1990-2000年代,隨着應用系統廣泛建設與深入使用,數據規模越來越大,國內銀行業的“全國大集中”基本都是在這個階段完成。這期間,RDBMS得到了廣泛運用,Oracle也擊敗Sybase成爲數據庫領域的王者。

在滿足了基本的交易場景後,數據得到了累積,進一步的分析性需求自然就湧現了出來。單一數據庫內同時支持聯機交易和分析需求存在很多問題,往往會造成對聯機交易的幹擾,因此需要新的解決方案。這就爲MPP崛起提供了機會。

1MPP

MPP(Massively Parallel Processing)是指多個處理器(或獨立的計算機)並行處理一組協同計算[1]。

爲了保證各節點的獨立計算能力,MPP數據庫通常採用ShareNothing架構,最爲典型的產品是Teradata(簡稱TD),後來也出現Greenplum(簡稱GPDB)、Vertica、Netezza等競爭者。

架構特點:

MPP是多機可水平擴展的架構,符合“分佈式”的基本要求,其中TD採用外置集中存儲而GPDB直接使用本地磁盤,從這點來說GPDB是更徹底的Share Nothing架構。

考慮到TD商業策略上採用一體機方案,不具有開放性,而GPDB具有較高的開源程度,下文中通過分析後者架構特點來分析MPP工作機制。

GPDB屬於主從架構[2],Slave稱爲Segment是主要的數據加工節點,是在PostgreSQL基礎上的封裝和修改,天然具備事務處理的能力,可進行水平擴展;集羣內有唯一Active狀態的Master節點,除了元數據存儲和調度功能外,同時承擔一定的工作負載,即所有外部對集羣的數據聯機訪問都要經過Master節點。

在高可靠設計方面,首先設置了Standby Master節點,在Master節點宕機時接管其任務,其次將Segment節點則細分爲兩類不同角色Primary和Mirror,後者是前者的備節點,數據提交時在兩者間進行強同步,以此保證Primary宕機時,Mirror可以被調度起來接替前者的任務。

從架構特點到功能缺陷,重新認識分析型分佈式數據庫

數據分析性需求對IT能力的要求包括:

複雜查詢能力;

批量數據處理;

一定的併發訪問能力。

MPP較好的實現了對上述能力的支撐,在前大數據時代得到了廣泛的應用,但這個時期的數據總量相對仍然有限,普遍在TB級別,對應的集羣規模也通常在單集羣百節點以下。

隨着數據價值關注度的不斷提升,越來越多的數據被納入企業分析範圍;同時實際應用中考慮到數據存儲和傳輸成本,往往傾向於將數據集中在一個或少數幾個集羣中,這樣推動了集羣規模的快速增長。

在大規模集羣(幾百至上千)的使用上,MPP從批處理和聯機訪問兩個方面都顯現了一些不足。以下內容主要借鑑了Pivotal(GPDB原廠)的一篇官方博客[3]。

注:有位同學給出的譯文也具有較好的質量,推薦閱讀[4]。

缺陷:

批處理

MPP架構下,工作負載節點(對GPDB而言是Segment節點)是完全對稱的,數據均勻的存儲在這些節點,處理過程中每個節點(即該節點上的Executor)使用本地的CPU、內存和磁盤等資源完成本地的數據加工。這個架構雖然提供了較好的擴展性,但隱藏了極大的問題——Straggler,即當某個節點出現問題導致速度比其他節點慢時,該節點會成爲Straggler。

此時,無論集羣規模多大,批處理的整體執行速度都由Straggler決定,其他節點上的任務執行完畢後則進入空閒狀態等待Straggler,而無法分擔其工作。導致節點處理速度降低的原因多數是磁盤等硬件損壞,考慮到磁盤本身的一定故障率(根據Google統計前三個月內2%損壞率,第二年時達到8%)當集羣規模達到一定程度時,故障會頻繁出現使straggler成爲一個常規問題。

併發

由於MPP的“完全對稱性”,即當查詢開始執行時,每個節點都在並行的執行完全相同的任務,這意味着MPP支持的併發數和集羣的節點數完全無關。根據該文中的測試數據,4個節點的集羣和400個節點的集羣支持的併發查詢數是相同的,隨着併發數增加,這二者幾乎在相同的時點出現性能驟降。

傳統MPP的聯機查詢主要面向企業管理層的少數用戶,對併發能力的要求較低。而在大數據時代,數據的使用者從戰略管理層轉向戰術執行層乃至一線人員,從孤立的分析場景轉向與業務交易場景的融合。對於聯機查詢的併發能力已經遠超MPP時代,成爲OLAP場景分佈式數據庫要考慮的一個重要問題。

除上述兩點以外,GPDB架構中的Master節點承擔了一定的工作負載,所有聯機查詢的數據流都要經過該節點,這樣Master也存在一定的性能瓶頸。同時,在實踐中GPDB對數據庫連接數量的管理也是非常謹慎的。在我曾參與的項目中,Pivotal專家給出了一個建議的最大值且不會隨着集羣規模擴大而增大。

綜上,大致可以得出結論,MPP(至少是GPDB)在集羣規模上是存在一定限制的。

2000-2010年代,大多數股份制以上銀行和少部分城商行都建立了數據倉庫或ODS系統,主要採用了MPP產品。可以說,這十餘年是MPP產品最輝煌的時代。到目前爲止,MPP仍然是銀行業建設數據倉庫和數據集市類系統的主要技術選擇。爲了規避MPP併發訪問上的缺陷以及批量任務對聯機查詢的影響,通常會將數據按照應用粒度拆分到不同的單體OLTP數據庫中以支持聯機查詢。

2Hadoop生態體系

MPP在相當長的一段時期內等同於一體機方案(以TD爲代表),其價格高昂到普通企業無法承受,多數在銀行、電信等行業的頭部企業中使用。2010年代,隨着大數據時代的開啓,Hadoop生態體系以開源優勢,獲得了蓬勃發展和快速普及。

Hadoop技術體系大大降低了數據分析類系統的建設成本,數據分析挖掘等工作由此步入“數據民主化”時代。在Hadoop生態體系中,分析需求所需要的能力被拆分爲批量加工和聯機訪問,通過不同的組件搭配實現。批量加工以MapReduce、Tez、Spark等爲執行引擎,爲了獲得友好的語義支持,又增加了Hive、SparkSQL等組件提供SQL訪問接口。

聯機訪問部分,則從早期Hive過渡到Impala、Hawk以及Kylin、Presto等方案逐漸降低了訪問延時。

架構特點:

Hadoop生態體系下HDFS、Spark、Hive等組件已經有很多文章介紹,本文不再贅述。總的來說,其架構的着力點在於數據高吞吐處理能力,在事務方面相較MPP更簡化,僅提供粗粒度的事務管理。

缺陷:

Hadoop也有其明顯的缺陷,主要是三點:

批量加工效率較低

MPP的擁護者往往會詬病Hadoop計算引擎執行效率低。的確,在同等規模的集羣執行相同的數據加工邏輯,即使與Spark對比,MPP所耗費的時間也會明顯更少些[3],其主要的原因在於兩者對於數據在磁盤和內存中的組織形式不同。

MPP從RDBMS而來(例如Vertica和GPDB都是基於PostgreSQL開發),對數據的組織形式更貼近傳統方式,按區、段、塊等單位組織,對數據進行了預處理工作以提升使用時的效率;Hadoop生態體系以HDFS文件存儲爲基礎,HDFS並不像傳統數據庫那樣獨立管理一塊連續的磁盤空間,而是將數據表直接映射成不同的數據文件,甚至表分區也以目錄、文件等方式體現。

HDFS最簡單的txt格式乾脆就是平鋪的數據文件,處理過程難免要簡單粗暴一些,但隨着Avro、ORCFile、Parquet等很多新的存儲格式相繼被引入,基於HDFS的批處理也更加精細。從整體架構來看,Hadoop更加看重大數據量批量處理的吞吐能力。

同時,Hadoop具備MPP所缺失的批量任務調整能力,數據的多副本存儲使其具有更多“本地化”數據加工的備選節點,而且數據加工處理與數據存儲並不綁定,可以根據節點的運行效率動態調整任務分佈,從而在大規模部署的情況下具有整體上更穩定的效率。相比之下,MPP在相對較小的數據量下具有更好的執行效率。

不能無縫銜接EDW實施方法論

在長期的實踐中,企業級市場的主流集成商針對EDW項目沉澱了一套固定的實施方法,與MPP特性相匹配,但Hadoop並不能與之無縫對接。一個最典型的例子是歷史數據的存儲,傳統方法是採用“拉鍊表”的形式,即對於當前有效的數據會記錄其生效的起始時間,在數據被更改或刪除後,在該行記錄的另外一列記錄失效時間。這樣,當前數據即變更爲歷史數據,通過這種增量的表述方式,節省了大量的存儲空間和磁盤IO。

從架構特點到功能缺陷,重新認識分析型分佈式數據庫

可以看出,拉鍊表的設計思想其實與基於時間戳的MVCC機制是相同的。

HDFS作爲Hadoop的存儲基礎,其本身不提供Update操作,這樣所有在數據操作層面的Update最終會被轉換爲文件層面的Delete和Insert操作,效率上顯著降低。據我所知,在很多企業實踐中會將這種增量存儲轉換爲全量存儲,帶來大量數據冗餘的同時,也造成實施方法上的變更。

聯機查詢併發能力不足

對於聯機查詢場景,最常見的是SQL on Hadoop方案,將Impala、HAWQ等MPP引擎架設在HDFS基礎上,批量數據與聯機查詢共用一份數據。MPP引擎借鑑了MPP數據庫的設計經驗,相對Hive等組件提供了更低的延遲。但存在一個與MPP相同的問題,即併發能力不足。

通過一些項目測試中,我發現在大體相同的數據量和查詢邏輯情況下, Impala併發會低於GPDB。其原因可能是多方面的,不排除存在一些調優空間,但在系統架構層面也有值得探討的內容。例如在元數據讀取上,Impala複用了Hive MetaStore,但後者提供的訪問服務延時相對較長,這也限制了Impala的併發能力[7]。

3Like-Mesa

Mesa是Google開發的近實時分析型數據倉庫,2014年發佈了論文披露其設計思想[5],其通過預聚合合併Delta文件等方式減少查詢的計算量,提升了併發能力。

Mesa充分利用了現有的Google技術組件,使用BigTable來存儲所有持久化的元數據,使用了Colossus (Google的分佈式文件系統)來存儲數據文件,使用MapReduce來處理連續的數據。

從架構特點到功能缺陷,重新認識分析型分佈式數據庫

Mesa相關的開源產品爲Clickhouse[6](2016年Yandex開源)和Palo[7](2017年百度開源)。

特點:

目前ClickHouse的資料仍以俄語社區爲主,爲便於大家理解和進一步研究,下面主要以Palo爲例進行說明。

Palo沒有完全照搬Mesa的架構設計的思路,其藉助了Hadoop的批量處理能力,但將加工結果導入到了Palo自身存儲,專注於聯機查詢場景,在聯機查詢部分主要借鑑了Impala技術。同時Palo沒有複用已有的分佈式文件系統和類BigTable系統,而是設計了獨立的分佈式存儲引擎。雖然數據存儲上付出了一定的冗餘,但在聯機查詢的低延遲、高併發兩方面都得到了很大的改善。

Palo在事務管理上與Hadoop體系類似,數據更新的原子粒度最小爲一個數據加載批次,可以保證多表數據更新的一致性。

整體架構由Frontend和Backend兩部分組成,查詢編譯、查詢執行協調器和存儲引擎目錄管理被集成到Frontend;查詢執行器和數據存儲被集成到Backend。Frontend負載較輕,通常配置下,幾個節點即可滿足要求;而Backend作爲工作負載節點會大幅擴展到幾十至上百節點。數據處理部分與Mesa相同採用了物化Rollup(上卷表)的方式實現預計算。

從架構特點到功能缺陷,重新認識分析型分佈式數據庫

Palo和ClickHouse都宣稱實現了MPP Data Warehouse,但從架構上看已經與傳統的MPP發生很大的變化,幾乎完全捨棄了批量處理,專注於聯機部分。

ClickHouse和Palo作爲較晚出現的開源項目,還在進一步發展過程中,設定的使用場景以廣告業務時序數據分析爲主,存在一定侷限性,但值得持續關注。

以上是我對OLAP場景“分佈式數據庫”橫向的概要分析,我們兩個拆解維度中的第一部分,對不同的“分佈式數據庫”的橫向探討至此就告一段落了,其中還有很多有趣的話題,我們可以留待後續文章繼續討論。

相關文章