PostgreSQL 技術內幕(十七):FDW 實現原理與源碼解析

對于一定規模的系統而言,數據倉庫往往需要訪問外部數據來完成分析和計算。外部數據包裝器(Foreign Data Wrapper, 簡稱 FDW)是 PostgreSQL 提供的訪問外部數據源機制。用戶可以使用簡單的 SQL 語句訪問和操作外部數據源,就像操作本地表一樣。在上次直播中,我們深入探討了 PostgreSQL FDW 的基本概念、詳細使用方法、實現原理以及源碼實現。以下是根據直播內容整理成稿。

01 FDW 使用詳解

FDW 是 PostgreSQL 中的一項關鍵特性,它賦予數據庫用戶直接通過 SQL 語句訪問存儲于外部數據源的能力。FDW 遵循 SQL/MED 標準設計,使 PostgreSQL 能夠無縫對接多種異構數據庫系統以及非數據庫類數據源。FDW 可以用于以下場景:1.  跨數據庫查詢:在 PostgreSQL 數據庫中,我們可以通過 FDW 直接請求和查詢其他 PostgreSQL 實例,或是其他數據庫如 MySQL、Oracle、DB2、SQL Server 等。2.  數據整合:當我們需要從不同數據源整合數據時,例如 REST API、文件系統、NoSQL 數據庫以及流式系統等,FDW 能夠幫助我們輕松實現這種跨來源的數據整合。3.  數據遷移:利用 FDW,我們可以高效地將數據從舊系統遷移到新的 PostgreSQL 數據庫中。4.  實時數據訪問:通過 FDW,我們能夠訪問外部實時更新的數據源。
PostgreSQL 支持非常多常見的 FDW,能夠直接訪問多種類型的外部數據源。例如,可以連接并查詢遠程的 PostgreSQL,或者主流的 SQL 數據庫如 Oracle、MySQL、DB2 以及 SQL Server。同時,PostgreSQL FDW 也具備靈活的接口,支持用戶自定義外部訪問方式。504b896ad7da65398d710cb1f6b90b8f.jpeg表 1。常見的 FDW—SQL Database
此外,對于 NoSQL 數據庫,如 HBase、Cassandra、ClickHouse,以及實時數據庫如 InfluxDB、消息隊列如 Kafka、文檔型數據庫如 MongoDB 等等都能通過 FDW 實現數據訪問。800015065cf5d4ae470d2656767b7310.jpeg表 2。常見的 FDW—NoSQL Database
常見的文本格式數據,如 CSV、JSON、Parquet 和 XML,也可以通過 FDW 輕松訪問。大數據組件如 Elasticsearch、BigQuery,以及 Hadoop 生態系統中的 HDFS 和 Hive 等等都可以通過 FDW 實現無縫集成。34e95f748ceb7c9ea24179fc47ce7660.jpeg表 3。常見的 FDW—File Wrapper198c86b136f444190cbb27b6e07f01b0.jpeg表 4。常見的 FDW—Big Data
FDW 機制由四個核心組件構成:1. Foreign Data Wrapper:特定于各數據源的庫,定義了如何建立與外部數據源的連接、執行查詢及處理其他操作。例如,postgres_fdw用于連接其他 PostgreSQL 服務器,mysql_fdw則專門連接 MySQL 數據庫。2. Foreign Server:在本地 PostgreSQL 中定義一個外部服務器對象,對應實際的遠程或非本地數據存儲實例。3. User Mapping:為每個外部服務器設置用戶映射,明確哪些本地用戶有權訪問,并提供相應的認證信息,如用戶名和密碼。4. Foreign Table:在本地數據庫創建表結構,作為外部數據源中表的映射。對這些外部表發起的 SQL 查詢將被轉換并傳遞給相應的 FDW,在外部數據源上執行。接下來,我們以常見的 postgres_fdw 為例,來簡要探討一下 FDW 的基本使用方法。

  • 步驟一:創建插件

test=create extension postgres_fdw; CREATE EXTENSION

  • 步驟二:創建 Foreign Server

CREATE SERVER foreign_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '127.0.0.1', port '8001', dbname 'postgres');

  • 步驟三:創建 User Mapping

CREATE USER MAPPING FOR gpadmin SERVER foreign_server;

  • 步驟四:創建外部表

CREATE FOREIGN TABLE foreign_table ( val int ) SERVER foreign_server OPTIONS (schema_name 'public', table_name 't2');


02 FDW 實現原理

