TDW作為一個離線資料分析系統,在處理海量資料方面,通過並行計算,有很好的效能優勢。但是騰訊知道,想用一個大而全的系統解決所有問題一般也是不現實的,同樣,TDW也有它的劣勢,比如對小資料處理效能低,update/delete效能差、介面不豐富等。因此騰訊引入一個強大的開來源資料庫PostgreSQL,並對其做一些功能擴充,使之有訪問TDW資料的能力;同時騰訊在TDW中開發了一種新的儲存引擎,騰訊稱之為pgdata儲存引擎,使得TDW具備讀寫PostgreSQL中的資料的能力。
PostgreSQL
在騰訊應用概述
- 主要業務情境為OLAP資料分析
- 大部分為內部系統,少量應用於對外服務
- 作為TDW系統的補充而存在
- 主要應用形式為業務使用TDW提供的tPG服務
- TDW團隊負責機器、運營和支援人員
- 業務提交申請即可使用
- PG與MySQL
- MySQL可以支撐,則優先使用MySQL
- MySQL不能滿足,再考慮使用PG
TDW與PostgreSQL互訪問功能的實現,對TDW是一個強有力的補充,這些主要體現在如下3點:
- 彌補TDW介面不豐富的短板。TDW缺乏標準化的JDBC/ODBC,編程介面也不豐富,而PostgreSQL有社區強大的力量,提供了JDBC/ODBC, shell, C/C++, C#, python, perl等各種語言的介面,使用者通過這些豐富的介面和騰訊開發的PostgreSQL的TDW橋接工具tdwlink,訪問TDW中的資料。
- 彌補TDW小資料分析效率底的短板。TDW在海量資料處理時,可以發揮它並存執行的優勢。但是對於小資料分析,它的效能反而不如傳統的DB。使用PostgreSQL,對於10GB以內的資料分析,可以獲得更好的效能和時間響應,一般可以在秒級返回結果,相比TDW分鐘級的響應,tPG在這種情境下更有優勢。
- 作為TDW的pgdata儲存引擎,彌補TDW update/delete效率底下的短板。TDW作為資料倉儲系統,對於記錄級的update/delete支援不是很好。在TDW中記錄級的update/delete,會導致整個表的重寫,也就是說,即使delete一條資料,也會導致整個表重寫一遍,耗費大量系統資源。而tPG作為傳統資料庫,記錄級的update和delete效率非常高。
tPG
的作用
- TDW資料集市,結果展示
- 對外提供JDBC/ODBC等標準化介面
- 提高高校的小資料分析功能
- 提高高校的update/delete功能
TDW
為什麼要引入tPG
TDW應用推廣遇到的挑戰
- TDW離線分析,不能滿足業務的結果文件庫需求
- TDW沒有標準的JDBC、ODBC介面,難以與商業工具對接
- TDW處理小資料、做update和delete效率低
解決方案
- TDW不是萬能的,不可能滿足所有應用情境
- 需要建設一套RDBMS,作為TDW的補充
- 要方便使用者移轉已有業務,做好有工具做遷移
- 要有標準的JDBC、ODBC介面
- 效能要好
- 功能容易擴充
為什麼選擇PostgreSQL
- 完善的DB功能
- SQL標準支援較好
- 支援PL/pgSQL等多種過程語言
- 支援視圖、分析函數、CTE等進階特性
- OLAP效能超過MySQL
- 複雜SQL效能高10倍+
- 基於cost的SQL最佳化,調優手段更多
- 部分索引,函數索引,cluster索引
- 外掛程式式的功能擴充
- 已有訪問Mysql、Redis、文本等外部資料源外掛程式
- 很容易開發訪問TDW的外掛程式
- TB級Database Backup與恢複(基於zfs快照技術)
- 速度快,對上TB的資料做快照耗時小於1秒
- 佔用空間小,新產生的快照幾乎不佔空間
- 支援快照增量備份,支援快速rollback
PostgreSQL系統在TDW生態圈中的位置如下圖所示,tPG是騰訊對擴充之後的PostgreSQL的一個叫法:
下面分兩個部分對TDW與PostgreSQL的互訪問功能做一個介紹,也即是pgdata儲存引擎以及tdwlink功能。
pgdata
儲存引擎
TDW本身支援多種儲存格式,包括textfile,rcfile,pbfile,在這個基礎上,騰訊開發一種新的儲存引擎,也即pgdata儲存引擎,能夠透明的儲存以及訪問PostgreSQL中的資料,具體情況如下圖:
在使用上,只需要在建立表的時候指定為pgdata儲存引擎即可,例如使用如下語句就可以建立此類型的外表
|
create external table foo(idx bigint, str string) stored as pgdata
|
在後續訪問過程中就和使用其他TDW表一般即可,在此簡單說明一下訪問的實現方式,訪問的資料流大致如下
- 在解析SQL查詢語句時,先分解出每個子查詢,然後對每個子查詢總是會首先判斷當前查詢涉及的表中是pgdata外表,如果沒有DB外表則走正常的查詢語句執行流程;
- 如果有pgdata外表, 接著再檢查在本次查詢中涉及到的外表資料是否已經匯入,如果匯入則直接複用已經匯入的資料,如果沒有則對相應的子查詢進行加工,將其轉換為相應的標準關係型資料庫SQL語句,然後從表中擷取串連資訊,使用JDBC執行查詢語句;
- 將查詢結果的資料從資料庫中匯入到位於tmp目錄下的一個隨機HDFS目錄中,這個隨機目錄使用UUID產生,因此可以保證唯一性,而不與其他查詢語句產生衝突,然後將其設定為外表的資料所在的HDFS檔案路徑,Mapreduce任務會自動讀取該路徑作為任務的輸入路徑;
- 在該條查詢執行結束以後,並且查詢結果已經擷取成功,則清除掉這個臨時檔案。如果查詢出現了異常也會自動的清理到已經匯入的垃圾資料資訊。
tdwlink
功能
SQL標準中包含了一個名為SQL/MED也即”SQL Management of External Data”的功能, PostgreSQL在2011年的9.1版本使用一種叫Foreign Data Wrappers的機制對此標準做了唯讀支援,開發人員只需要對相應的資料來源開發相應的外掛程式即可通過PostgreSQL對遠端資料來源進行訪問。目前社區已經有很多基於此功能開發的外掛程式,諸如oracle_fdw,mysql_fdw,redis_fdw等,騰訊團隊基於PostgreSQL的這個特性,開發了具備訪問TDW資料能力的外掛程式,稱之為tdw_fdw,可以參考下圖:
為了方便使用者使用此功能,騰訊開發了一個預存程序tdwlink,使用者只需要事先配置好對應的Foreign server以及認證資訊,即可很方便的使用,例如騰訊已經定義好了tdw_svr這個server,想訪問tdw裡的test庫的test表,只需要select tdw_meta.tdwlink(‘tdw_svr’,‘test’,‘select col1, col2 from test’)即可。由於此函數是通過PostgreSQL提供的,因此可以使用PostgreSQL提供的任意介面來使用,這樣也間接的擴充了TDW所具備的提供者。這裡補充一點,騰訊的tdw_fdw外掛程式是基於PostgreSQL 9.1版本開發的,這個版本的Foreign Data Wrappers只能對外部資料源提供唯讀訪問,因此騰訊的tdw_fdw只能夠提供對TDW的唯讀訪問,而最新發行的PostgreSQL9.3版本的Foreign Data Wrappers已經提供寫支援,這個也是騰訊的tdw_fdw外掛程式後續可以進行功能擴充的地方。
tPG
使用的開源外掛程式
- 分區管理:基於pg_partman進行改造
- 監控:check_postgres和pgBadger
- 緩衝預熱:pgfincore
- 執行個體間互相訪問:dblink
- 讀取MySQL資料:mysql_fdw
- 中文全文檢索索引:zhparser
tPG
運營現狀
目前運營情況
- 11套tPG執行個體,共約40台機器
- 已用儲存約30TB,最大執行個體儲存達5TB
- tPG在公司內的用總戶數100人+
- 沒有因PG本身出過事故,使用者評價積極
業務類型
- 對外:使用者報表
- 對內:TDW系統,30多個業務的報表系統、資料提取系統、BI系統、營銷系統等
tPG
應用未來規劃
- 為業務提供叢集版PG-XC服務
- 更豐富的應用情境
- 地理資訊(PostGis )
- 機器學習與資料採礦(Madlib )
- R統計分析(PL/R )
- …
- 接入流程自助化