天天看點

海量資料 "寫入、共享、存儲、計算" 最佳實踐

postgresql , 冷熱分離 , 資料共享 , 打破孤島 , 無盤工作 , 存儲計算分離 , 行為資料 , 軌迹資料 , 金融資料 , 監控資料 , 物聯網 , gis , 範圍 , 數組 , 圖檔

資料是為業務服務的,業務方為了更加透徹的掌握業務本身或者使用該業務的群體,往往會收集,或者讓應用埋點,收集更多的日志。

随着使用者量、使用者活躍度的增長,時間的積累等,資料産生的速度越來越快,資料堆積的量越來越大,資料的次元越來越多,資料類型越來越多,資料孤島也越來越多。

日積月累,給企業it帶來諸多負擔,it成本不斷增加,收益确不見得有多高。

海量資料 "寫入、共享、存儲、計算" 最佳實踐

上圖描繪了企業中可能存在的問題:

1. 資料孤島問題嚴重(如果沒有大資料平台時)。

2. 對成本預估不足,計算能力擴容麻煩,又或者鋪張浪費嚴重。

3. 資料備援問題突出。

4. 存儲成本昂貴。

5. 業務萎縮後硬體成為固定資産,it負擔嚴重,幾乎沒有硬體伸縮能力。

6. 資料量太大,幾乎無法備份。

7. 業務需求多,資料種類多,分析成本、開發成本高昂。

本文将針對這個場景,給出一個比較合理的方案,靈活使用,可以減輕企業it成本,陪伴企業高速成長。

一個包裹,從攬件、發貨、運輸、中轉、配送到簽收整個流程中會産生非常多的跟蹤資料,每到一個節點,都會掃描一次記錄包裹的狀态資訊。

運輸過程中,車輛與包裹關聯,車輛本身采集的軌迹、油耗、車輛狀态、司機狀态等資訊。

配送過程,快遞員的位置資訊、包裹的配送資訊都會被跟蹤,也會産生大量的記錄。

一個包裹在背景可能會産生上百條跟蹤記錄。

運輸的車輛,一天可能産生上萬的軌迹記錄。

配送小哥,一天也可能産生上萬條軌迹記錄。

我曾經分享過一個物流配送動态規劃的話題。有興趣的童鞋也可以參考

<a href="https://github.com/digoal/blog/blob/master/201611/20161114_01.md">《聊一聊雙十一背後的技術 - 物流、動态路徑規劃》</a>

物流行業産生的行為資料量已經達到了海量級别。

怎樣才能有效的對這些資料進行處理呢?

比如:

實時按位置擷取附近的快遞員。

實時統計包裹的流量,快遞員的排程,車輛的排程,倉庫的選址等等一系列的需求。

金融行業也是資料的生産大戶,使用者的交易,企業的交易,證券資料等等。

資料量大,要求實時計算,要求有比較豐富的統計學分析函數等。

我曾經分享過一個關于模拟證券交易的系統需求分析。有興趣的童鞋也可以參考

<a href="https://github.com/digoal/blog/blob/master/201704/20170417_01.md">《postgresql 證券行業資料庫需求分析與應用》</a>

物聯網産生的資料有時序屬性,有流計算需求(例如到達門檻值觸發),有事後分析需求。

資料量龐大,有資料壓縮需求。

我剛好也寫過一些物聯網應用的資料庫特性分析,這些特性可以幫助物聯網實作資料的壓縮、流計算等需求。

<a href="https://github.com/digoal/blog/blob/master/201612/20161220_01.md">《流計算風雲再起 - postgresql攜pipelinedb力挺iot》</a>

<a href="https://github.com/digoal/blog/blob/master/201608/20160813_01.md">《旋轉門資料壓縮算法在postgresql中的實作 - 流式壓縮在物聯網、監控、傳感器等場景的應用》</a>

<a href="https://github.com/digoal/blog/blob/master/201604/20160414_01.md">《postgresql 物聯網黑科技 - 瘦身幾百倍的索引(brin index)》</a>

<a href="https://github.com/digoal/blog/blob/master/201604/20160404_01.md">《一個簡單算法可以幫助物聯網,金融 使用者 節約98%的資料存儲成本》</a>

<a href="https://github.com/digoal/blog/blob/master/201512/20151215_01.md">《"物聯網"流式處理應用 - 用postgresql實時處理(萬億每天)》</a>

<a href="https://github.com/digoal/blog/blob/master/201205/20120517_01.md">《postgresql 黑科技 range 類型及 gist index 助力物聯網(iot)》</a>

物聯網還有一個特性,傳感器上報的資料往往包括數字範圍(例如溫度範圍)、地理位置、圖檔等資訊,如何高效的存儲,查詢這些類型的資料呢?