在 PostgreSQL 的內核代碼中,FDW 訪問外部數據源的操作接口主要通過 FdwRoutine 這一結構體進行定義。任何接入外部數據源的插件都可以根據自身需要去實現這些接口。26b9545adf3e84688bbbd287a36a15f0.jpeg圖 1.FdwRoutine 定義了外部數據操作的接口
接口函數大致分為多個類別,包括但不限于掃描、修改、分析外部表等等。例如,掃描外部表相關接口定義了如何掃描外部表,常見的操作包括開始掃描( BeginForeignScan,主要進行準備工作)、執行掃描(IterateForeignScan,從掃描中獲取數據)、重新掃描(RescanForeignScan)以及結束掃描(EndForeignScan)等。0c0b2f82ff757d89ede3e753eb62b23b.jpeg圖 2。掃描外部表相關接口
此外,還有用于修改數據的外部表接口,支持對數據進行 insert、delete、update 等操作,以及 explain 和 analyze 等外部表接口327da433a53fe2ec72465bbce67b360e.jpeginsert/delete/update 外部表接口47be6d68bc7067b053d73dfea89ea762.jpegexplain/analyze 外部表接口
注:需要明確的是,當實現一個訪問外部數據源的 FDW 時,并不需要實現以上提到所有的外部訪問數據接口。開發者只需根據實際需求實現對應的接口即可。例如,如果只訪問查詢某個 Web 數據源而不進行修改或刪除操作,那么就不需要實現關于刪改和更新的操作接口,只需實現 SCAN 掃描相關的接口即可。
如下圖,這是一個 FDW 插件實現 FdwRoutine 的示例,這里僅實現了一些基礎的掃描操作接口(如BeginForeignScan、IterateForeignScan等),以及用于性能分析的AnalyzeForeignTable接口。9d14366668cc4418d7ee8fefb74e2ba2.jpeg插件實現 FdwRoutine在 PostgreSQL 的執行過程中,這些接口函數會在 planner 或 executor 階段被調用。尤其是當 executor 需要依賴外部服務插件訪問數據時,它會通過插件提供的數據訪問接口來獲取數據。這使得 FDW 能夠與 PostgreSQL 的 Parser、Planner 以及 Rewriter 等組件能夠無縫協作。6b6158ea5280e3312a68f31bc09e9728.jpeg在需要訪問外部數據源時,我們只需定義好相應的數據訪問接口,就能直接獲取數據,并按照 PostgreSQL 的標準流程進行后續處理。在執行過程中,執行器會分解為幾個階段進行:1、首先進入 init 階段,核心任務是執行外部表掃描ExecInitForeignScan。在這個階段,主要是定義了一些外部掃描的接口,并調用 FdwRoutine 中用戶自定義的接口,從而進行掃描前的準備。add8908ea6427a79dfde206b3c991ccb.jpeg執行 scan 前的準備
2、緊接著是執行查詢階段,此時會調用ExecuteForeignScan 方法。在這個方法中,我們主要需指定ForeignNext 來獲取下一組數據,并定義 ForeignRecheck 來檢驗數據元組的可見性。
db62df9bfaa448aa11b88665c5d6659e.jpeg執行查詢階段
3、最后進入結束查詢階段,即執行 EndForeignScan,該階段主要負責資源清理工作。若系統檢測到存在 FDWRoutine,就會利用用戶自定義的 EndForeignScan 函數來釋放資源。
ad383abd0739acb66bbde0b978adf044.jpeg結束查詢階段以上就是 FDW 整體的實現流程。接下來,為了更深入地了解 FDW 的工作機制,我們將深入探討 FDW 的源碼。

03 FDW 源碼解析

FDW 支持的數據類型眾多,但在此我們以常見的Postgres_fdw為例,剖析其源碼實現,同樣可幫助理解其他 FDW 的源碼邏輯。

FdwRoutine 定義

首先,我們需要定義 FdwRoutine。前文提到了 FdwRoutine 主要負責定義外部數據掃描的接口,接口需要自定義實現外部掃描的方法。b97f89a1474164f71bfe02eb9b547ead.jpegFdwRoutine 定義

訪問外部數據源

定義好 FdwRoutine 之后,開始訪問并掃描外部數據源。在Postgres_fdw中,流程也就是進入BeginForeign Scan階段。這一階段主要是獲取我們先前定義的外部表實例和用戶信息,然后初始化并獲取一個連接到遠端數據源。c9907ee46a98f61d85cff0eaee165145.jpegpostgresBeginForeignScan

執行查詢階段

獲取連接后,執行查詢,即進行 IterateForeignScan階段。這個過程的邏輯是創建一個游標迭代器(cursor),并從 cursor 中持續獲取數據。6ab39dd16bee4f4c5a60315c4b4b0a2d.jpegpostgresIterateForeignScan當全部數據迭代或掃描完成后,我們會釋放連接并關閉 cursor 等資源,通過自定義的EndForeignScan階段完成。20c3f5c464580c93ba21d75ba2290581.jpegpostgresEndForeignScan

insert 操作

