PostgreSQL技术内幕14:从插件来看PG扩展性-FDW插件

news2024/11/25 2:25:40

文章目录

    • 0.简介
    • 1.FDW介绍
    • 2.使用方式
      • 2.1 创建过程
        • 2.1.1 创建插件
        • 2.1.2 创建 Foreign Server
        • 2.1.3 创建 User Mapping(外部服务器映射,本地文件可以不需要)
        • 2.1.4 创建外部表
      • 2.2 查询流程
    • 3.源码分析
      • 3.1 扩展接口分析
      • 3.2 和其他部分关联
        • 3.2.1 和计划的关联
        • 3.2.2 和执行器关联
        • 3.2.3 FDW异步特性
    • 4.fdw插件扩展总结

0.简介

PG具有很好的扩展性,通过代码内部使用的函数指针,不同层级之间的标准接口,通过SQL语句创建的不同配置等实现其不改动核心代码而直接的扩展,本文是PG插件部分的第一篇,主要介绍FDW插件,从FDW插件的角度来分析PG的通过插件实现功能扩展。

1.FDW介绍

FDW(Foreign Data Wrapper,外部数据包装器),PG可以通过FDW扩展来操作当前数据库以外的数据,外部数据源可以是:文件,关系型的数据(PG,MySQL,Oracle等),非关系型数据库等,目前详细的支持可见:
https://wiki.postgresql.org/wiki/Foreign_data_wrappers。
在这里插入图片描述

用户可以通过在PG中创建外部表(Foreign Table),外部表将作为代理,用于访问外部数据源,然后转换为PG的结果形式,在使用上查询一个外部的数据源和内部的表没有区别。

FDW包含四个部分:

1) Foreign Data Wrapper:特定于各数据源的库,定义了如何建立与外部数据源的连接、执行查询及处理其他操作。如postgres_fdw用于连接其他 PostgreSQL 服务器,file_fdw用于连接普通的文本文件。

2) Foreign Server:在本地 PostgreSQL 中定义一个外部服务器对象,对应实际的远程或非本地数据存储实例。

3) User Mapping:为每个外部服务器设置用户映射,明确哪些本地用户有权访问,并提供相应的认证信息,如用户名和密码。

4) Foreign Table:在本地数据库创建表结构,作为外部数据源中表的映射。

2.使用方式

本节使用file_fdw为例介绍创建和查询。

2.1 创建过程

2.1.1 创建插件
postgres=# create extension file_fdw;
2.1.2 创建 Foreign Server
postgres=# CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;
2.1.3 创建 User Mapping(外部服务器映射,本地文件可以不需要)
//例子如下
//创建用户user01 与  远端用户user02的映射 
CREATE USER MAPPING
              FOR user01 
             server db02 
             options(user 'user02',password 'user02');
2.1.4 创建外部表
CREATE FOREIGN TABLE pglog (
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text
) SERVER pglog
OPTIONS ( filename '/pgdata/log/pglog.csv', format 'csv' );

2.2 查询流程

查询和内部表使用一致,直接使用select * from xxx即可。

3.源码分析

3.1 扩展接口分析

对于访问外部数据源,主要是通过FdwRoutine这一结构体来进行,任何接入外部数据源的插件都可以根据自身需要去实现这些接口。

typedef struct FdwRoutine
{
  NodeTag    type;


  /* Functions for scanning foreign tables */
  GetForeignRelSize_function GetForeignRelSize;
  GetForeignPaths_function GetForeignPaths;
  GetForeignPlan_function GetForeignPlan;
  BeginForeignScan_function BeginForeignScan;
  IterateForeignScan_function IterateForeignScan;
  ReScanForeignScan_function ReScanForeignScan;
  EndForeignScan_function EndForeignScan;


  /*
   * Remaining functions are optional.  Set the pointer to NULL for any that
   * are not provided.
   */


  /* Functions for remote-join planning */
  GetForeignJoinPaths_function GetForeignJoinPaths;


  /* Functions for remote upper-relation (post scan/join) planning */
  GetForeignUpperPaths_function GetForeignUpperPaths;


  /* Functions for updating foreign tables */
  AddForeignUpdateTargets_function AddForeignUpdateTargets;
  PlanForeignModify_function PlanForeignModify;
  BeginForeignModify_function BeginForeignModify;
  ExecForeignInsert_function ExecForeignInsert;
  ExecForeignUpdate_function ExecForeignUpdate;
  ExecForeignDelete_function ExecForeignDelete;
  EndForeignModify_function EndForeignModify;
  BeginForeignInsert_function BeginForeignInsert;
  EndForeignInsert_function EndForeignInsert;
  IsForeignRelUpdatable_function IsForeignRelUpdatable;
  PlanDirectModify_function PlanDirectModify;
  BeginDirectModify_function BeginDirectModify;
  IterateDirectModify_function IterateDirectModify;
  EndDirectModify_function EndDirectModify;


  /* Functions for SELECT FOR UPDATE/SHARE row locking */
  GetForeignRowMarkType_function GetForeignRowMarkType;
  RefetchForeignRow_function RefetchForeignRow;
  RecheckForeignScan_function RecheckForeignScan;


  /* Support functions for EXPLAIN */
  ExplainForeignScan_function ExplainForeignScan;
  ExplainForeignModify_function ExplainForeignModify;
  ExplainDirectModify_function ExplainDirectModify;


  /* Support functions for ANALYZE */
  AnalyzeForeignTable_function AnalyzeForeignTable;


  /* Support functions for IMPORT FOREIGN SCHEMA */
  ImportForeignSchema_function ImportForeignSchema;


  /* Support functions for parallelism under Gather node */
  IsForeignScanParallelSafe_function IsForeignScanParallelSafe;
  EstimateDSMForeignScan_function EstimateDSMForeignScan;
  InitializeDSMForeignScan_function InitializeDSMForeignScan;
  ReInitializeDSMForeignScan_function ReInitializeDSMForeignScan;
  InitializeWorkerForeignScan_function InitializeWorkerForeignScan;
  ShutdownForeignScan_function ShutdownForeignScan;


  /* Support functions for path reparameterization. */
  ReparameterizeForeignPathByChild_function ReparameterizeForeignPathByChild;
} FdwRoutine;