監控行業,例如對業務狀态的監控,對伺服器狀态的監控,對網絡、存儲等硬體狀态的監控等。

監控行業具有比較強的業務背景,不同的垂直行業,對監控的需求也不一樣,處理的資料類型也不一樣。

例如某些行業可能需要對位置進行監控,如公車的軌迹,出了位置電子圍欄,發出告警。換了司機駕駛,發出警告。等等。

海量資料 "寫入、共享、存儲、計算" 最佳實踐

公安的資料來自多個領域,例如 通訊記錄、出行記錄、消費記錄、攝像頭拍攝、社交、購物記錄 等等。

公安的資料量更加龐大,一個比較典型的場景是風險控制、抓捕嫌犯。涉及基于地理位置、時間次元的人物關系分析(圖式搜尋)。

如何才能滿足這樣的需求呢?

其他不再列舉。

如何解決資料孤島,打通資料共享管道?

如何高效率的寫入日志、行為軌迹、金融資料、軌迹資料等?

如何高效的實時處理資料,根據門檻值告警通知,實時分析等?

如何解決大資料的容災、備份問題?

如何解決大資料的壓縮和效率問題?

如何解決資料多元度、類型多,計算複雜的問題?

如何解決企業it架構彈性伸縮的問題?

總結起來幾個關鍵字:

寫入、共享、存儲、計算。

用到三個元件:

海量資料 "寫入、共享、存儲、計算" 最佳實踐

1. rds postgresql

支援時序資料、塊級索引、反向索引、多核并行、json、數組存儲、oss_fdw外部讀寫等特性。

解決oltp,gis應用、複雜查詢、時空資料處理、多元分析、冷熱資料分離的問題。

2. hybriddb postgresql

支援列存儲、水準擴充、塊級壓縮、豐富的資料類型、機器學習庫、plpython、pljava、plr程式設計、oss_fdw外部讀寫等特性。

解決海量資料的計算問題。

3. oss 對象存儲

多個rds執行個體之間,可以通過oss_fdw共享資料。

oss多副本、跨域複制。

解決資料孤島、海量資料存儲、跨機房容災、海量資料備份等問題。

海量資料 "寫入、共享、存儲、計算" 最佳實踐

資料寫入分為3條路徑:

1. 線上實時寫入,可以走rds sql接口,單個執行個體能達到 百萬行/s 以上的寫入速度。

2. 批量準實時寫入,可以走hybriddb sql接口,單個執行個體能達到 百萬行/s 以上的寫入速度。

3. 批量準實時寫入,比如寫檔案,可以走oss寫入接口,帶寬彈性伸縮。

例如a業務和b業務,使用了兩個rds資料庫執行個體,但是它們有部分需求需要共享資料,傳統的方法需要用到etl,而現在,使用oss_fdw就可以實作多執行個體的資料共享,而且效率非常高。

海量資料 "寫入、共享、存儲、計算" 最佳實踐

通過rds postgresql oss_fdw的并行讀寫功能(同一張表的檔案,可以開多個worker process程序并行讀寫),共享資料的讀寫效率非常高。

海量資料 "寫入、共享、存儲、計算" 最佳實踐

并行展現三個方面:oss讀寫并行、rds postgresql多核計算并行、rds pg或hybriddb的多機并行。

海量資料 "寫入、共享、存儲、計算" 最佳實踐

對于實時資料,使用rds postgresql, hybriddb的本地資料存儲。對于需要分析、需要共享的資料,使用oss進行存儲。

oss相比計算資源的存儲更加的廉價,在確定靈活性的同時,降低了企業的it成本。

通過oss對象存儲,解決了企業的資料備援、成本高等問題,滿足了資料的備份、容災等需求。

海量資料 "寫入、共享、存儲、計算" 最佳實踐

通過rds postgresql, hybriddb, oss的三個基本元件,實作了計算資源、存儲資源的分離。

因為計算節點的資料量少了(大部分資料都存在oss了),計算節點的擴容、縮容、容災、備份都更加友善。

1. 流式計算

流式計算分為兩種,一種是實時統計,另一種是設定門檻值進行實時的告警。

通過pipelinedb(base on postgresql)可以實作這兩類流計算。

好處:

sql标準接口,豐富的内置函數支援複雜的流計算需求,豐富的資料類型(包括gis,json等)支援更多的流計算業務場景,異步消息通知機制支援第二類流計算需求。

pipelinedb正在進行插件化改造,以後可以作為postgresql的插件使用。

<a href="https://github.com/pipelinedb/pipelinedb/issues?q=is%3aissue+is%3aopen+label%3a%22extension+refactor%22">https://github.com/pipelinedb/pipelinedb/issues?q=is%3aissue+is%3aopen+label%3a%22extension+refactor%22</a>

