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.mzph.cn/web/40620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[word] Word如何快速生成一段文本 #知识分享#学习方法

Word如何快速生成一段文本 Word如何快速生成一段文本?有时候我们会用一大段文字来做一些功能测试,不少朋友的做法就是脸滚键盘,一顿乱按,这样看起来文笔不通,看着也会比较难受,测试功能的效果也不怎么理想…

uniapp中实现跳转链接到游览器(安卓-h5)

uniapp中实现跳转链接到游览器(安卓-h5) 项目中需要做到跳转到外部链接,网上找了很多都不是很符合自己的要求,需要编译成app后是跳转到游览器打开链接,编译成web是在新窗口打开链接。实现的代码如下: 效果&…

java基于ssm+vue 旅游信息资源平台

1前台首页功能模块 旅游资源网站 ,在系统首页可以查看首页、景点信息、酒店信息、客房信息、交流论坛、红色文化、个人中心、后台管理、客服等内容,如图1所示。 图1系统功能界面图 用户登录、用户注册,在注册页面可以填写用户名、密码、姓名…

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…

lua入门(1) - 基本语法

本文参考自&#xff1a; Lua 基本语法 | 菜鸟教程 (runoob.com) 需要更加详细了解的还请参看lua 上方链接 交互式编程 Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用&#xff1a; 如下图: 按…

十大排序:插入/希尔/选择/堆/冒泡/快速/归并/计数/基数/桶排序 汇总(C语言)

目录 前言非线性时间比较类插入排序(1) 直接插入排序(2) 希尔排序 选择排序(3) 选择排序优化版(4) 堆排序 交换排序(5) 冒泡排序(6) 快速排序hoare版本挖坑版前后指针版非递归版 归并排序(7) 归并排序递归版非递归版 线性时间比较类(8) 计数排序基数排序与桶排序 总结 前言 在计…

【unity实战】使用旧输入系统Input Manager 写一个 2D 平台游戏玩家控制器——包括移动、跳跃、滑墙、蹬墙跳

最终效果 文章目录 最终效果素材下载人物环境 简单绘制环境角色移动跳跃视差和摄像机跟随效果奔跑动画切换跳跃动画&#xff0c;跳跃次数限制角色添加2d物理材质&#xff0c;防止角色粘在墙上如果角色移动时背景出现黑线条方法一方法二 墙壁滑行实现角色滑墙不可以通过移动离开…

Web贵州旅游攻略系统-计算机毕业设计源码16663

目 录 第 1 章 引 言 1.1 选题背景与意义 1.2 国内外研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系…

前端面试题18(js字符串特定内容查找方法)

在JavaScript中&#xff0c;有多种方法可以用来查找字符串中的特定内容。以下是一些常用的方法&#xff0c;包括它们的用途和示例代码&#xff1a; 1. indexOf() indexOf() 方法返回指定文本在字符串中第一次出现的索引&#xff08;位置&#xff09;&#xff0c;如果没有找到…

【vue组件库搭建04】使用vitepress搭建站点并部署到github

前言 基于vitePress搭建文档站点&#xff0c;使用github pages进行部署 安装VitePress 1.Node.js 18 及以上版本 2.npm add -D vitepress 3.npx vitepress init 4.将需要回答几个简单的问题&#xff1a; ┌ Welcome to VitePress! │ ◇ Where should VitePress initi…

Cesium 二三维热力图

Cesium 二三维热力图 原理&#xff1a;主要依靠heatmap.js包来实现 效果图&#xff1a;

从零开始使用WordPress搭建个人网站并一键发布公网详细教程

文章目录 前言1. 搭建网站&#xff1a;安装WordPress2. 搭建网站&#xff1a;创建WordPress数据库3. 搭建网站&#xff1a;安装相对URL插件4. 搭建网站&#xff1a;内网穿透发布网站4.1 命令行方式&#xff1a;4.2. 配置wordpress公网地址 5. 固定WordPress公网地址5.1. 固定地…

【LabVIEW学习篇 - 2】:LabVIEW的编程特点

文章目录 LabVIEW的编程特点图形编程天然并行运行基于数据流运行 LabVIEW的编程特点 图形编程 LabVIEW使用图形化的图形化编程语言&#xff08;G语言&#xff09;&#xff0c;用户通过在程序框图中拖放和连接各种节点&#xff08;Nodes&#xff09;来编写程序。每个节点代表一…

LLM - 循环神经网络(RNN)

1. RNN的关键点&#xff1a;即在处理序列数据时会有顺序的记忆。比如&#xff0c;RNN在处理一个字符串时&#xff0c;在对字母表顺序有记忆的前提下&#xff0c;处理这个字符串会更容易。就像人一样&#xff0c;读取下面第一个字符串会更容易&#xff0c;因为人对字母出现的顺序…