天天看點

流計算風雲再起 - PostgreSQL攜PipelineDB力挺IoT(物聯網), 大幅提升性能和開發效率

postgresql , pipelinedb , 流計算 , patch , bug , libcheck , zeromq , kafka , kinesis , iot , 物聯網

pipelinedb是基于postgresql的一個流式計算資料庫,純c代碼,效率極高(32c機器,單機日處理流水達到了250.56億條)。同時它具備了postgresql強大的功能基礎,正在掀起一場流計算資料庫制霸的腥風血雨。

在物聯網(iot)有非常廣泛的應用場景,越來越多的使用者開始從其他的流計算平台遷移到pipelinedb。

pipelinedb的用法非常簡單,首先定義stream(流),然後基于stream定義對應的transform(事件觸發子產品),以及continuous views(實時統計子產品)

資料往流裡面插入,transform和continuous views就在後面實時的對流裡的資料進行處理,對開發人員來說很友好,很高效。

值得慶祝的還有,所有的接口都是sql操作,非常的友善,大大降低了開發難度。

流計算風雲再起 - PostgreSQL攜PipelineDB力挺IoT(物聯網), 大幅提升性能和開發效率

1. 什麼是流

流是基礎,continuous views和transform則是基于流中的資料進行處理的手段。

對于同一份資料,隻需要定義一個流,寫入一份即可。

如果對同一份資料有多個次元的統計,可以寫在一條sql完成的(如同一次元的運算或者可以支援視窗的多元度運算),隻需定義一個continuous views或transform。如果不能在同一條sql中完成計算,則定義多個continuous views或transform即可。

如果有多份資料來源(例如設計時就已經區分了不同的表)時,定義不同的流即可;

2. 什麼是流視圖?

流視圖,其實就是定義統計分析的query, 例如<code>select id, count(*), avg(x), ... from stream_1 group by ...;</code> 就屬于一個流視圖。

定義好之後,資料插入流(stream_1),這個流視圖就會不斷增量的進行統計,你隻要查詢這個流視圖,就可以檢視到實時的統計結果。

資料庫中存儲的是實時統計的結果(實際上是在記憶體中進行增量合并的,增量的方式持久化)。

3. 什麼是transforms

與流視圖不同的是,transform是用來觸發事件的,是以它可以不保留資料,但是可以設定條件,當記錄滿足條件時,就觸發事件。

例如監視傳感器的值,當值的範圍超出時,觸發報警(如通過rest接口發給指定的server),或者将報警記錄下來(通過觸發器函數)。

4. pipelinedb繼承了postgresql很好的擴充性,例如支援了機率統計相關的功能,例如hll等。用起來也非常的爽,例如統計網站的uv,或者紅綠燈通過的汽車編号唯一值車流,通過手機信号統計基站輻射方圓多少公裡的按時uv等。

5. sliding windows

因為很多場景的資料有時效,或者有時間視窗的概念,是以pipelinedb提供了視窗分片的接口,允許使用者對資料的時效進行定義。

例如僅僅統計最近一分鐘的時間視窗内的統計資料。

比如熱力圖,展示最近一分鐘的熱度,對于舊的資料不關心,就可以适應sw進行定義,進而保留的資料少,對機器的要求低,效率還高。

6. 流視圖 支援join,支援join,支援join,重要的事情說三遍。

流 join 流(未來版本支援,目前可以通過transform間接實作)

流 join table(已支援)

欲了解pipelinedb詳情請參考

<a href="http://docs.pipelinedb.com/">http://docs.pipelinedb.com/</a>

如果你還想了解一下postgresql請參考

<a href="https://github.com/digoal/blog/blob/master/201609/20160929_02.md">《postgresql 前世今生》</a>

pipelinedb在github上面可以下載下傳。

<a href="https://github.com/pipelinedb/pipelinedb/releases">https://github.com/pipelinedb/pipelinedb/releases</a>

凡是需要流式處理的場景,pipelinedb都是适用的,例如 :

1. 交通

流式處理交通傳感器(如路感、紅綠燈)上報的資料,實時的反應交通情況如車流(流視圖中完成)。動态的觸發事件響應(transform中完成)如交通事故。

2. 水文監測

流式監測傳感器的資料,水質的變化,動态的觸發事件響應(transform中完成)如水質受到污染。