對于 insert 操作,例如,在本地 PostgreSQL 數據庫中修改 Web 數據源,增加一條數據,需要訪問插入 Web 數據的接口。此操作先進入BeginForeignInsert階段,任務是構造 SQL 語句,通過預處理語句進行初始化,做好插入準備。83fc8e34b01deabfd6afbcf18c7d7311.jpegpostgresBeginForeignInsert
之后,進入ExecuteForeignInsert階段,執行數據插入,主要通過預處理語句傳遞參數,然后發送 SQL 到遠端執行。2d962570875bd864932566802d54f7a9.jpegpostgresExecForeignInsert最后,EndForeignInsert階段負責收尾和資源清理。dc2ece23bc685b20d68d6b4931f8fcc0.jpegpostgresEndForeignInsert

更新/刪除操作

更新和刪除操作的邏輯與插入類似。首先進入BeginDirectModify階段,進行數據修改前的準備,如構建查詢語句、獲取連接等。隨后執行修改操作,主要通過發送參數和查詢到遠端來執行。
e0ec6164b65f388a2da7c130b1e0e3cd.jpegpostgresBeginDirectModify
133520f7504c0b47539097ad3efff262.jpegpostgresIterateDirectModify

本次分享,我們為大家講解了 FDW 基本概念、使用場景、實現原理,以及源碼解析,文章篇幅有限,更多技術細節講解歡迎大家訪問 B 站 https://www.bilibili.com/video/BV1pf421X7pk/?share_source=copy_web&vd_source=9f256c264f70725955bae178113d4bee,觀看視頻回放,希望能與朋友們一起更好地理解和用好 FDW。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40620.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python面試題:Python 中的生成器(generator)是什么?有什么優點?

在Python中,生成器(generator)是一種特殊的迭代器,使用yield關鍵字生成值,可以逐個生成序列中的值,而不需要一次性將所有值加載到內存中。生成器函數在定義時使用def關鍵字,并包含一個或多個yie…

[word] Word如何快速生成一段文本 #知識分享#學習方法

Word如何快速生成一段文本 Word如何快速生成一段文本?有時候我們會用一大段文字來做一些功能測試,不少朋友的做法就是臉滾鍵盤,一頓亂按,這樣看起來文筆不通,看著也會比較難受,測試功能的效果也不怎么理想…

uniapp中實現跳轉鏈接到游覽器(安卓-h5)

uniapp中實現跳轉鏈接到游覽器(安卓-h5) 項目中需要做到跳轉到外部鏈接,網上找了很多都不是很符合自己的要求,需要編譯成app后是跳轉到游覽器打開鏈接,編譯成web是在新窗口打開鏈接。實現的代碼如下: 效果&…

java基于ssm+vue 旅游信息資源平臺

1前臺首頁功能模塊 旅游資源網站 ,在系統首頁可以查看首頁、景點信息、酒店信息、客房信息、交流論壇、紅色文化、個人中心、后臺管理、客服等內容,如圖1所示。 圖1系統功能界面圖 用戶登錄、用戶注冊,在注冊頁面可以填寫用戶名、密碼、姓名…

Redis GEO 功能解析

Redis GEO 功能解析 引言 Redis GEO 是 Redis 數據庫提供的一個特殊功能,用于存儲地理位置信息,并支持基于地理位置的查詢。這一功能對于需要處理地理位置數據的現代應用程序來說非常寶貴,如外賣配送、社交媒體、地圖服務等。本文將詳細介紹 Redis GEO 的功能、使用方法,…

DFS之剪枝與優化——AcWing 165. 小貓爬山

DFS之剪枝與優化 定義 DFS之剪枝與優化指的是在執行深度優先搜索(DFS, Depth-First Search)時,采取的一系列策略來減少搜索空間,避免無效計算,從而加速找到問題的解。剪枝是指在搜索過程中,當遇到某些條件不符合解的要求或者可以…

產科管理信息系統源碼:產科電子病歷、高危孕產婦五色管理系統源碼 孕產婦健康管理信息平臺源碼

產科管理信息系統源碼:產科電子病歷、高危孕產婦五色管理系統源碼 孕產婦健康管理信息平臺源碼 產科電子病歷系統是以采集病人在整個醫療護理過程中所產生的各種信息。包括病案首頁、門診病歷、住院病歷、出院記錄、病人病程記錄等全部病歷文書;涵蓋文字…

宿舍報修小程序的設計

管理員賬戶功能包括:系統首頁,個人中心,管理員管理,基礎數據管理,論壇管理,故障上報管理,新聞信息管理,維修人員管理 微信端賬號功能包括:系統首頁,新聞信息…

node.js外賣小程序-計算機畢業設計源碼81838

