开发者学堂课程【PolarDB for PostgreSQL 开源人才初级认证培训课程:Foreign Data Wrappers(FDW)】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1077/detail/15552
Foreign Data Wrappers(FDW)
内容介绍:
一、 Foreign Data Wrappers(FDW)简介与特性
二、 Postgres_FDW 部署
三、 File_FDW 部署
Foreign Data Wrappers(FW),学了这节课以后,要了解一下 FDW 的一个特性,还有怎么样去部署,然后怎么使用。
一、Foreign Data Wrappers(FDW)简介与特性
首先看一下什么叫 FDW 呢?
是 Polar DB 数据库,它提供了一个对异构数据库进行数据交流的一种方式,可以通过 FDW 跟这些异构数据库进行数据的一个访问。
就类似于Oracle的delink,然后通过delink对Oracle不同数据库的数据,进行交互,FDW其实它的功能比的delink要强很多,因为它支持异构数据库。
所以现在进入了信创时代,很多都就是数据库国产化,实际上把数据重Oracle迁移到国产数据库,比方PG或者polar,比实际上迁移数据,是非常简单的,用FDW就可以很容易的实现,但是难就难在应用上因为有很多开发者在原来Oracle数据库上面用了很多这种包存储过程,迁移的时候,就要涉及到应用开发上面的修改,所以难度是比较大,而且不是解决不了,可能你还要投入新的开发经费去开发一个适合国产数据库的这种业务。这样的话投入就比较大了,这是FDW。
FDW如果创建完以后,看一下它的访问,就跟访问本地一样,看一下,比方访问远程的服务器是也是PG服务器,访问的时候,搜索语句不需要单独的一个语法,就跟访问本地一样,不管远程数据库是PG也好,或者MY Circle,或者Oracle都一样,非常方便。
这里要了解一下FDW的一个执行的一个流程,执行的时候,知道SQL语句执行前面,肯定要进行一个解析,也是一样的访问FDW。
Polar DB也要去解析,解析的时候注意,可以理解为它是一个外部表,数据表,是放在另外一个数据库,所以这时Polar要查询一下数据字典,看一下当前表的一个创建方式,可以理解为外部表。如果是还要看外部表所在的服务器哪里,还有用户比方远程服务器的用户,如果是SQL,然后在本地,用户可能是Post Grass,这样要创建用户映射。创建完以后,产生怎么样执行计划,然后再把要执行的搜索语句传到远程服务器。然后把结果返回给本地。
总结:
首先要创建一个查询树。然后连到远程服务器,远程服务器看一下有没有这表,权限够不够,然后接下来注意本地的优化器,要创建一个执行计划。当然执行计划是本地的好,之后要做一个party,party是什么?根据优化器的执行计划,再还原成一个文本的SQL语句,然后把SQL语句传到远程,可能不同的异构数据库,它的语法有一些差异,然后它会转成异构数据库, 能够慢慢兼容的语法,然后远程服务器执行SQL语句,把结果返回给本地,所以注意一下,这里有一个叫做Deparesing过程。这是FDW的一个执行流程。
这是一个执行的一个一个过程,一个执行树。就是一个Deparesing的一个过程,Deparesing就是把执行计划,做个缓解性变成Serveral语句。
看一下,如果用FDW,本地把语句传到远程,远程执行完以后把数据传到本地。
远程的服务器,执行的时候,运的是什么样一个方式呢?
注意:是我们在远程服务器上面看到的日志,日志是在远程服务器上面,当去执行外部的一个搜索语句的时候,注意它会把事物变成是一个Read re pea table read这种隔离模式,然后会声明一个游标,然后绑定游标执行,执行完以后,把数据返回,然后关闭游标,结束事物,所以它是一个事物的一个开始方式,而且事物的隔离级别叫做repeat double可重复读,这是因为在发请求的时候,有可能远程服务器被修改了,所以把这种事物变成repeat double可重复读的这种隔离级别。
不同版本的FDW,随着版本的更新,功能越来越强大,性能越来越好,首先给大家介绍一下FDW是在PG9.3版本的时候推出来,Polar DB,现在是11版本,所以是完全支持的,在9.6版本注意了,执行的时候注意看排序的时候,它是在远程,就是如果搜索语句。如果带有排序,然后它是在远程排完序以后,把数据返回给本地。
这样就省去了排序,在本地排序的一个操作,可以提高性,如果两张表的连接都是远程的,远程把两张表的数据进行连接,连接完以后把处理的结果传到本地,
注意,如果数据库是Polar DB对Polar DB,它支持这种DML操作,但是如果你Polar DB,对Oracle是不支持的大家注意。还有允许确定比方以后返回的函数是多少?
假如要返回很多行,可以根据网络带宽的情况去设置返回的函数,这样可以减少对网络带宽的一个战略。
然后如果是10版本,如果操作里带有这种剧组函数的操作,计算是在远程完成,然后把结果返回到本地,就省去了把原数据传到本地再去排序所带来的这种网络带宽的一个站,所以版本越高,FDW它的功能越来越强大。
下面给大家讲的一些特点。如果两个数据库支持这种update,比方Polar DB对Polar DB,然后如果FDW对远程的表进行更新,大家注意,假如a事物和b事物,修改的都是一张表的同一行。会发现大家都能成功。按照正常情况下面,这应该会造成一个死锁,如果是FDW不会检测到死锁,所以这点大家要记住。
看一下如果FDW是以前9.5的这种版本,如果是多表扫扫描。大家多表扫描,看一下早期版本它是从远程服务器把数据扫描到本地,扫描完以后传到本地,然后在本地做这种连接操作。
到了9.5以后,FDW提供了一个机制,就是可以把一个选项打开,就是使用远程评估,这样就可以通过EXPLAIN命令向远程服务器查询计划的成本,它的一个好处就是将来连接操作,比方如果多表连接,连接操作的是在远程服务器执行,然后执行完以后,只把数据传到本地就可以了,这样就可以大大减少了数据在网络之间的一个传输。
看一下这里有一个案例
这是我访问的寄了两个外部表,然后我是访问两张表,两个外部表的连接再没有用远程评估特性之前会发现它连接的方式。是从远程把数据传到本地,然后再做连接。这时它的代价就比较大了,然后把这数据库的属性给打开。
看一下,打开完以后看一下,要把属性打开。打开完以后:
访问远程的两张表的时候会发现连接就在远程完成,只要把处理以后的结果返回给本地,这样就可以大大提高查询的性能。
这是一个改进好了排序早期的版本。
排序是在本地操作,是从远程把数据传到本地,然后本地做short操作:
到了新版本以后,排序和聚合操作,也是在在本地操作,但是新版本以后就要新版本操作,看一下,比如现在访问远程;
看这里进了几个FDW表,这是一个外部表现的外部表,然后访问外部表,如果带有排序会发现在本地没有排序操作
就把排序操作,下推到远程服务器,这样只要把排序以后的结果返回到本地就可以了,还有一个聚合操作,比方average等,也是在远程,举个例子比如做一个上,看一下要访问外部表。
这时会发现。在本地的就没有排序的操作,比如排序都是在远不是聚合,是在远程这方面操作,然后它只是把远程的数据把它传到本地。
所以在新版本的FDW上面,它的性能得到了比较大的一个提高。
二、Postgres_FDW 部署
下面给大家演示一下怎么去部署一个例如 Polar DB对 olar DB或者Polar DB对PG的FDW,这是比较简单,给大家演示一下:
首先要添加一个扩展,安装一个外键P olar DB,它叫做扩展,其实,可以理解为插件,如果数据库是在 PG 对 PG或者 Polar DB对Polar DB之间。安装一个插件。安装完以后记住,其实 server 就是连到远程 Polar DB,起个名字这里叫做PGDB,然后在这里,要告诉它,远程的 Polar DB 的名字,还有服务的端口,以及要访问的数据库的名字。
1、安装 oostgres_ fdw(哪个 database.上使用,就在哪个database.上安装)
create extension postgres fdw;
2、创建 fdw 服务器
testdb=#CREATE SERVER pgdb FOREIGN DATA WRAPPER postgres _fdw
OPTIONS (host 'pg-xc1',port '1922',dbname 'testdb');
要在远程服务器上面,要能够进行访问。配置了哪一台服务器可以访问服务器,来台远程的客户端可以访问服务器,要允许访问。
弄完以后,就可以建一个server,建立了以后,这里就可以用一个命令,在专门有必要叫做Does+这命令可以看当前有哪一些外部服务器当天借了两个,一个是PDB,然后它的一个FDW的驱动。
以后它的一个主机的信息,是连接到这台主机,它的端口是1922,是连到开始DB数据库,然后把这远程的评估把它打开。注意在create FDW的时候,因为Polar DB它是由很多数据库组成的,所以如果在哪一个数据库上面去部署FDW,这FBW只能在此数据库上面能够使用,如果想在开始的第DB上面去访问FDW,必须要在开始的DB上面去创建,所以一定要注意,它不是全局的,而是局部的,在哪一个数据库上面部署,它就在数据库上面提供服务。
接下来可能要把访问的权限给某个用户,比方现在本地,用户去访问远程的表,比如当前建一个用户,然后把使用这外部服务器的权限给它,这时它就能够让它去创建外表,然后这里还要做一个用户预算,这样就使得远程服务器用户是postgres,然后密码是post的关系,然后本地可能不是postgres访问本地,是Scott用户去访问,然后可以Scott用户去访问远程postgres表。如果是这样就要做用户映射,这里就是吝啬,用户拿来远程的用户。用户名字密码,这样就可以以不同的用户来访问不同的表的数据。
3、创建用户并且授权
testdb=#create user scott par password 'tiger';
testdb=#GRANT USAGE ON FOREIGN SERVER pgdb To scott _pg;
4、创建用户映射
testdb=# CREATE USER MAPPING FOR scott _pg SERVER pgdb
OPTIONS (user 'postgres',password 'postgres');
弄完以后,就让在本地用户去创建FDW表,叫做外表,外表看一下前面的结构,创建的语法都一样,只不过后面要选上外部的服务器是什么,要注意schema, schema如果远程你的steamer是public,就要写public,远程表的名字一样。
5、建表(scott _pg)
CREATE FOREIGN TABLE emp fdw
1EMPNOINT
ENAMEVARCHAR (10),
JOBVARCHAR (9),
MGRint,
HIREDATEdate,
SALfloat4,
COMMfloat4,
DEPTNOint
)SERVER pgdb OPTIONS (schema_name 'public',table name 'emp');
CREATE FOREIGN TABLE dept_fdw
deptno integer,
dname character varying(14),
loc character varying(13)
)SERVER pgdb OPTIONS (schema_name 'public', table_name 'dept');
弄完以后,在这例子当中看一下当前Scott批的用户进了dept FDW。还有emp FDW,这两个都是外表。
将来访问外部表的时候。就访问本地的表,没有任何的区别,只不过看它的计划的时候才看得出来。
数据是来源于什么地方,将来看表的时候,可以\ds+,可以看到这表,它是一个外部表,然后访问哪个模式,哪张表对应的是哪张表,还有服务器是哪个远程服务器,非常方便,刚才演示的是怎么样在两个数据库之间,进行这种数据的一个交互,树立一个 DB,还支持什么?本地的外部表,跟Oracle的本外部表就一样了,本地的外部表。
三、 File_FDW 部署
File_few 部署
1、--添加扩展
CREATE EXTENSTON file_fdw;
2、--仓创建SERVER:FOR file
create server pg_file server foreign data wrapper file_fdw;
这里也给大家演示一下本地的外部表也非常简单,开始的时候要创建一个插件,插件是本地的一个插件,叫做fire FDW,然后创建一个server。server就是基于本地的这种FDW的server,然后把权限给相应的用户,然后接下来就是就可以创建一个外部表,外部表创建的语法一样,因为是要引用本地的某一个文本文件里的数据,所以数据源是EMP.CSV,用copy就可以产生一个文本的一个文件。然后它的格式是CSV,就是用逗号来隔开,它们之间的一个列跟列之间的数据,看就是一个文本文件,文本文件里,看列之间的数据, 用逗号来隔开,这就是CSV的一个格式,然后delimit就是逗号隔开。请看表已经创建了叫做emp fire FDW,可以详细的看息看来源,文件怎么产生呢?
当然如果是外部的文本文件,在采集的时候,列跟列之间就用逗号来隔开就可以了。
如果自己,去创建一个外部表,可以用很简单的方法。Copy把当前的EMP表的数据To把它转储到别的文本文件就可以了。
然后来看一下,在此目录下就会看到一个文本文件:
有了文本文件以后,就基于这种的格式就建一个外部表,建立以后再访问外部表的时候,就跟访问普通的表一模一样。
非常方便,当然基于文件的外部表访问的时候,只能只读,不能做DML操作。
刚刚介绍了一下,Polar DB通过FDW能够在异构数据库或者同构数据库进行数据的一个交互,同时也支持本地的一个外部表。所以就使得数据的这交互变得更加灵活。