3. 車聯網

結合postgis,實作對汽車的位置實時跟蹤和軌迹合并,動态的繪制大盤資料(分時,車輛區域分布)。

4. 物流動态

動态的跟蹤包裹在每個環節的資料,聚合結果,在查詢時不需要再從大量的資料中篩選多條(降低離散掃描)。

5. 金融資料實時處理

例如使用者設定了某個股票達到多少時,進行買入或賣出的操作,使用transform的事件處理機制,可以快速的進行買賣。

又比如,實時的對股票的名額資料進行一些數學模型的運算,實時輸出運算結果,繪制大盤資料。

6. 公安刑偵

例如在已知可疑車輛的車牌時,在流式處理天眼拍攝并實時上傳的車牌資訊時,通過transform設定的規則,遇到可疑車牌時,觸發事件,快速的知道可疑車輛的實時行蹤。

7. app埋點(feed)資料實時分析

很多app都會設定埋點,友善對使用者的行為,或者業務處理邏輯進行跟蹤,如果通路量大,資料量可能非常龐大,在沒有流式處理前,我們可能需要将資料收集到一個大型的資料倉庫,進行離線分析。

但是有些時候,離線分析可能是不夠用的,比如要根據使用者的實時行為,或者大盤的實時行為,對使用者做出一些動态的推薦,或者營銷,那麼就要用到流式實時處理了。

8. 網絡協定層流量分析

比如對辦公網絡、營運商網關、某些服務端的流量分析。

流計算風雲再起 - PostgreSQL攜PipelineDB力挺IoT(物聯網), 大幅提升性能和開發效率

還有諸多場景等你來發掘。

流計算風雲再起 - PostgreSQL攜PipelineDB力挺IoT(物聯網), 大幅提升性能和開發效率

pipelinedb文檔中提到的一些例子

這是個拼爹的年代,pipelinedb有個很牛逼的爸爸postgresql,出身伯克利大學,有紮實的理論基礎,曆經了43年的進化,在功能、性能、擴充能力、理論基礎等方面無需質疑一直處于領先的位置。

搞流式計算,計算是靈魂,算法和支援的功能排在很重要的位置。

流計算風雲再起 - PostgreSQL攜PipelineDB力挺IoT(物聯網), 大幅提升性能和開發效率

postgresql的強大之處在于統計次元極其豐富,資料類型也極其豐富。

build-in 資料類型參考

<a href="https://www.postgresql.org/docs/9.6/static/datatype.html">https://www.postgresql.org/docs/9.6/static/datatype.html</a>

build-in 聚合,視窗,數學函數請參考

<a href="https://www.postgresql.org/docs/9.6/static/functions.html">https://www.postgresql.org/docs/9.6/static/functions.html</a>

同時還支援擴充,常見的例如

<a href="http://madlib.incubator.apache.org/docs/latest/index.html">madlib</a>

<a href="http://postgis.net/">postgis</a>

<a href="http://pgrouting.org/">路徑規劃</a>

<a href="https://github.com/digoal/blog/blob/master/201611/20161126_01.md">wavelet</a>

<a href="https://github.com/digoal/blog/blob/master/201606/20160621_1.md">基因</a>

<a href="http://www.rdkit.org/">化學</a>

還有好多好多(為什麼這麼多?原因是postgresql的bsd-like許可,緻使了pg的生态圈真的很大很大,深入各行各業)。

你能想到的和想不到的幾乎都可以在pipelinedb 中進行流式處理,大大提高開發效率。

<a href="https://github.com/digoal/blog/blob/master/201611/20161121_01.md">《postgresql on linux 最佳部署手冊》</a>

<a href="http://zeromq.org/intro:get-the-software">http://zeromq.org/intro:get-the-software</a>

删除老版本的check

安裝 check

<a href="http://check.sourceforge.net/">http://check.sourceforge.net/</a>

<a href="https://libcheck.github.io/check/web/install.html#linuxsource">https://libcheck.github.io/check/web/install.html#linuxsource</a>

<a href="https://github.com/libcheck/check/releases">https://github.com/libcheck/check/releases</a>

pipelinedb for rhel 6 or centos 6有幾個bug需要修複一下

libzmq.a的路徑修正

