plproxy

作为过程语言实现的数据库分区

概览

扩展包名版本分类许可证语言
plproxy2.12.0OLAP0BSDC
ID扩展名BinLibLoadCreateTrustReloc模式
2520plproxy-
相关扩展citus dblink postgres_fdw pg_partman odbc_fdw jdbc_fdw citus_columnar columnar

PIGSTY RPM and PGDG DEB are aligned at 2.12.0.

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED2.12.01817161514plproxy-
RPMPIGSTY2.12.01817161514plproxy_$v-
DEBPGDG2.12.01817161514postgresql-$v-plproxy-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 plproxy 扩展的 RPM 包:

pig build pkg plproxy         # 构建 RPM 包

安装

您可以直接安装 plproxy 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install plproxy;          # 当前活跃 PG 版本安装
pig ext install -y plproxy -v 18  # PG 18
pig ext install -y plproxy -v 17  # PG 17
pig ext install -y plproxy -v 16  # PG 16
pig ext install -y plproxy -v 15  # PG 15
pig ext install -y plproxy -v 14  # PG 14
dnf install -y plproxy_18       # PG 18
dnf install -y plproxy_17       # PG 17
dnf install -y plproxy_16       # PG 16
dnf install -y plproxy_15       # PG 15
dnf install -y plproxy_14       # PG 14
apt install -y postgresql-18-plproxy   # PG 18
apt install -y postgresql-17-plproxy   # PG 17
apt install -y postgresql-16-plproxy   # PG 16
apt install -y postgresql-15-plproxy   # PG 15
apt install -y postgresql-14-plproxy   # PG 14

创建扩展

CREATE EXTENSION plproxy;

用法

来源:

PL/Proxy 是一个 PostgreSQL 的过程语言处理程序,它允许在不同的 PostgreSQL 数据库之间进行远程过程调用,并可选地实现分片。

创建扩展

CREATE EXTENSION plproxy;

语言语句

PL/Proxy 函数使用四种类型的语句:

集群选择 —— 连接到一个预配置的集群:

CREATE FUNCTION get_user(i_id int) RETURNS SETOF users AS $$
    CLUSTER 'mycluster';
    RUN ON i_id;
$$ LANGUAGE plproxy;

直接连接 —— 使用连接字符串:

CREATE FUNCTION get_config(key text) RETURNS text AS $$
    CONNECT 'host=remotehost dbname=config';
    SELECT val FROM config WHERE key = $1;
$$ LANGUAGE plproxy;

执行模式

RUN ON hash —— 基于哈希值路由到特定分区:

CREATE FUNCTION get_user_settings(i_username text) RETURNS SETOF user_settings AS $$
    RUN ON namehash(i_username);
$$ LANGUAGE plproxy;

RUN ON ALL —— 并行执行在所有数据库上:

CREATE FUNCTION get_all_counts() RETURNS SETOF record AS $$
    RUN ON ALL;
    SELECT count(*) FROM users;
$$ LANGUAGE plproxy;

RUN ON ANY —— 随机选择一个服务器:

CREATE FUNCTION get_random_quote() RETURNS text AS $$
    RUN ON ANY;
    SELECT quote FROM quotes ORDER BY random() LIMIT 1;
$$ LANGUAGE plproxy;

集群配置

集群通过 SQL/MED(外部数据管理)进行配置:

CREATE SERVER mycluster FOREIGN DATA WRAPPER plproxy
    OPTIONS (
        connection_lifetime '1800',
        p0 'host=node0 dbname=mydb',
        p1 'host=node1 dbname=mydb',
        p2 'host=node2 dbname=mydb',
        p3 'host=node3 dbname=mydb'
    );

CREATE USER MAPPING FOR CURRENT_USER
    SERVER mycluster
    OPTIONS (user 'proxy_user', password 'secret');

注意事项

  • PL/Proxy 路由函数调用,而不是任意的跨数据库事务。设计远程函数时要确保其具有重试安全性,并明确事务边界。
  • 集群定义和用户映射可能会暴露连接细节;保护系统目录访问并优先使用受限的远程角色。
  • 2.12.0 版本修复了 SELECT 中引用标识符解析问题、plproxy_fdw_validator 中的空指针问题、Windows 构建问题以及与 PostgreSQL 19 的兼容性。现有 SQL 对象不需要新的使用模式,但从旧版本扩展升级的数据应运行相应的 ALTER EXTENSION plproxy UPDATE 路径。