可以看到,其内部包含的常见操作有开始扫描(BeginForeignScan),执行扫描(IterateForeignScan)等,还有insert、update、delete相关的接口。

下面还是以file_fdw为例来看,其主要实现了扫描使用的接口和用于分析性能的接口。

Datum
file_fdw_handler(PG_FUNCTION_ARGS)
{
  FdwRoutine *fdwroutine = makeNode(FdwRoutine);


  fdwroutine->GetForeignRelSize = fileGetForeignRelSize;
  fdwroutine->GetForeignPaths = fileGetForeignPaths;
  fdwroutine->GetForeignPlan = fileGetForeignPlan;
  fdwroutine->ExplainForeignScan = fileExplainForeignScan;
  fdwroutine->BeginForeignScan = fileBeginForeignScan;
  fdwroutine->IterateForeignScan = fileIterateForeignScan;
  fdwroutine->ReScanForeignScan = fileReScanForeignScan;
  fdwroutine->EndForeignScan = fileEndForeignScan;
  fdwroutine->AnalyzeForeignTable = fileAnalyzeForeignTable;
  fdwroutine->IsForeignScanParallelSafe = fileIsForeignScanParallelSafe;


  PG_RETURN_POINTER(fdwroutine);
}

3.2 和其他部分关联

对于查询计划计划和执行器部分如何获取并使用对应的FdwRoutine结构,在foreign.c中实现了多种查找方式:

/* Functions in foreign/foreign.c */
extern FdwRoutine *GetFdwRoutine(Oid fdwhandler);
extern Oid  GetForeignServerIdByRelId(Oid relid);
extern FdwRoutine *GetFdwRoutineByServerId(Oid serverid);
extern FdwRoutine *GetFdwRoutineByRelId(Oid relid);
extern FdwRoutine *GetFdwRoutineForRelation(Relation relation, bool makecopy);
3.2.1 和计划的关联

和计划关联主要体现在优化阶段的调用:

在这里插入图片描述

在这里插入图片描述

3.2.2 和执行器关联

PG内核执行器使用的是火山模型,主要包含三个阶段:初始化,执行,清理,和FDW关联如下:
在这里插入图片描述
在这里插入图片描述

3.2.3 FDW异步特性

该特性就是在执行Append算子时,对所有外部表子计划发起异步请求,然后开始执行本地计划,不阻塞等待外部表子计划的结果,通过轮询I/O事件来获取结果,通过这种方式,尽可能的并行,减少等待。

4.fdw插件扩展总结

通过抽象FdwRoutine结构来支持扩展,只需要对于不同的外部数据源实现不同的FdwRoutine就能实现不同外部数据源的对接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2212294.html

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

相关文章

AI智能助理在企业内部的8大应用场景

一、概述 1.1 AI智能助理核心功能概览 1.2 AI智能助理业务应用价值 二、详解 AI智能助理在企业内部办公方向的应用可以极大地提高工作效率、优化流程,并为员工提供更加个性化的支持。以下是一些具体的业务场景: 日程管理和会议安排: 自动安…

现今 CSS3 最强二维布局系统 Grid 网格布局

