plproxy

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

概览

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

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG2.11.01817161514plproxy-
RPMPGDG2.11.01817161514plproxy_$v-
DEBPGDG2.11.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
PGDG 2.11.0
PGDG 2.11.0
PGDG 2.11.0
PGDG 2.11.0
PGDG 2.11.0
d13.x86_64
d13.aarch64
PGDG 2.11.0
PGDG 2.11.0
PGDG 2.11.0
PGDG 2.11.0
PGDG 2.11.0
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

安装

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

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

使用 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;

用法

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');

最后修改 2026-03-14: update extension metadata (953cbd0)