Greenplum 資料庫是最先進的分散式開源資料庫技術,主要用來處理大規模的資料分析任務,包括資料倉庫、商務智慧(OLAP)和資料探勘等。自2015年10月正式開源以來,受到國內外業內人士的廣泛關注。本文就社群關心的Greenplum資料庫技術架構進行介紹。

一. Greenplum資料庫簡介

大資料是個炙手可熱的詞,各行各業都在談。一談到大資料,好多人認為就是Hadoop。實際上Hadoop只是大資料若干處理方案中的一個。現在的SQL、NoSQL、NewSQL、Hadoop等等,都能在不同層面或不同應用上處理大資料的某些問題。而Greenplum資料庫做為一個分散式大規模並行處理資料庫,在大多數情況下,更適合做大資料的儲存引擎、計算引擎和分析引擎。

Greenplum資料庫也簡稱GPDB。它擁有豐富的特性:

第一,完善的標準支援:GPDB完全支援ANSI SQL 2008標準和SQL OLAP 2003 擴充套件;從應用程式設計介面上講,它支援ODBC和JDBC。完善的標準支援使得系統開發、維護和管理都大為方便。而現在的 NoSQL,NewSQL和Hadoop 對 SQL 的支援都不完善,不同的系統需要單獨開發和管理,且移植性不好。

第二,支援分散式事務,支援ACID。保證資料的強一致性。

第三,做為分散式資料庫,擁有良好的線性擴充套件能力。在國內外使用者生產環境中,具有上百個物理節點的GPDB叢集都有很多案例。

第四,GPDB是企業級資料庫產品,全球有上千個叢集在不同客戶的生產環境執行。這些叢集為全球很多大的金融、政府、物流、零售等公司的關鍵業務提供服務。

第五,GPDB是Greenplum(現在的Pivotal)公司十多年研發投入的結果。GPDB基於PostgreSQL 8.2,PostgreSQL 8.2有大約80萬行原始碼,而GPDB現在有130萬行原始碼。相比PostgreSQL 8.2,增加了約50萬行的原始碼。

第六,Greenplum有很多合作伙伴,GPDB有完善的生態系統,可以與很多企業級產品整合,譬如SAS,Cognos,Informatic,Tableau等;也可以很多種開源軟體整合,譬如Pentaho,Talend 等。

二. Greenplum架構

2.1 平臺架構

圖(1)是Greenplum資料庫平臺概括圖。平臺分為四個層次,我們依次從下往上看。

MPP核心架構

GPDB是大規模無共享的處理架構,後面會專門介紹;

先進的並行優化器是效能突出的關鍵之一。GPDB有兩個優化器,一個是基於PostgreSQL planner的優化器;一個是全新開發的ORCA優化器。ORCA是Greenplum 5年以前啟動的全新專案,這個優化器經過幾年的開發和測試之後,最近已經成為GPDB企業版本的預設優化器。

GPDB的儲存引擎支援多型儲存,一個表的資料可以根據訪問模式的不同使用不同的儲存方式。儲存方式對使用者透明,執行查詢時,不用關心待訪問的資料使用的儲存模式,優化器會自動選擇最佳查詢計劃。

分散式資料庫中,某些操作(例如跨節點關聯)需要多個節點間進行資料交換。GPDB的並行資料庫流引擎,可以根據資料的特點,例如分佈方式、資料量等選擇最合適的資料流操作符。目前GPDB支援兩種資料流操作符:重分發(Redistribution)和廣播(Broadcast)。重分發根據資料的雜湊值重新分發到各個資料節點上,適用於資料量大的情況;廣播則將資料傳送給所有資料節點,適用於資料量較小的情況,例如維度表。

軟體交換機是GPDB的一個重要元件,軟體交換機可以在各個資料節點間及與主節點間建立可靠的UDP資料通訊機制,是實現高效資料流的核心。

Scatter/Gather 流引擎是專為並行資料載入和匯出而設計,Scatter指資料通過並行載入伺服器並行分散到各個資料節點,Gather指資料在 GPDB內部可以根據分佈策略按需並行分發。

服務層

GPDB支援多級容錯機制和高可用:

o 主節點(Master)高可用:為了避免主節點單點故障,可以設定一個主節點的副本(稱為 Standby Master),他們之間通過流複製技術實現同步複製。當主節點發生故障時,從節點成為主節點,處理使用者請求並協調查詢執行。它們之間通過心跳檢測故障。

o 資料節點(Segment)高可用:每個資料節點都可以配備一個映象,它們之間通過檔案操作級別的同步實現資料的同步複製(稱為filerep技術)。資料節點上建議使用RAID5磁碟,以進一步提高資料的高可用。故障檢測程序(ftsprobe)定期傳送心跳給各個資料節點。當某個節點發生故障時,GPDB會自動進行故障切換。

