用數據庫就像帶裝修的房子一樣,如果按數據庫的功能劃分,可以分為豪華裝修、精裝、簡裝。
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還支持基于二進制的輸入和輸出函數,通常可以用來實現數據的邏輯復制,而不需要關心編碼的轉換問題,所見即所得。
自定義操作符
操作符其實也是函數的抽象,包括操作符的元,操作符的操作數的類型,以及操作符的等價操作符以及反轉操作符的定義(被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 的 進程模式 ,為內核擴展提供了非常靠譜的保障。
.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、... ... 只要是你見過的數據庫,都有可能在阿里云上相遇。
技術提高生產力,一起為社會創造價值。
自MachineLearningMastery
作者:William Vorhies
機器之心編譯
參與:Jason Brownlee
在 LSTM 循環神經網絡面臨長序列輸入時,我們應該怎樣應對?Jason Brownlee 給了我們 6 種解決方案。
長短期記憶(LSTM)循環神經網絡可以學習和記憶長段序列的輸入。如果你的問題對于每個輸入都有一個輸出(如時間序列預測和文本翻譯任務),那么 LSTM 可以運行得很好。但 LSTM 在面臨超長輸入序列——單個或少量輸出的情形時就會遇到困難了。這種問題通常被稱為序列標記,或序列分類。
其中的一些例子包括:
包含數千個單詞的文本內容情緒分類(自然語言處理)。
分類數千個時間步長的腦電圖數據(醫療領域)。
分類數千個 DNA 堿基對的編碼/非編碼基因序列(基因信息學)。
當使用循環神經網絡(如 LSTM)時,這些所謂的序列分類任務需要特殊處理。在這篇文章中,你將發現 6 種處理長序列的方法。
1. 原封不動
原封不動地訓練/輸入,這或許會導致訓練時間大大增長。另外,嘗試在很長的序列里進行反向傳播可能會導致梯度消失,反過來會削弱模型的可靠性。在大型 LSTM 模型中,步長通常會被限制在 250-500 之間。
2. 截斷序列
處理非常長的序列時,最直觀的方式就是截斷它們。這可以通過在開始或結束輸入序列時選擇性地刪除一些時間步來完成。這種方式通過失去部分數據的代價來讓序列縮短到可以控制的長度,而風險也顯而易見:部分對于準確預測有利的數據可能會在這個過程中丟失。
3. 總結序列
在某些領域中,我們可以嘗試總結輸入序列的內容。例如,在輸入序列為文字的時候,我們可以刪除所有低于指定字頻的文字。我們也可以僅保留整個訓練數據集中超過某個指定值的文字。總結可以使得系統專注于相關性最高的問題,同時縮短了輸入序列的長度。
4. 隨機取樣
相對更不系統的總結序列方式就是隨機取樣了。我們可以在序列中隨機選擇時間步長并刪除它們,從而將序列縮短至指定長度。我們也可以指定總長的選擇隨機連續子序列,從而兼顧重疊或非重疊內容。
在缺乏系統縮短序列長度的方式時,這種方法可以奏效。這種方法也可以用于數據擴充,創造很多可能不同的輸入序列。當可用的數據有限時,這種方法可以提升模型的魯棒性。
5. 時間截斷的反向傳播
除基于整個序列更新模型的方法之外,我們還可以在最后的數個時間步中估計梯度。這種方法被稱為「時間截斷的反向傳播(TBPTT)」。它可以顯著加速循環神經網絡(如 LSTM)長序列學習的過程。
這將允許所有輸入并執行的序列向前傳遞,但僅有最后數十或數百時間步會被估計梯度,并用于權重更新。一些最新的 LSTM 應用允許我們指定用于更新的時間步數,分離出一部分輸入序列以供使用。例如:
Theano 中的「truncate_gradient」參數:http://deeplearning.net/software/theano/library/scan.html
6. 使用編碼器-解碼器架構
你可以使用自編碼器來讓長序列表示為新長度,然后解碼網絡將編碼表示解釋為所需輸出。這可以是讓無監督自編碼器成為序列上的預處理傳遞者,或近期用于神經語言翻譯的編碼器-解碼器 LSTM 網絡。
當然,目前機器學習系統從超長序列中學習或許仍然非常困難,但通過復雜的架構和以上一種或幾種方法的結合,我們是可以找到辦法解決這些問題的。
其他瘋狂的想法
這里還有一些未被充分驗證過的想法可供參考。
將輸入序列拆分為多個固定長度的子序列,并構建一種模型,將每個子序列作為單獨的特征(例如并行輸入序列)進行訓練。
雙向 LSTM,其中每個 LSTM 單元對的一部分處理輸入序列的一半,在輸出至層外時組合。這種方法可以將序列分為兩塊或多塊處理。
我們還可以探索序列感知編碼方法、投影法甚至哈希算法來將時間步的數量減少到指定長度。
擴展閱讀
序列標記:https://en.wikipedia.org/wiki/Sequence_labeling
序列分類簡述:http://dl.acm.org/citation.cfm?id=1882478
軟官方發布了2022年03月的安全更新。本月更新公布了92個漏洞,包含29個遠程執行代碼漏洞、25個特權提升漏洞、6個信息泄露漏洞、4個拒絕服務漏洞、3個身份假冒漏洞、3個安全功能繞過漏洞以及1個篡改漏洞,其中3個漏洞級別為“Critical”(高危),68個為“Important”(嚴重)。建議用戶及時使用火絨安全軟件(個人/企業)【漏洞修復】功能更新補丁。
Microsoft Exchange Server 遠程代碼執行漏洞
CVE-2022-23277
嚴重級別:高危 CVSS:8.8
被利用級別:很有可能被利用
經過身份驗證的攻擊者可以利用該漏洞在Exchange Server上執行任意代碼。其影響范圍包括Exchange Server 2013、2016、2019在內的版本。火絨工程師建議用戶及時修復此漏洞。
Windows SMBv3 Client/Server 遠程代碼執行漏洞
CVE-2022-24508
嚴重級別:嚴重 CVSS:8.8
被利用級別:很有可能被利用
經過身份驗證的攻擊者可以利用該漏洞在客戶端/服務器上執行任意代碼。其影響范圍是Windows10 2004以上的版本,舊版本的 Windows 不受影響。
Windows Event Tracing 遠程代碼執行漏洞
CVE-2022-23294
嚴重級別:嚴重 CVSS:8.8
被利用級別:很有可能被利用
經過身份驗證的攻擊者可能會利用此漏洞對服務器端事件日志的遠程過程調用 (RPC) 執行任意代碼。
Windows Remote Desktop Client 遠程代碼執行漏洞
CVE-2022-21990/CVE-2022-23285
嚴重級別:嚴重 CVSS:8.8
被利用級別:很有可能被利用
該漏洞需要用戶交互,成功利用該漏洞的攻擊者可以在 RDP 客戶端計算機上執行任意代碼。
1、通過火絨個人版/企業版【漏洞修復】功能修復漏洞。
2、下載微軟官方提供的補丁
https://msrc.microsoft.com/update-guide
完整微軟通告:
https://msrc.microsoft.com/update-guide/releaseNote/2022-Mar
*請認真填寫需求信息,我們會在24小時內與您取得聯系。