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