o 網路高可用:為了避免網路的單點故障,每個主機配置多個網口,並使用多個交換機避免網路故障時造成整個服務不可用。

線上擴充套件:資料量增大,現有叢集不能滿足需求時,可以對GPDB資料庫進行動態擴充套件。擴充套件過程中,業務可以繼續執行,不需要宕機。

任務管理是指對資源的管理和使用情況的管理。

產品特性

資料載入在後面會專門介紹。

資料聯邦是比較有意思的,最近“資料湖泊”這個詞非常火熱,資料湖泊的目的是不需再對資料像以前那樣經過定製,生成特定的業務報表;而是儲存原始資料,什麼時候想分析就從原始資料上直接處理。GBDB可以實現資料湖泊(我們稱之為資料聯邦),它能訪問和處理資料中心裡面的所有資料,不管你的資料是在Hadoop、在檔案系統上、還是在其他資料庫中,Greenplum可以使用一個SQL在保證ACID的前提下訪問所有資料。

GPDB即支援行存,也支援列存。還為不需更新的資料儲存和處理進行了專門的優化。

支援多種壓縮方法,包括QuickLZ,Zlib,RLE 等。

支援多級分割槽表,分割槽支援多種模式,包括範圍,列表等。

支援B樹、點陣圖和GiST 等索引

GPDB認證機制支援多種方式,包括LDAP和Kerberos等。通過訪問控制列表(ACL),可以實現靈活的基於角色的安全控制。

擴充套件語言支援:GPDB 支援使用多種流行語言實現使用者自定義函式(UDF,類似於Oracle的儲存過程),包括 Python,R,Java,Perl,C/C++ 等。

地理資訊處理:通過整合PostGIS,GPDB支援對地理資訊進行儲存和分析。

內建資料探勘演算法庫:通過MADLib(現在是Apache孵化專案)演算法庫,可以內建幾十種常見的資料分析和挖掘演算法到GPDB資料庫中,包括邏輯迴歸,決策樹,隨機森林等。不需要寫任何演算法程式碼,通過SQL就可以使用其中的所有演算法。

文字檢索:通過GPText擴充套件,GPDB可以支援高效靈活豐富的全文檢索功能。與 MADLib 合用,可以進行並行文字分析和挖掘。

客戶端訪問和工具

通過psql命令列工具可以訪問GPDB資料庫的所有功能,此外還提供了ODBC、JDBC、OLEDB、libpq等應用程式設計介面。

資料庫或者資料叢集的管理工具非常重要,GPDB提供了圖形化的管理工具GPCC(Greenplum Command Center),幫你管理狀態,監控資源使用情況。

Greenplum Workload Manager是剛剛釋出的新產品,用以實現基於規則的資源管理。它支援自定義規則,當某個SQL滿足規則描述的條件時會執行某些操作。比如你可以定義規則自動取消消耗CPU資源達50%以上的查詢。

2.2 大規模並行處理(MPP)無共享架構

MPP 是Greenplum資料庫最突出的特色。現在很流行MPP這個詞,我們可以看一下它是什麼意思。下邊圖(2)中,主節點有兩個,一個是主節點,一個是從主節點。通過軟交換機制,也就是通過高速網路,主節點連到資料節點。每個資料節點有自己的CPU,自己的記憶體,自己的硬碟,他們唯一共享的就是網路。這也是稱為無共享架構的原因。這種架構的好處是叢集是分散式的環境,資料可以分佈在很多節點上進行並行處理,可以做到線性擴充套件。

在分散式資料庫中,效能好壞的最重要因素是資料分佈是否均勻。如果資料分佈不均勻,有的節點上資料非常多,有的節點資料很少,這樣會出現短板效應,整個SQL的效率不會很好。Greenplum支援多種資料分佈的策略,預設使用主鍵或者第一個欄位進行雜湊分佈,還支援隨機分佈。除了橫向上資料可以按節點分佈之外,在某個節點上還可以對資料進行分割槽。分割槽的規則比較靈活,可以按照範圍分割槽,也可以按照列表值分割槽,如圖(3)。

2.3 並行查詢計劃和執行

下面是個簡單的SQL,如圖(4),從兩張表中找到2008年的銷售資料。圖中右邊是這個SQL的查詢計劃。從生成的查詢計劃樹中看到有三種不同的顏色,顏色相同表示做同一件事情,我們稱之為分片/切片(Slice)。最下層的橙色切片中有一個重分發節點,這個節點將本節點的資料重新分發到其他節點上。中間綠色切片表示分散式資料關聯(HashJoin)。最上面切片負責將各個資料節點收到的資料進行彙總。