海量資料 "寫入、共享、存儲、計算" 最佳實踐

例如在監控領域,使用流計算的異步消息機制,可以避免傳統主動問詢監控的無用功問題。

海量資料 "寫入、共享、存儲、計算" 最佳實踐

2. 實時互動業務

傳統的oltp需求,使用rds postgresql可以滿足。

postgresql的特性包括:gis、json、數組、冷熱分離、水準分庫、k-v類型、多核并行、塊級索引、反向索引等。

postgresql支援的場景包括:流計算、圖式搜尋、時序資料、路徑規劃、模糊查詢、全文檢索、相似查詢、秒殺、基因、金融、化學、gis應用、複雜查詢、bi、多元分析、時空資料搜尋等。

覆寫銀行、保險、證券、物聯網、網際網路、遊戲、天文、出行、電商、傳統企業等行業。

3. 準實時分析

結合oss對象存儲,rds postgresql和hybriddb都可以實作準實時的分析。

同一份oss的資料,也可以在多個執行個體之間進行共享,同時通路。

4. 離線分析、挖掘

結合oss對象存儲,rds postgresql和hybriddb都可以實作對離線資料的分析和挖掘。

rds postgresql 支援單機多核并行,hybriddb for postgresql支援多機并行。使用者可以根據計算量進行選擇。

計算的靈魂是類型的支援、以及類型的處理。

1. postgresql内置了豐富的類型支援,包括(數字、字元串、時間、布爾、枚舉、數組、範圍、gis、全文檢索、bytea、大對象、幾何、比特、xml、uuid、json、複合類型等),同時支援使用者自定義的類型。可以支援幾乎所有的業務場景

2. 操作符,為了滿足對資料的處理需求,pg對每一種支援的類型,都支援非常豐富的操作,

3. 内置函數,pg内置了豐富的統計學函數、三角函數、gis處理函數,madlib機器學習函數等。

4. 自定義計算邏輯,使用者可以通過c, python, java, r等語言,定義資料的處理函數。擴充postgresql, hybriddb for postgresql的資料處理能力。

5. 聚合函數,内置了豐富的聚合函數,支援資料的統計。

6. 視窗查詢功能的支援。

7. 遞歸查詢的支援。

8. 多元分析文法的支援。

主要展現在這幾個方面

1. 性能

rds postgresql主要處理線上事務以及少量的準實時分析。

pg oltp的性能可以參考這篇文檔,性能區間屬于商業資料庫水準。

<a href="https://github.com/digoal/blog/blob/master/201701/20170125_01.md">《資料庫界的華山論劍 tpc.org》</a>

pg 的olap分析能力,可以參考這篇文檔,其多核并行,jit,算子複用等特性,使得pg的olap能力相比其他rdbms資料庫有質的提升。

<a href="https://github.com/digoal/blog/blob/master/201612/20161216_01.md">《分析加速引擎黑科技 - llvm、列存、多核并行、算子複用 大聯姻 - 一起來開啟postgresql的百寶箱》</a>

postgresql 10 在htap方面還有更多的增強。

2. 功能

功能也是postgresql的強項,在上一章《計算需要具備的能力》有詳細介紹。

3. 擴充能力

計算能力擴充,通過增加cpu,可以擴充複雜計算的性能。

存儲能力擴充,通過oss存儲以及oss_fdw插件,可以擴充rds pg的存儲能力,打破存儲極限。

4. 成本

存儲成本:由于大部分需要分離的資料都存儲到oss了,使用者不再需要考慮這部分的容災、備份問題。相比存儲在資料庫中,存儲成本大幅降低。

開發成本:rds pg, hybriddb pg都支援豐富的sql标準接口,通路oss中的資料(通過table接口),使用的也是sql标準接口。節省了大量的開發成本,

維護成本:使用雲服務,運維成本幾乎為0。

5. 覆寫行業

覆寫了銀行、保險、證券、物聯網、網際網路、遊戲、天文、出行、電商、傳統企業等行業。

hybriddb postgresql為mpp架構,計算能力出衆。

在上一章《計算需要具備的能力》有詳細介紹。

計算能力擴充,通過增加計算節點數,可以擴充複雜計算的性能。

海量資料 "寫入、共享、存儲、計算" 最佳實踐
海量資料 "寫入、共享、存儲、計算" 最佳實踐

<a href="https://help.aliyun.com/document_detail/44461.html">《rds postgresql : 使用 oss_fdw 讀寫oss對象存儲》</a>

<a href="https://help.aliyun.com/document_detail/35457.html">《hybriddb postgresql : 使用 oss_fdw 讀寫oss對象存儲》</a>