暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB for PostgreSQL 开源必读手册-Foreign Data Wrappers(FDW)使用介绍

Aug_33 2023-11-20
374


image.png

 

FDW(Foreign Data Wrapper)是PolarDB数据库提供的与异构数据库进行数据交流的方式,可以通过FDW对异构数据库进行数据访问,类似于Oracle的DBLink,但FDW的功能更强大。

 

当前,数据库国产化是一个大趋势。将数据从Oracle迁移到国产数据库,通过FDW可轻松实现。但很多开发者在原来的Oracle数据库上使用了包存储,迁移时涉及到应用、开发上的修改,难度极大,甚至可能还需要开发新的适合国产数据库的业务。

 

image.png

 

FDW的访问与本地访问一致,不管远程数据库是PG、MySQL还是Oracle,通过select count(*) From即可实现访问。

 

 

image.png

 

上图为FDW的执行流程。

 

SQL语句执行前需要进行解析,访问FDW表也同理,PolarDB会对SQL进行解析。数据表放在另外的数据库,因此PolarDB需要查询数据字典,确认当前表的创建方式,判断其是否为外部表。如果是,还需查看外部表所在的服务器以及用户mapping。随后,产生执行计划,再将要执行的SQL语句传到远程服务器,最后将结果返回到本地。

 

image.png

 

总结来看,FDW的执行流程分为以下几步:

 

a) 创建查询树。

b) 连到远程服务器查看是否存在表及其权限。

c) 本地优化器创建执行计划。

d) 根据优化器的执行计划再还原成文本的SQL语句,将SQL语句传到远程。不同的异构数据库语法存在差异,此处会转成异构数据库能够兼容的语法。

e) 远程服务器执行SQL语句,将结果返回给本地。


 

image.png

 

Deparesing是将执行计划做反解析,变为SQL语句。

 

FDW从本地将语句传到远程,远程执行完以后再将数据传回到本地。

 

image.png

 

上图为远程服务器上的日志。执行外部的SQL语句时,会将事务变为repeatable read隔离模式,然后声明一个游标,绑定游标执行,执行后将数据返回,关闭游标,结束事务。

 

发请求时,远程服务器有可能被修改,因此我们将事务变为可重复读的隔离级别。

随着版本的更新,FDW的功能越来越强大,性能越来越好。

 

image.png

 

FDW最早在PG9.3版本推出。

 

PG9.6新增了以下特性:如果SQL语句带有排序,则会在远程排序以后将数据返回到本地,省去本地排序的操作,提高了性能;如果两张表的连接都为远程,则会在远程将两张表的数据进行连接,连接后将处理结果传到本地;如果数据库是PolarDB对PolarDB,则可支持DML操作;可以根据网络带宽的情况设置返回的行数,减少对网络带宽的占用。

 

PG10版本中,新增的特性为:如果操作里带有聚簇函数的操作,则聚簇的计算在远程完成,将结果返回到本地,省去了将元数据传到本地再排序所占据的网络带宽。

 

image.png

如果两个数据库支持update,比如PolarDB对PolarDB,用FDW对远程的表进行更新时,可以实现不同事务修改同一张表的同一行。而按照以往的情况,该种场景下会造成死锁。

 

image.png

 

FDW9.5之前的版本中,多表扫描需要从远程服务器扫描数据,然后传到本地,在本地做连接操作。

 

image.png

 

而FDW9.5以后,打开use_remote_estimate,计划器将通过执行EXPLAIN命令向远程服务器查询计划的成本。做多表连接时,连接操作在远程服务器执行,执行完以后将数据传到本地,极大减少了数据在网络之间的传输。 


image.png

 

上图为FDW9.5之前做外部连接的流程,代价较大。

 

image.png

 

上图为FDW9.5后的外部链接流程,打开use_remote_estimate后,连接在远程完成,极大提高了查询性能。

 

image.png

 

在9.5版本之前,排序也需要从远程将数据传到本地,然后在本地做sort操作。

 

image.png

 

而9.5之后的版本中,排序操作被下推到远程服务器,排序完成后将结果返回至本地即可。

 

image.png

 

image.png

 

聚合操作同理。在10版本之后,本地不再做聚合,而是由远程服务器来完成。

综上,新版本的FDW性能得到了较大的提高。

 

部署演示

 

Postgres_FDW部署

 

image.png

 

首先,添加扩展,安装外界PolarDB扩展。创建server并为其命名,传入远程PolarDB名、服务端口以及要访问的数据库名,用于连接远程服务器。远程服务器上应配置好权限,即允许哪台客户端访问服务器。

 

image.png

 

通过\des命令可查看当前有哪些外部服务器以及对应的主机信息,如上图所示。

 

注意,因为PolarDB由很多数据库组成,在create FDW时,在哪个数据库上部署FDW,则FDW只能在该数据库上使用。

 

 

 

创建用户并为其授权,使其有权创建外部表,然后创建用户映射。

 

有了用户映射后,比如远程服务器是postgres用户,本地的scott用户也可对其进行访问,即能够以不同的用户来访问不同表的数据。

 

image.png

 

创建外部表,创建时后面需要跟上外部的服务器、schema以及远程表的名字。

image.png


通过\d查询,当前scott_pg用户下有dept_fdw和emp_fdw两个外部表,访问外部表与访问本地表没有任何区别。

 

 

可以通过\ds+emp_fdw查看该表,结果会显示它为外部表以及它的访问模式、远程服务器等信息。

 

File_FDW部署

 

image.png

 

首先,添加扩展,创建本地插件,创建基于本地FDW的server,将权限赋予相应的用户。

 

创建外部表。因为需要引用本地某文本文件里的数据,因此后面需指定file name即数据源路径,并指定格式为CSV,代表用逗号隔开列与列之间的数据。

 

image.png

 

创建成功后,查看该表。

 

/home/postgres/emp2.csv文件的产生有两种方式:

 

• 其一,如果是外部的文本文件,采集时将列与列之间用逗号隔开即可。

• 其二,如果是自己创建的外部表,通过上图语句将emp的内容进行复制即可。

 

image.png

 

最终,用户可以像访问内部表一样访问外部表,非常方便。此外,基于文件的外部表为只读,不能做DML操作。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论