然後看看這個查詢計劃的執行,如圖(5)。主節點(Master)上的排程器(QD)會下發查詢任務到每個資料節點,資料節點收到任務後(查詢計劃樹),建立工作程序(QE)執行任務。如果需要跨節點資料交換(例如上面的HashJoin),則資料節點上會建立多個工作程序協調執行任務。不同節點上執行同一任務(查詢計劃中的切片)的程序組成一個團伙(Gang)。資料從下往上流動,最終Master返回給客戶端。

2.4 多型儲存

上面介紹了GPDB的特點和SQL執行計劃以及執行過程,那資料在每個節點上到底怎麼樣儲存?

Greenplum提供稱為“多型儲存”的靈活儲存方式。多型儲存可以根據資料熱度或者訪問模式的不同而使用不同的儲存方式。一張表的不同資料可以使用不同的物理儲存方式,如圖(6)。支援的儲存方式包含:

行儲存:行儲存是傳統資料庫常用的儲存方式,特點是訪問比較快,多列更新比較容易。

列儲存:列儲存按列儲存,不同列的資料儲存在不同的地方(通常是不同檔案中)。適合一次只訪問寬表中某幾個欄位的情況。列儲存的另外一個優勢是壓縮比高。

外部表:資料儲存在其他系統中例如HDFS,資料庫只保留元資料資訊。

2.5 大規模並行資料載入

作為一個數據庫,一定會儲存和處理資料。那資料來源於什麼地方?Oracle這樣的資料庫裡面的資料多是客戶生成的,譬如你銀行轉賬、淘寶訂單等。對於資料分析型的資料庫,其源資料通常是在其他系統中,而且資料量很大。這樣資料載入的能力就變得非常重要。Greenplum提供了非常好的資料載入方案,支援高速的載入各種資料來源的不同資料格式的資料,如圖(7)。

並行資料載入:因為是並行資料載入,所以效能非常好。Greenplum有叫DCA的一體機產品,第一代DCA可以做到10TB/小時;第二代為16TB/小時。第三代很快就要釋出了,速度會更快。

資料來源和資料格式:資料來源支援Hadoop,檔案系統,資料庫,還有 ETL管理的資料。資料格式支援文字,CSV,Parquet,Avro等。

三. Greenplum核心元件

Greenplum 資料庫包括以下核心元件:

解析器:主節點收到客戶端請求後,執行認證操作。認證成功建立連線後,客戶端可以傳送查詢給資料庫。解析器負責對收到的查詢SQL字串進行詞法解析、語法解析,並生成語法樹。

優化器:優化器對解析器的結果進行處理,從所有可能的查詢計劃中選擇一個最優或者接近最優的計劃,生成查詢計劃。查詢計劃描述瞭如何執行一個查詢,通常以樹形結構描述。Greenplum最新的優化器叫 ORCA,關於 ORCA,可以從 ACM 論文中獲得詳細資訊。(http://dl.acm.org/citation.cfm?id=2595637&dl=ACM&coll=DL&CFID=569750122&CFTOKEN=89888184)

排程器(QD):排程器傳送優化後的查詢計劃給所有資料節點(Segments)上的執行器(QE)。排程器負責任務的執行,包括執行器的建立、銷燬、錯誤處理、任務取消、狀態更新等。

執行器(QE):執行器收到排程器傳送的查詢計劃後,開始執行自己負責的那部分計劃。典型的操作包括資料掃描、雜湊關聯、排序、聚集等。

Interconnect:負責叢集中各個節點間的資料傳輸。

系統表:系統表儲存和管理資料庫、表、欄位的元資料。每個節點上都有相應的拷貝。

分散式事務:主節點上的分散式事務管理器協調資料節點上事務的提交和回滾操作,由兩階段提交(2PC)實現。每個資料節點都有自己的事務日誌,負責自己節點上的事務處理。

四、Greenplum開源

2015年3月份,Pivotal宣佈了Greenplum的開源計劃,經過6個月緊鑼密鼓的工作,於10月27號正式開源。官方網站為http://greenplum.org。許可證書使用Apache 2許可證。

Greenplum 開源社群提供了執行環境沙盒以及使用教程,裡面包含了Greenplum資料庫的一些主要特性。從https://github.com/greenplum-db/gpdb-sandbox-tutorials 可以下載沙盒和教程。

有關Greenplum資料庫使用和開發的任何問題都可以去郵件列表討論:郵件列表有兩個:[email protected][email protected]

原始碼位於https://github.com/greenplum-db/gpdb,開源不到兩個月就有1187個收藏,256個fork,超過150個pull request,其中136個pull request 已經關閉。貢獻者中除了包含Pivotal的員工外,還有來自全球(包括中國、美國、日本和歐洲)的社群開發人員。關於從原始碼編譯和安裝Greenplum資料庫,可以參考:http://gpdb.rocks/gpdb/2015/10/29/how-to-build-gpdb.html