《如何找對業務G點, 體驗酸爽?PostgreSQL使用指南》要點:
本文介紹了如何找對業務G點, 體驗酸爽?PostgreSQL使用指南,希望對您有用。如果有疑問,可以聯系我們。
相關主題:PostgreSQL教程
通用數據庫就像帶裝修的房子一樣,如果按數據庫的功能劃分,可以分為豪華裝修、精裝、簡裝.
PostgreSQL從SQL兼容性、功能、性能、穩定性等方面綜合評價的話,絕對算得上豪華裝修級其余,用戶拎包入住就可以.
不過通用的畢竟是通用的,如果G點不對的話,再豪華的裝修你也爽不起來,這是很多通用數據庫的弊病,但是本日PostgreSQL數據庫會徹底顛覆你對通用數據庫的看法.
基于PostgreSQL打造最好用的私人訂制數據庫
花了2個徹夜,寫了一份PostgreSQL內核擴展指南,時間有限,內容以入門為主.
希望更多人對PostgreSQL內核擴展有個初步的了解,內核擴展并不需要對數據庫內核有非常深的了解,用戶只要把重點放在業務上,利用PostgreSQL開放的API實現對數據庫內核能力的擴展,打造屬于本身的數據庫.
為什么要擴展數據庫功能?
在回答這個問題前,我們先回答這個問題.
數據庫是不是存數據就可以了?所有的運算都交給應用法式來?
在數據大集中、硬件本錢高的年代.在較為general的硬件條件下,為了避免數據庫的計算成為瓶頸你可能會這樣做,把數據庫用得盡量簡單,幾乎不做任何的運算,只做簡單的增刪改查.
隨著數據庫技術的發展,水平分庫被越來越多的得到應用.同時硬件也在賡續的發展,CPU核數、內存帶寬、塊設備的帶寬和IOPS的發展都很迅猛.甚至GPU輔助運算也開始逐漸成為加速的焦點.
數據庫的所依托的硬件運算才能已經非常強大,這種情況下只把數據庫用作簡單的數據存取會帶來什么問題呢?
我之前寫過一篇《論云數據庫編程才能的重要性》,可以讀一下,也許能找到以上問題的靈感.
https://yq.aliyun.com/articles/38377
隨同硬件的飛速發展,疊加數據庫的分片技術的發展,現如今使用general硬件的數據庫也不再是瓶頸.
對于OLTP的query,數據庫往往可以做到us級響應,而在網絡層可能要花上毫秒級的時間.業務邏輯越復雜,與數據庫交互的次數越多,網絡RT會成倍的放大,影響用戶的體驗.
邏輯更復雜一些的場景,需要將數據取到應用端,在應用端處理,這會涉及到move data,也會較大程度的放大網絡RT.move data的模式正在逐漸成為影響用戶體驗、效率,浪費本錢的罪魁禍首.
如果能把數據庫打造成為同事具備數據存儲、管理與處理才能為一體的產品.在數據庫硬件資源充足的情況下,把一些數據庫能處理的邏輯交給數據庫處理,將極大的降低延遲,在高并發低延遲的應用場景非常有效.
這考驗的便是數據庫的擴展能力.
為什么PostgreSQL特別適合做內核擴展?
我提煉了3點適合做內核擴展的理由,有遺漏的話盡量來彌補啊,謝謝.
接 口 豐 富
PostgreSQL有哪些開放接口?
UDF(可以擴展 聚合、窗口以及普通 的函數)
https://www.postgresql.org/docs/9.5/static/xfunc-c.html
GiST, SP-GiST, GIN, BRIN 通用索引接口,允許針對任意類型自定義索引
https://www.postgresql.org/docs/9.5/static/gist.html
... ...
允許自定義擴展索引接口 (bloom例子)
https://www.postgresql.org/docs/9.6/static/bloom.html
https://www.postgresql.org/docs/9.6/static/xindex.html
操作符,允許針對類型,創立對應的操作符
https://www.postgresql.org/docs/9.5/static/sql-createoperator.html
自定義數據類型
https://www.postgresql.org/docs/9.5/static/sql-createtype.html
FDW,外部數據源接口,可以把外部數據源當成當地表使用
https://www.postgresql.org/docs/9.5/static/fdwhandler.html
函數語言 handler,可以集成任意高級語言,作為數據庫服務端的函數語言(例如java, python, swift, lua, ......)
https://www.postgresql.org/docs/9.5/static/plhandler.html
動態fork 進程,動態創立共享內存段.
https://www.postgresql.org/docs/9.5/static/bgworker.html
table sampling method, 可以自定義數據采樣辦法,例如創建測試環境,根據用戶的需求定義采樣辦法.
https://www.postgresql.org/docs/9.5/static/tablesample-method.html
custom scan provider,允許自定義掃描方法,擴展原有的全表掃描,索引掃描等.(例如GPU計算單元可以通過DMA直接拜訪塊設備,繞過USER SPACE,極大的提高傳輸吞吐率)
https://www.postgresql.org/docs/9.5/static/custom-scan.html
自定義REDO日志encode,decode接口,例如可以用它打造黑洞數據庫
https://www.postgresql.org/docs/9.6/static/generic-wal.html
用戶可以利用這些接口,打造適合業務的私人訂制的數據庫.來適配各種特殊場景的需求.
關鍵是你不必要了解數據庫內部的實現,只必要使用這些擴展接口就可以了.
全球使用最廣泛的地理位置信息管理系統PostGIS便是通過這種接口擴展的PostgreSQL插件.
(集自定義的數據類型,自定義的操作符,以及在GIN、GiST、SP-GiST、B-tree上開發的索引與一身的插件)
PostgreSQL是進程模式
進程模式也是優勢? 必需的.
相比線程模式,多進程相對來講穩定性較好,一個進程掛掉,重新拉起來就好,但是一個線程crash會導致整個進程都crash.
你肯定不希望給數據庫加個功能就把數據庫搞掛吧,如果是線程模式,擴展數據庫的功能就必要非常謹慎.
而PostgreSQL提供的接口已經有非常多年的歷史,通過這些接口開發的插件也是不可勝數,接口非常穩定,再加上進程模式,你可以大膽的擴展PostgreSQL的功能. 后面我會給大家看看有哪些不可勝數的插件.
BSD 許可
擦,BSD許可也是優勢? 必需的.
如果你要把你加過功能的PostgreSQL包裝成產物售賣,你就會發現BSD的好. 它允許你任意形式分發.
內核擴展指南
PostgreSQL內核概貌
如何闡發數據庫代碼的瓶頸
如何自定義UDF
C類型和SQL類型的對應關系
用戶獲取SQL參數的宏
用戶返回成果給SQL函數的宏
C UDF例子,SQL輸入為composite類型
C UDF例子,返回record類型的例子
C UDF例子,返回表(SRF)的例子
C UDF例子,反轉字符串的例子
如何編譯C FUNC、創立SQL FUNC
C函數是擴展中最基本的用法,必需掌握.
聚合、窗口、數據類型、操作符、索引,FDW等,都是圍繞或者直接基于C FUNC的.
后面你就會理解了,特別是看了語法后,會有更深刻的理解.
聚合函數原理
希望理解好迭代函數,迭代函數的輸入參數,初始迭代值,迭代中間結果,以及閉幕函數,和閉幕類型.
自定義聚合函數
自定義窗口函數
自定義數據類型
數據類型最基本的是輸入和輸出函數,分別將SQL的text輸入轉換成C的輸入,將C的輸出轉換成SQL的text.
文本是必要依賴字符編碼的,所以PG還支持基于二進制的輸入和輸出函數,通??梢杂脕韺崿F數據的邏輯復制,而不必要關心編碼的轉換問題,所見即所得.
自定義操作符
操作符其實也是函數的抽象,包含操作符的元,操作符的操作數的類型,以及操作符的等價操作符以及反轉操作符的定義(被query rewrite用來重寫SQL,以適用更多的執行計劃選擇)
例如: a<>1 等價于 not (a=1),這樣的,都是可以互換的.
與操作符相關的,還有優化器相關的OPTION以及JOIN的選擇性因子.
自定義操作符例子
自定義索引語法
自定義索引也非常簡單,需要實現索引辦法中必須的support函數,同時將操作符添加到索引的op class即可.
這些OP就可以用這個索引.
GIN索引接口介紹
GiST索引接口介紹
SP-GiST 索引接口介紹
BRIN, BTREE, hash索引接口介紹
gin,gist,sp-gist,brin索引接口的strategy是不固定的,用戶可以自行根據索引功能的形態增加.
btree和hash索引接口的strategy是固定的.
自定義GIN索引例子
取自contrib
PostgreSQL 內核擴展接口總結
如何打包與發布PostgreSQL 插件
GPU、FPGA如何與PostgreSQL深度整合
PG-Strom介紹
PG-Strom原理介紹
pg-strom利用了planner的hook,在生成執行計劃時,使用自定義的執行計劃生成器,打造屬于本身的執行計劃.
同時通過custom scan provider,用戶可以使用GPU計算單元使用DMA的方式直接拜訪塊設備,繞過了buffer cache,提升拜訪吞吐率.
同時自定義計算節點,包含JOIN,排序,分組,計算等,都可以交給GPU來處理.
這樣就實現了GPU加速的目的.
GPU加速方向
BULK數據計算.
例如:
動態路徑規劃.
基于BIT運算的人物、人群、企業、小區、城市畫像等.
大量數據的文天職析和學習.
動態路徑規劃
bit邏輯運算
PostGIS點面判斷
(筆誤,這可能不是gpu的強項,GPU的強項是BULK計算,對延遲沒要求,但是對處理才能有要求的場景.)
(點面判斷屬于OLTP的場景,不必要用到GPU)
除了GPU加速,其實LLVM也是BULK計算的加速方式之一,并且性能非常的棒.
Deepgreen, VitesseDB, Redshift都在使用LLVM技術,加速BULK 計算的場景.
【參考材料】
【擴展舉例】
PostgreSQL非常適合內核功能擴展,空口無憑.
我給大家列舉一些例子.
基因測序插件
https://colab.mpi-bremen.de/wiki/display/pbis/PostBIS
化學類型插件
http://rdkit.org/
指紋類型插件
地理位置信息管理插件
http://postgis.org/
K-V插件: hstore, json
流式數據處置插件
http://www.pipelinedb.com/
時間序列插件
https://github.com/tgres/tgres
近似度匹配: pg_trgm
ES插件
https://github.com/Mikulas/pg-es-fdw
R語言插件
http://www.joeconway.com/plr/
分布式插件
https://github.com/citusdata/citus
列存儲插件
https://github.com/citusdata/cstore_fdw
內存表插件
https://github.com/knizhnik/imcs
外部數據源插件
https://wiki.postgresql.org/wiki/Fdw
hll,bloom,等插件
數據挖掘插件
http://madlib.incubator.apache.org/
中文分詞插件
https://github.com/jaiminpan/pg_jieba
https://github.com/jaiminpan/pg_scws
cassandra插件
https://github.com/jaiminpan/cassandra2_fdw
阿里云的對象存儲插件 oss_fdw
https://yq.aliyun.com/articles/51199
... ...
可以找到開源PostgreSQL插件的處所
https://git.postgresql.org/gitweb/
http://pgxn.org/
http://pgfoundry.org/
https://github.com/
http://postgis.org/
http://pgrouting.org/
https://github.com/pgpointcloud/pointcloud
https://github.com/postgrespro
... ...
以上都是PostgreSQL非常適合內核擴展的見證.
想像一下可以擴展的行業
圖像辨認
基于地理位置,O2O的任務調度
電路板檢測
腳模
路徑規劃
透明的冷熱數據分離
物聯網行業
金融行業
... ...
PostgreSQL幾乎任何領域都可以深入進去.
【小結】
.1. PostgreSQL 的 進程模式 ,為內核擴展提供了非??孔V的保障.
.2. 你 不必要了解PG內核 是如何編寫的,你只必要了解業務,同時使用PG提供的API接口,擴展PG的功能.
.3. 幾乎所有擴展都是基于 C FUNC 的,所以你務需要掌握好PostgreSQL C FUNC的用法.
.4. PostgreSQL有 BSD許可 的優勢,在其他開源許可吃過虧的大型企業,現在都非常重視開源許可了.(如果你現在不重視,難道等著養肥了被殺^-^?)
.5. PostgreSQL的擴展才能是它的 核心競爭力 之一,好好的利用吧.
一起來打造屬于本身的數據庫,發揮PostgreSQL的真正實力,開啟一個新的數據庫時代吧.
歡迎參加阿里云!
PostgreSQL、Greenplum、MySQL、Redis、mongoDB、Hadoop、Spark、SQL Server、SAP、... ... 只要是你見過的數據庫,都有可能在阿里云上相遇.
技術提高生產力,一起為社會發明價值.
《如何找對業務G點, 體驗酸爽?PostgreSQL使用指南》是否對您有啟發,歡迎查看更多與《如何找對業務G點, 體驗酸爽?PostgreSQL使用指南》相關教程,學精學透。維易PHP學院為您提供精彩教程。