摘要 自從計算機發展開始,計算機軟硬件相關技術的發展速度越來越快,在信息化高速發展的今天,計算機應用技術似乎已經應用到了各個領域。在餐飲行業,除了外賣以外就是到店里就餐,在店里就餐如果需要等待點餐的話&…

轉盤輸入法-單獨鼠標版本

序 轉盤輸入法,給你的聊天加點新意。它不用常見的九宮格或全鍵盤,而是把字母擺在圓盤上,一滑一滑,字就出來了,新鮮又直接。 單獨鼠標版本GIF演示 演示軟件下載 轉盤輸入法https://download.csdn.net/download/u0146…

zdppy+vue3+antd 實現表格數據渲染

基本用法 <template><a-table :columns"columns" :data-source"data"><template #headerCell"{ column }"><template v-if"column.key name"><span>xxx Name</span></template></temp…

免費鼠標連點器有嗎?需要付費嗎?鼠標連點器電腦版免費推薦6款!

在數字化時代&#xff0c;鼠標連點器成為了許多用戶提高工作效率、優化游戲體驗的得力助手。然而&#xff0c;面對市場上琳瑯滿目的鼠標連點器軟件&#xff0c;很多用戶都會產生疑問&#xff1a;是否有免費的鼠標連點器&#xff1f;它們真的需要付費嗎&#xff1f;今天&#xf…

名企面試必問30題(二十二)——你對加班的看法?

1.思路 實際上&#xff0c;很多公司詢問此問題&#xff0c;并非表明一定要加班&#xff0c;只是想測試您是否愿意為公司奉獻。在回答時&#xff0c;一定不能有諸如不接受加班、不接受 996 等話語&#xff0c;因為沒有公司能承諾永遠不加班。主要回答應圍繞因何原因加班&#xf…

lua入門(1) - 基本語法

本文參考自&#xff1a; Lua 基本語法 | 菜鳥教程 (runoob.com) 需要更加詳細了解的還請參看lua 上方鏈接 交互式編程 Lua 提供了交互式編程模式。我們可以在命令行中輸入程序并立即查看效果。 Lua 交互式編程模式可以通過命令 lua -i 或 lua 來啟用&#xff1a; 如下圖: 按…

物理刪除和邏輯刪除區別

物理刪除和邏輯刪除是數據庫管理中針對記錄刪除操作的兩種不同方式&#xff0c;它們的主要區別在于數據的實際處理和后續影響&#xff1a; 物理刪除&#xff1a; 操作實質&#xff1a;物理刪除會將數據記錄從數據庫表中徹底移除&#xff0c;包括記錄所占的磁盤空間都會被釋放。…

Vue3 對跳轉 同一路由傳入不同參數的頁面分別進行緩存

1&#xff1a;使用場景 從列表頁跳轉至不同的詳情頁面&#xff0c;對這些詳情頁面分別進行緩存 2&#xff1a;核心代碼 2.1: 配置路由文件 在路由文件里對需要進行緩存的路由對象添加meta 屬性 // 需要緩存的詳情頁面路由 { name: detail, path: /myRouter/detail…

十大排序:插入/希爾/選擇/堆/冒泡/快速/歸并/計數/基數/桶排序 匯總(C語言)

目錄 前言非線性時間比較類插入排序(1) 直接插入排序(2) 希爾排序 選擇排序(3) 選擇排序優化版(4) 堆排序 交換排序(5) 冒泡排序(6) 快速排序hoare版本挖坑版前后指針版非遞歸版 歸并排序(7) 歸并排序遞歸版非遞歸版 線性時間比較類(8) 計數排序基數排序與桶排序 總結 前言 在計…

報文交換 和 電路交換對比說明

報文交換 和 電路交換 是兩種不同的網絡通信方式&#xff0c;它們在數據傳輸的方式、效率、成本和適用場景等方面有所不同。下面詳細對比這兩種交換方式&#xff0c;并舉例說明。 報文交換&#xff08;Message Switching&#xff09; 定義&#xff1a;報文交換是一種存儲-轉發…

昇思25天學習打卡營第13天|基于MindSpore通過GPT實現情感分類

基于MindSpore通過GPT實現情感分類 情感分類 情感分類是指在自然語言處理(NLP)領域中,通過分析文本內容所表達的情感傾向,將文本歸類為正面、負面或中性等類別的任務。 在情感分類中,基于不同的方法和技術,可以分為基于情感詞典的方法、基于傳統機器學習的方法和基于深…

c++筆試題

語言特性 題目1&#xff1a;請解釋C11中新引入的auto和decltype關鍵字&#xff0c;并給出使用示例。 題目2&#xff1a;什么是RAII&#xff08;Resource Acquisition Is Initialization&#xff09;&#xff1f;請解釋其原理并舉例說明。 題目3&#xff1a;C11引入了move se…