配置環境變量

假設端口為1922,目錄放在/u01中

初始化叢集

如何連接配接postgresql,就如何連接配接pipelinedb,它們是全相容的。

id為key, val存儲值,統計時按id聚合

流視圖統計count, avg, min, max, sum幾個常見次元

同時還支援擴充,常見的例如 postgis, wavelet, 基因,化學,圖類型,等等。

你能想到的和想不到的都可以在pipelinedb 中進行流式處理,大大提高開發效率。

100萬個随機group,插入的值為500萬内的随機值

使用1000個連接配接,開始壓測,每秒約處理24萬流水

如果主機有很多塊硬碟,并且cpu很強時,可以在一台主機中部署2個或多個pipelinedb執行個體,進行分流。

比如我在32core的機器上,部署2個pipelinedb執行個體,可以達到29萬/s的流處理能力,一天能處理 250.56億 流水。

小夥伴們都驚呆了。

250.56億,使用jstrom架構的話,估計要幾十倍甚至上百倍于pipelinedb的硬體投入才能達到同樣效果。

雖然pipelinedb的性能很強(前面測的32c機器約250.56億/天的流水處理能力),但是單機總會有瓶頸,是以我們還是需要考慮叢集化的部署。

流計算風雲再起 - PostgreSQL攜PipelineDB力挺IoT(物聯網), 大幅提升性能和開發效率

寫入操作,如果不需要特定的分片規則,使用haproxy分發就可以了。如果需要加入分片規則,可以使用plproxy。

查詢聚合,需要使用plproxy,非常簡單,寫個動态函數即可。

<a href="https://github.com/digoal/blog/blob/master/201005/20100511_01.md">《使用plproxy設計postgresql分布式資料庫》</a>

<a href="https://github.com/digoal/blog/blob/master/201110/20111025_01.md">《a smart postgresql extension plproxy 2.2 practices》</a>

<a href="https://github.com/digoal/blog/blob/master/201608/20160824_02.md">《postgresql 最佳實踐 - 水準分庫(基于plproxy)》</a>

從文檔目錄,可以快速了解pipelinedb可以幹什麼,可以和什麼結合,處理那些場景的問題?

1. 介紹

2. continuous views

定義流視圖,其實就是定義 統計分析的query, 例如select id, count(*), avg(x), ... from table group by ...;

定義好之後,資料插入table,這個流視圖就會不斷增量的進行統計,你隻要查詢這個流視圖,就可以檢視到實時的統計結果。

3. continuous transforms

4. streams

流視圖和transform都是基于流的,是以流是基礎。

我們首先需要定義流,往流裡面寫資料,然後在流動的資料中使用流視圖或者transform對資料進行實時處理。

5. built-in functionality

内置的函數

6. continuous aggregates

聚合的介紹,通常流處理分兩類,即前面講的

流視圖(通常是實時聚合的結果),比如按分鐘實時的對紅綠燈的車流統計資料繪圖,或者按分鐘對股票的實時資料進行繪圖。

transform(事件處理機制),比如監控水質,傳感器的值超出某個範圍時,記錄日志,并同時觸發告警(發送給server)。

7. clients

幾種常見的用戶端用法,實際上支援postgresql的都支援pipelinedb,他們的連接配接協定是一緻的。

8. probabilistic data structures &amp; algorithms

機率統計相關的功能,例如hll等。用起來也非常的爽,例如統計網站的uv,或者紅綠燈通過的汽車編号唯一值車流,通過手機信号統計基站輻射方圓多少公裡的按時uv等。

9. sliding windows

10. continuous joins

流視圖 支援join,支援join,支援join,重要的事情說三遍。

11. integrations

pipelinedb繼承了postgresql的高擴充性,是以支援kafka, aws kinesis也是易如反掌的,可以适應更多的場景。

流計算風雲再起 - PostgreSQL攜PipelineDB力挺IoT(物聯網), 大幅提升性能和開發效率

<a href="https://aws.amazon.com/cn/kinesis/streams/">https://aws.amazon.com/cn/kinesis/streams/</a>

12. statistics

統計資訊,對于dba有很大的幫助

13. configuration

<a href="https://yq.aliyun.com/articles/166">https://yq.aliyun.com/articles/166</a>