深入学习 CSS3 目前最强大的布局系统 Grid 网格布局 Grid 网格布局的基本认识 Grid 网格布局: Grid 布局是一个基于网格的二位布局系统,是目前 CSS 最强的布局系统,它可以同时对列和行进行处理(它将网页划分成一个个网格,可以任…

Java读取PDF后做知识库问答_SpringAI实现

​​​​​​​​​​​​​​ 核心思路: 简单来说,就是把PDF文件读取并向量化,然后放到向量存储里面,再通过大模型,来实现问答。 RAG(检索增强生成)介绍: 检索增强生成&#x…

UE5 猎户座漂浮小岛 02 模型 地形

UE5 猎户座漂浮小岛 02 模型 地形 1.模型 1.1 导入 1.2 统一模型比例 1.3 添加碰撞体 2.地形 2.1 地 2.2 山体 2.3 海洋 2.4 花草

特征提取:传统算法 vs 深度学习

特征提取:传统算法 vs 深度学习 特征点是图像中梯度变化较为剧烈的像素,比如:角点、边缘等。FAST(Features from Accelerated Segment Test)是一种高速的角点检测算法;而尺度不变特征变换SIFT&#xff08…

使用DataX同步hive数据到MySQL

目录 1、组件环境 2、安装datax 2.1、下载datax并解压 3、安装datax-web 3.0、下载datax-web的源码,进行编译 3.1、在MySQL中创建datax-web元数据 3.2、安装data-web 3.2.1执行install.sh命令解压部署 3.2.1、手动修改 datax-admin配置文件 3.2.2、手动修改…

【python实操】python小程序之文件操作的输出指定格式数据以及异常捕获

引言 python小程序之文件操作的输出指定格式数据以及异常捕获 文章目录 引言一、文件操作之输出指定格式JSON1.1 题目1.2 代码1.3 代码解释1.3.1 总结 二、异常2.1 概念2.1.1 基本语法2.1.1.1 try...except2.1.1.2 try...except...else2.1.1.3 try...except...finally2.1.1.4 t…

量化选股:原理与实战指南(二)

🌟作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~🍊个人主页:小高要坚强的博客🍓当前专栏:《Python之量化交易》🍎本文内容:量化选股:原理与实战指南(二)🌸作者“三要”格言:要坚强、要努力、要学习 目录 引言 一、价值类因子简介 …

position定位静态定位/绝对定位/相对定位

1.静态定位static&#xff1a;按照标准流进行布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…

基于springboot Vue3的两种图形验证码工具——vue3-puzzle-vcode纯前端防人机图形滑动验证码和kaptcha图片文字验证码

一.vue3-puzzle-vcode Vue 纯前端的拼图人机验证、右滑拼图验证 官网&#xff1a; vue3-puzzle-vcode - npm (npmjs.com)https://www.npmjs.com/package/vue3-puzzle-vcode 1.1基本使用步骤 安装 npm install vue-puzzle-vcode --save 简单例子 点击开始验证按钮弹出验证弹…

linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十一)--rpm管理和计划任务

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十一&#xff09;–rpm管理和计划任务 一、rpm管理&#xff08;重点&#xff09; 1、rpm管理 作用&#xff1a; rpm的作用类似于windows上的电脑管家中“软件管理”、安全卫士里面“…

【机器学习】集成学习|Boosting|随机森林|Adaboost|GBDT梯度提升树|XGBoost 极限梯度提升树 及案例实现

文章目录 集成学习集成学习思想概述集成学习分类Bagging 思想Boosting思想Bagging 和 Boosting 的对比 随机森林算法随机森林实现步骤随机森林算法apiAPI 代码实现 Adaboost 算法实现步骤整体过程实现 算法推导Adaboost 案例 葡萄酒数据 GBDT (梯度提升树)提升树 BDT (Boosting…

WPF 中的 StackPanel 详解

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软开发的一种用于创建桌面客户端应用程序的用户界面框架。WPF 提供了一套丰富的控件和布局能力&#xff0c;使得开发者可以轻松构建出功能强大、视觉优美的用户界面。在 WPF 的布局系统中&#xff0c;StackPane…

Git上传命令汇总

进入企业&#xff0c;每日需要上传执行用例记录到gitlab平台上&#xff0c;本文记录了常用git上传命令&#xff0c; 并用github演示。 1、本地建立分支&#xff0c;克隆远程仓库 在gitlab中&#xff0c;每个人需要创建自己的分支&#xff0c;一般以自己的名字命名&#xff0c;…

新品牌Sesame Street《芝麻街》商标版权双维权,尚未TRO

案件基本情况起诉时间&#xff1a;2024-10-8案件号&#xff1a;24-cv-09713品牌&#xff1a;Sesame Street原告&#xff1a;Sesame Workshop原告律所&#xff1a;TME起诉地&#xff1a;伊利诺伊州北部法院品牌介绍Sesame Street《芝麻街》是美国公共广播协会&#xff08;PBS&…

5个IO控制20个LED灯的方案详解

工程师们经常为了节省一两个IO口想各种方案想到抠脑壳&#xff0c;今天给大家整点活儿&#xff0c;介绍一种超级节省IO口的LED灯控制方案。 5个IO口控制20个LED灯&#xff0c;而且可以对每个LED灯实现单独控制。电路结构如下&#xff1a; 注意一下这种电路网络&#xff0c;其…

ctf.bugku-baby lfi

题目来源&#xff1a;baby lfi - Bugku CTF平台 访问页面&#xff0c; 翻译解析&#xff1a;百度翻译-您的超级翻译伙伴&#xff08;文本、文档翻译&#xff09; (baidu.com) LFI Warmups - 本地文件包含&#xff08;Local File Inclusion&#xff0c;简称LFI&#xff09; H…

【最新华为OD机试E卷-支持在线评测】喊7的次数重排(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

Linux基础-进程的超详细讲解(1)_进程的概念与属性

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux基础-进程的超详细讲解(1) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 进…