This is the multi-page printable view of this section. Click here to print.
安装使用
1 - 快速上手
Pigsty 让您可以直接在 PGSQL
集群中,通过声明式的方式下载,安装,加载,启用 PostgreSQL 扩展。
开箱即用
Pigsty 为用户封装了扩展管理的复杂度,用户无需了解细节,只要在配置文件中按需进行声明即可:
例如,下面的配置文件片段声明了一个 PostgreSQL 集群,下载 并 安装 了三个额外的扩展插件,动态 加载 了三个扩展,并 启用 了三个扩展。
all:
children:
pg-meta:
hosts: {10.10.10.10: { pg_seq: 1, pg_role: primary }}
vars:
pg_cluster: pg-meta
pg_databases: {name: meta, extensions: [ postgis, timescaledb, vector ]} # 动态启用三个扩展(这里使用扩展名,而非扩展包名)
pg_libs: 'timescaledb, pg_stat_statements, auto_explain' # 动态加载三个扩展(后两个为 PG 自带扩展,无需专门下载安装)
pg_extensions: [ pgsql-main, postgis pgvector timescaledb ] # 额外安装三个扩展(默认大版本 PG 17,pgsql-main 为内核)
repo_extra_packages: [ postgis, timescaledb, vector ] # 额外下载三个扩展(全局参数)
执行 ./install.yml
剧本,本地仓库中将下载这三个额外扩展,创建的 PostgreSQL 集群 pg-meta
中将自动安装,加载,启用上述扩展。
关键问题
想要在 PostgreSQL 集群中使用扩展(Extension),通常涉及到 下载、安装、加载、启用 四个核心问题:
-
在 Pigsty 默认在线安装时,只会下载当前 PG 大版本对应的三个默认扩展(
pg_repack
,wal2json
,pgvector
)。如果您想要下载更多扩展,将其加入
repo_extra_packages
中即可。您可以加入扩展包名,或者直接指定扩展类目进行批量下载。 -
在 Pigsty 配置模板中的样例集群中,已经提供了完整可用的扩展清单,您只需要将想要 安装 的扩展,添加到
pg_extensions
中即可。如果您想要在集群创建完毕后,安装额外的扩展,那么在配置完毕后,执行
./pgsql.yml -t pg_extension
子任务即可。 -
一小部分使用了 PostgreSQL 钩子函数的扩展,需要动态加载并 重启 数据库后才可以启用,您需要将这些扩展添加到
pg_libs
中,并在重启数据库后生效。如果您的数据库集群已经创建完毕,那么需要 配置现有集群 的
shared_preload_libraries
参数,并重启数据库集群后生效。 -
启用哪些扩展:
pg_databases.extensions
绝大多数扩展在安装之后,都需要执行
CREATE EXTENSION
DDL 语句,才会真实在具体的数据库中被创建并启用。您可以手工执行此 DDL,或者在
pg_datbasese.extensions
中显式指定要在数据库中启用的扩展列表,这些扩展会在集群初始化时自动启用。
扩展包名
您可能注意到,在加载,启用扩展时,使用的是“扩展名”(ext
),而在下载,安装扩展时,使用的是“扩展包名”(pkg
)。
例如,向量数据库扩展 PGVECTOR 的扩展名是 vector
,而扩展包名是 pgvector
。
flowchart LR ext[( EXTNAME )] -- "n:1" --> pkg[( PKGNAME )] pkg[( PKGNAME )] -- "1:n" --> packages[( RPM/DEB )]
这里的扩展包名是由 Pigsty 添加的额外抽象层,解决了不同操作系统发行版的扩展包名差异问题,在绝大部分情况下,扩展名(ext
)与扩展包名(pkg
)是相同的。
但是一个扩展包可能包含多个扩展,例如 postgis
扩展包中就包含了 postgis
与 其他六个扩展。
多个扩展(ext
)可能对应同一个扩展包(pkg
),此外,有些扩展名与操作系统发行版自带的软件包名有冲突,因此您需要使用扩展包名(pkg
)来下载,安装扩展。
在 Pigsty 中,您可以在 repo_extra_packages
, pg_packages
, pg_extensions
等下载安装相关参数中使用扩展包名(pkg
),例如要安装 postgis
扩展,您可以使用:
- Pigsty 提供的 标准扩展包名 ,Pigsty 会自动根据活跃 PG 大版本与操作系统 翻译 为对应的 RPM/DEB 包名。
- 带有
$v
占位符的包名,Pigsty 会自动使用pg_version
的值替换占位符。 - 原始的操作系统 RPM/DEB 包名,您可以在包名中使用
*
通配符,或依次指定每个包名。
postgis # 指定扩展包别名,自动翻译为 DEB/RPM 包名,与当前活跃 PG 大版本
postgis35_$v* # 指定 RPM 包名模式,同时使用 PG 大版本号占位符 $v
postgis35_15* # 直接指定 RPM 包名名称
postgresql-$v-postgis-3* # 指定 DEB 包名模式,同时使用 PG 大版本号占位符 $v
postgresql-14-postgis-3* # 直接指定 DEB 包名称
Pigsty 中所有可用扩展的扩展包名与扩展名之间的映射关系,可以查询 扩展列表 页面。 此外,一个扩展包在不同的操作系统和 PostgreSQL 大版本组合下,也会对应不同的具体 RPM/DEB 包名。
我们建议使用 Pigsty 提供的标准化扩展名(pkg
)来下载安装扩展,在不同的操作系统发行版中,
Pigsty 将标准扩展名翻译为对应 PG 大版本的 RPM / DEB 包名,并填充 PG 大版本号,这样您就无需关心不同 OS/PG 组合的扩展包名差异了。
尽管如此,不同操作系统与芯片架构上可用的扩展仍然会有略微差异,具体操作系统发行版可用的扩展列表,下面的配置文件为权威参考:
- EL8 : x86_64 , aarch64
- EL9 : x86_64 , aarch64
- D12 : x86_64 , aarch64
- U22 : x86_64 , aarch64
- U24 : x86_64 , aarch64
Pigsty 尽最大努力对齐 EL 操作系统与 Debian 操作系统生态的 PostgreSQL 扩展,但仍有少量扩展因为各种原因难以/尚未移植, 请参考 RPM扩展列表 与 DEB扩展列表 了解更多信息。
复杂案例
下面是一个具体的例子:自建 Supabase 使用到的 app/supa
配置模板:
Supabase 是一个封装 PostgreSQL 作为底层存储的“上层抽象数据库”,它深度使用了 PostgreSQL 的扩展机制,以下片段定义了 Supabase 需要的扩展:
all:
children:
# pg-meta, the underlying postgres database for supabase
pg-meta:
hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
vars:
pg_cluster: pg-meta
pg_users:
# supabase roles: anon, authenticated, dashboard_user
- { name: anon ,login: false }
- { name: authenticated ,login: false }
- { name: dashboard_user ,login: false ,replication: true ,createdb: true ,createrole: true }
- { name: service_role ,login: false ,bypassrls: true }
# supabase users: please use the same password
- { name: supabase_admin ,password: 'DBUser.Supa' ,pgbouncer: true ,inherit: true ,roles: [ dbrole_admin ] ,superuser: true ,replication: true ,createdb: true ,createrole: true ,bypassrls: true }
- { name: authenticator ,password: 'DBUser.Supa' ,pgbouncer: true ,inherit: false ,roles: [ dbrole_admin, authenticated ,anon ,service_role ] }
- { name: supabase_auth_admin ,password: 'DBUser.Supa' ,pgbouncer: true ,inherit: false ,roles: [ dbrole_admin ] ,createrole: true }
- { name: supabase_storage_admin ,password: 'DBUser.Supa' ,pgbouncer: true ,inherit: false ,roles: [ dbrole_admin, authenticated ,anon ,service_role ] ,createrole: true }
- { name: supabase_functions_admin ,password: 'DBUser.Supa' ,pgbouncer: true ,inherit: false ,roles: [ dbrole_admin ] ,createrole: true }
- { name: supabase_replication_admin ,password: 'DBUser.Supa' ,replication: true ,roles: [ dbrole_admin ]}
- { name: supabase_read_only_user ,password: 'DBUser.Supa' ,bypassrls: true ,roles: [ dbrole_readonly, pg_read_all_data ] }
pg_databases:
- name: postgres
baseline: supabase.sql
owner: supabase_admin
comment: supabase postgres database
schemas: [ extensions ,auth ,realtime ,storage ,graphql_public ,supabase_functions ,_analytics ,_realtime ]
extensions: # 这里定义了在 postgres 数据库中 创建启用 的扩展列表
- { name: pgcrypto ,schema: extensions } # 加密函数
- { name: pg_net ,schema: extensions } # 异步 HTTP
- { name: pgjwt ,schema: extensions } # PostgreSQL 的 JSON Web Token API
- { name: uuid-ossp ,schema: extensions } # 生成通用唯一标识符 (UUID)
- { name: pgsodium } # pgsodium 是 PostgreSQL 的现代加密库
- { name: supabase_vault } # Supabase 保险库扩展
- { name: pg_graphql } # pg_graphql: GraphQL 支持
- { name: pg_jsonschema } # pg_jsonschema: 验证 JSON 模式
- { name: wrappers } # wrappers: 外部数据包装器集合
- { name: http } # http: 允许在数据库内检索网页
- { name: pg_cron } # pg_cron: PostgreSQL 的任务调度器
- { name: timescaledb } # timescaledb: 支持时间序列数据的可扩展插入和复杂查询
- { name: pg_tle } # pg_tle: PostgreSQL 的可信语言扩展
- { name: vector } # pgvector: 向量相似性搜索
- { name: pgmq } # pgmq: 类似 AWS SQS 和 RSMQ 的轻量级消息队列
# supabase required extensions
pg_libs: 'timescaledb, plpgsql, plpgsql_check, pg_cron, pg_net, pg_stat_statements, auto_explain, pg_tle, plan_filter'
pg_parameters:
cron.database_name: postgres
pgsodium.enable_event_trigger: off
pg_hba_rules: # supabase hba rules, require access from docker network
- { user: all ,db: postgres ,addr: intra ,auth: pwd ,title: 'allow supabase access from intranet' }
- { user: all ,db: postgres ,addr: 172.17.0.0/16 ,auth: pwd ,title: 'allow access from local docker network' }
node_crontab: [ '00 01 * * * postgres /pg/bin/pg-backup full' ] # make a full backup every 1am
vars: # 全局参数配置
pg_version: 17
repo_modules: node,pgsql,infra,docker
repo_packages: [node-bootstrap, infra-package, infra-addons, node-package1, node-package2, pgsql-utility, docker ]
repo_extra_packages: [pg17-core ,pg17-time ,pg17-gis ,pg17-rag ,pg17-fts ,pg17-olap ,pg17-feat ,pg17-lang ,pg17-type ,pg17-util ,pg17-func ,pg17-admin ,pg17-stat ,pg17-sec ,pg17-fdw ,pg17-sim ,pg17-etl ]
pg_extensions: [pg17-time ,pg17-gis ,pg17-rag ,pg17-fts ,pg17-feat ,pg17-lang ,pg17-type ,pg17-util ,pg17-func ,pg17-admin ,pg17-stat ,pg17-sec ,pg17-fdw ,pg17-sim ,pg17-etl ] #,pg17-olap]
在这里,我们声明了一个名为 pg-meta
的 PostgreSQL 集群,它使用默认的 postgres
数据库作为定制对象。
- 在
repo_extra_packages
按照 16 大分类分类批量下载所有可用扩展,而不是一个一个指定下载 - 在
pg_extensions
中指定需要安装的扩展包,这里按照了除了pg17-olap
以外的所有扩展包 - 在
pg_libs
中对 Supabase 需要用到的扩展进行动态加载 - 在
pg_parameters
中指定扩展所需的配置参数,例如pgsodium
与pg_cron
扩展所必须的配置参数 - 在
pg_databases.extensions
中指定将扩展安装到哪个模式(schema
)中
在 baseline: supabase.sql
中,还包含了其他对扩展进行自定义配置的 SQL Migration 逻辑。
最终,用户只需要执行 ./install.yml
,Supabase 所需的 PostgreSQL 集群就能被创建出来并开箱即用了!
2 - 下载扩展
在 Pigsty 的默认剧本中,扩展插件的下载与 安装 是分离的两个步骤。
Pigsty 会首先在 INFRA
模块安装的过程中,统一下载所有需要的软件至本地,并创建一个本地 YUM/APT 仓库供整套部署(包括本节点)使用。
这样做可以加速安装,避免重复下载,避免数据库节点访问互联网,减少网络流量消耗,提高交付可靠性性,并解决重复安装版本不一致的风险。是严肃生产环境中推荐的做法。
不过,如果您的数据库节点可以直接访问互联网,那么确实还有另一种可行的方式:直接从互联网在线安装下载扩展插件。
快速上手
在 repo_packages
参数与 repo_extra_packages
参数中定义的软件包会在 Pigsty 安装过程中自动下载到本地软件仓库。
通常在指定下载与 PostgreSQL 大版本相关的软件包(例如内核与扩展)时,需要修改 repo_extra_packages
参数,而 repo_packages
留空以使用不同系统的默认值。
此参数的默认值为 [pgsql-main]
,其中 pgsql-main
是一个由 Pigsty 定义的便捷别名,代表当前活跃 PG 大版本的内核与关键扩展包。
repo_extra_packages: [ pgsql-main ] # 下载当前活跃 PG 大版本(17)的内核与关键扩展包(pgvector, pg_repack, wal2json)
如果您你想要添加特定的扩展插件,将 Pigsty 标准扩展包名 添加到此参数中即可。您无需指定 PG 大版本号,Pigsty 会自动下载当前活跃 PG 大版本相关的扩展包。
repo_extra_packages: [ pgsql-main, documentdb, citus, postgis, pgvector, pg_cron, rum ]
如果你想要下载当前 PG 版本 “所有可用”的扩展插件,可以类似 rich
配置模板所做的那样,将 16 个扩展分类的别名全部添加到此参数中即可:
repo_extra_packages: [ pgsql-main ,pgsql-time ,pgsql-gis ,pgsql-rag ,pgsql-fts ,pgsql-olap ,pgsql-feat ,pgsql-lang ,pgsql-type ,pgsql-util ,pgsql-func ,pgsql-admin ,pgsql-stat ,pgsql-sec ,pgsql-fdw ,pgsql-sim ,pgsql-etl]
如果你想要下载“所有可用”的扩展插件,还可以使用具体的 PG大版本相关别名 来指定:
repo_extra_packages: [
pg17-core,pg17-time,pg17-gis,pg17-rag,pg17-fts,pg17-olap,pg17-feat,pg17-lang,pg17-type,pg17-util,pg17-func,pg17-admin,pg17-stat,pg17-sec,pg17-fdw,pg17-sim,pg17-etl,
pg16-core,pg16-time,pg16-gis,pg16-rag,pg16-fts,pg16-olap,pg16-feat,pg16-lang,pg16-type,pg16-util,pg16-func,pg16-admin,pg16-stat,pg16-sec,pg16-fdw,pg16-sim,pg16-etl,
pg15-core,pg15-time,pg15-gis,pg15-rag,pg15-fts,pg15-olap,pg15-feat,pg15-lang,pg15-type,pg15-util,pg15-func,pg15-admin,pg15-stat,pg15-sec,pg15-fdw,pg15-sim,pg15-etl,
pg14-core,pg14-time,pg14-gis,pg14-rag,pg14-fts,pg14-olap,pg14-feat,pg14-lang,pg14-type,pg14-util,pg14-func,pg14-admin,pg14-stat,pg14-sec,pg14-fdw,pg14-sim,pg14-etl,
pg13-core,pg13-time,pg13-gis,pg13-rag,pg13-fts,pg13-olap,pg13-feat,pg13-lang,pg13-type,pg13-util,pg13-func,pg13-admin,pg13-stat,pg13-sec,pg13-fdw,pg13-sim,pg13-etl,
]
如果你想要向本地仓库中添加新的扩展包,在修改上述参数后,重新运行 INFRA 模块的 repo_build
子任务即可:
./infra.yml -t repo_build # 重新下载并重建本地仓库
./node.yml -t node_repo # 【可选】更新仓库元数据
别名翻译
PostgreSQL 有着繁荣的开源生态,安装 PostgreSQL 绝非安装几个内核 RPM/DEB 这么简单。
Pigsty 提供了一种优雅的抽象翻译层,将所需的 PostgreSQL 软件包分门别类,归结为一系列 “别名”(Alias),屏蔽了不同系统、架构、PG大版本之间的差异。
在 快速上手 中,我们已经使用了例如 pgsql-main
与 pgsql-core
等别名,这些别名会根据系统与架构自动翻译为具体的软件包名。
以 EL 系统为例,pgsql-main
被翻译为 postgresql$v*
内核包,以及 pgvector_$v*
,pg_repack_$v*
与 wal2json_$v*
三个扩展插件。
pgsql-main: "postgresql$v* pg_repack_$v* wal2json_$v* pgvector_$v*"
同时,带有 $v
版本号占位符的包名会进一步被默认的 pg_version=17
替换为 PostgreSQL 17 对应的内核包与三个扩展包。
带有 *
通配符的具体内核包又会进一步展开为postgresql17
, postgresql17-server
, postgresql17-libs
, postgresql17-contrib
, postgresql17-plperl
, postgresql17-plpython3
, postgresql17-pltcl
, postgresql17-test
, postgresql17-devel
, postgresql17-llvmjit
,而扩展中的 *
会展开为扩展本体 RPM + LLVMJIT,以及其他 RPM。
Pigsty 为用户封装处理好了这些细节。
完整的可用软件包与别名可以参考 roles/node_id/vars/<os.arch>.yml
里面包含了不同系统与架构的可用软件包/别名列表,以下是一些最常用的各个系统都提供的别名列表:
postgresql: "postgresql$v*"
pgsql-main: "postgresql$v* pg_repack_$v* wal2json_$v* pgvector_$v*"
pgsql-core: "postgresql$v postgresql$v-server postgresql$v-libs postgresql$v-contrib postgresql$v-plperl postgresql$v-plpython3 postgresql$v-pltcl postgresql$v-test postgresql$v-devel postgresql$v-llvmjit"
pgsql-simple: "postgresql$v postgresql$v-server postgresql$v-libs postgresql$v-contrib postgresql$v-plperl postgresql$v-plpython3 postgresql$v-pltcl"
pgsql-client: "postgresql$v"
pgsql-server: "postgresql$v-server postgresql$v-libs postgresql$v-contrib"
pgsql-devel: "postgresql$v-devel"
pgsql-basic: "pg_repack_$v* wal2json_$v* pgvector_$v*"
pgsql-time: "timescaledb-tsl_$v* timescaledb-toolkit_$v pg_timeseries_$v periods_$v* temporal_tables_$v* e-maj_$v table_version_$v pg_cron_$v* pg_task_$v* pg_later_$v pg_background_$v*"
pgsql-gis: "postgis35_$v* pgrouting_$v* pointcloud_$v* h3-pg_$v* q3c_$v* ogr_fdw_$v* geoip_$v pg_polyline_$v pg_geohash_$v*"
pgsql-rag: "pgvector_$v* vchord_$v pgvectorscale_$v pg_vectorize_$v pg_similarity_$v* smlar_$v* pg_summarize_$v pg_tiktoken_$v pg4ml_$v"
pgsql-fts: "pg_search_$v pgroonga_$v* pg_bigm_$v* zhparser_$v* pg_bestmatch_$v vchord_bm25_$v hunspell_cs_cz_$v hunspell_de_de_$v hunspell_en_us_$v hunspell_fr_$v hunspell_ne_np_$v hunspell_nl_nl_$v hunspell_nn_no_$v hunspell_ru_ru_$v hunspell_ru_ru_aot_$v"
pgsql-olap: "citus_$v* pg_analytics_$v pg_duckdb_$v* pg_mooncake_$v* duckdb_fdw_$v* pg_parquet_$v pg_fkpart_$v pg_partman_$v* plproxy_$v*" #hydra_$v* #pg_strom_$v*
pgsql-feat: "hll_$v* rum_$v pg_graphql_$v pg_jsonschema_$v jsquery_$v* pg_hint_plan_$v* hypopg_$v* index_advisor_$v pg_plan_filter_$v* imgsmlr_$v* pg_ivm_$v* pg_incremental_$v* pgmq_$v pgq_$v* pg_cardano_$v omnigres_$v" #apache-age_$v*
pgsql-lang: "pg_tle_$v* plv8_$v* pllua_$v* pldebugger_$v* plpgsql_check_$v* plprofiler_$v* plsh_$v* pljava_$v*" #plprql_$v #plr_$v* #pgtap_$v* #postgresql_faker_$v* #dbt2-pgsql-extensions*
pgsql-type: "prefix_$v* semver_$v* postgresql-unit_$v* pgpdf_$v* pglite_fusion_$v md5hash_$v* asn1oid_$v* pg_roaringbitmap_$v* pgfaceting_$v pgsphere_$v* pg_country_$v* pg_xenophile_$v pg_currency_$v* pgcollection_$v* pgmp_$v* numeral_$v* pg_rational_$v* pguint_$v* pg_uint128_$v* hashtypes_$v* ip4r_$v* pg_duration_$v* pg_uri_$v* pg_emailaddr_$v* acl_$v* timestamp9_$v* chkpass_$v*"
pgsql-util: "pgsql_gzip_$v* pg_bzip_$v* pg_zstd_$v* pgsql_http_$v* pg_net_$v* pg_curl_$v* pgjq_$v* pgjwt_$v pg_smtp_client_$v pg_html5_email_address_$v url_encode_$v* pgsql_tweaks_$v pg_extra_time_$v pgpcre_$v icu_ext_$v* pgqr_$v* pg_protobuf_$v pg_envvar_$v* floatfile_$v* pg_readme_$v ddl_historization_$v data_historization_$v pg_schedoc_$v pg_hashlib_$v pg_xxhash_$v* postgres_shacrypt_$v* cryptint_$v* pg_ecdsa_$v* pgsparql_$v"
pgsql-func: "pg_idkit_$v pg_uuidv7_$v* permuteseq_$v* pg_hashids_$v* sequential_uuids_$v topn_$v* quantile_$v* lower_quantile_$v* count_distinct_$v* omnisketch_$v* ddsketch_$v* vasco_$v* pgxicor_$v* tdigest_$v* first_last_agg_$v extra_window_functions_$v* floatvec_$v* aggs_for_vecs_$v* aggs_for_arrays_$v* pg_arraymath_$v* pg_math_$v* pg_random_$v* pg_base36_$v* pg_base62_$v* pg_base58_$v pg_financial_$v*"
pgsql-admin: "pg_repack_$v* pg_squeeze_$v* pg_dirtyread_$v* pgfincore_$v* pg_cooldown_$v* ddlx_$v pg_prioritize_$v* pg_readonly_$v* pg_upless_$v pg_permissions_$v pg_catcheck_$v* preprepare_$v* pgcozy_$v pg_orphaned_$v* pg_crash_$v* pg_cheat_funcs_$v* pg_fio_$v pg_savior_$v* safeupdate_$v* pg_drop_events_$v table_log_$v" #pg_checksums_$v* #pg_auto_failover_$v* #pgagent_$v* #pgpool-II-pgsql-extensions
pgsql-stat: "pg_profile_$v* pg_tracing_$v* pg_show_plans_$v* pg_stat_kcache_$v* pg_stat_monitor_$v* pg_qualstats_$v* pg_store_plans_$v* pg_track_settings_$v pg_wait_sampling_$v* system_stats_$v* pg_meta_$v pgnodemx_$v pg_sqlog_$v bgw_replstatus_$v* pgmeminfo_$v* toastinfo_$v* pg_explain_ui_$v pg_relusage_$v pagevis_$v powa_$v*"
pgsql-sec: "passwordcheck_cracklib_$v* supautils_$v* pgsodium_$v* vault_$v* pg_session_jwt_$v pg_anon_$v pgsmcrypto_$v pgaudit_$v* pgauditlogtofile_$v* pg_auth_mon_$v* credcheck_$v* pgcryptokey_$v pg_jobmon_$v logerrors_$v* login_hook_$v* set_user_$v* pg_snakeoil_$v* pgextwlist_$v* pg_auditor_$v sslutils_$v* noset_$v*" #pg_tde_$v*
pgsql-fdw: "wrappers_$v multicorn2_$v* odbc_fdw_$v* mysql_fdw_$v* tds_fdw_$v* sqlite_fdw_$v* pgbouncer_fdw_$v redis_fdw_$v* pg_redis_pubsub_$v* hdfs_fdw_$v* firebird_fdw_$v aws_s3_$v log_fdw_$v*" #jdbc_fdw_$v* #oracle_fdw_$v* #db2_fdw_$v* #mongo_fdw_$v* #kafka_fdw_$v
pgsql-sim: "documentdb_$v* orafce_$v pgtt_$v* session_variable_$v* pg_statement_rollback_$v* pg_dbms_metadata_$v pg_dbms_lock_$v pgmemcache_$v*" #pg_dbms_job_$v #wiltondb
pgsql-etl: "pglogical_$v* pglogical_ticker_$v* pgl_ddl_deploy_$v* pg_failover_slots_$v* db_migrator_$v wal2json_$v* postgres-decoderbufs_$v* decoder_raw_$v* mimeo_$v pg_fact_loader_$v* pg_bulkload_$v*" #wal2mongo_$v* #repmgr_$v*
postgresql: "postgresql-$v postgresql-client-$v postgresql-plpython3-$v postgresql-plperl-$v postgresql-pltcl-$v postgresql-server-dev-$v"
pgsql-main: "postgresql-$v postgresql-client-$v postgresql-plpython3-$v postgresql-plperl-$v postgresql-pltcl-$v postgresql-server-dev-$v postgresql-$v-repack postgresql-$v-wal2json postgresql-$v-pgvector"
pgsql-core: "postgresql-$v postgresql-client-$v postgresql-plpython3-$v postgresql-plperl-$v postgresql-pltcl-$v postgresql-server-dev-$v"
pgsql-simple: "postgresql-$v postgresql-client-$v postgresql-plperl-$v postgresql-plpython3-$v postgresql-pltcl-$v"
pgsql-client: "postgresql-client-$v"
pgsql-server: "postgresql-$v"
pgsql-devel: "postgresql-server-dev-$v"
pgsql-basic: "postgresql-$v-repack postgresql-$v-wal2json postgresql-$v-pgvector"
pgsql-time: "postgresql-$v-timescaledb-tsl postgresql-$v-timescaledb-toolkit postgresql-$v-pg-timeseries postgresql-$v-periods postgresql-$v-temporal-tables postgresql-$v-emaj postgresql-$v-table-version postgresql-$v-cron postgresql-$v-pg-task postgresql-$v-pg-later postgresql-$v-pg-background"
pgsql-gis: "postgresql-$v-postgis-3 postgresql-$v-postgis-3-scripts postgresql-$v-pgrouting postgresql-$v-pgrouting-scripts postgresql-$v-pointcloud postgresql-$v-h3 postgresql-$v-q3c postgresql-$v-ogr-fdw postgresql-$v-geoip postgresql-$v-pg-polyline postgresql-$v-pg-geohash postgresql-$v-mobilitydb"
pgsql-rag: "postgresql-$v-pgvector postgresql-$v-vchord postgresql-$v-pgvectorscale postgresql-$v-pg-vectorize postgresql-$v-similarity postgresql-$v-smlar postgresql-$v-pg-summarize postgresql-$v-pg-tiktoken postgresql-$v-pg4ml postgresql-$v-pgml"
pgsql-fts: "postgresql-$v-pg-search postgresql-$v-pgroonga postgresql-$v-pg-bigm postgresql-$v-zhparser postgresql-$v-pg-bestmatch postgresql-$v-vchord-bm25 postgresql-$v-hunspell-cs-cz postgresql-$v-hunspell-de-de postgresql-$v-hunspell-en-us postgresql-$v-hunspell-fr postgresql-$v-hunspell-ne-np postgresql-$v-hunspell-nl-nl postgresql-$v-hunspell-nn-no postgresql-$v-hunspell-ru-ru postgresql-$v-hunspell-ru-ru-aot"
pgsql-olap: "postgresql-$v-citus postgresql-$v-pg-analytics postgresql-$v-pg-duckdb postgresql-$v-pg-mooncake postgresql-$v-duckdb-fdw postgresql-$v-pg-parquet postgresql-$v-pg-fkpart postgresql-$v-partman postgresql-$v-plproxy" #postgresql-$v-hydra
pgsql-feat: "postgresql-$v-age postgresql-$v-hll postgresql-$v-rum postgresql-$v-pg-graphql postgresql-$v-pg-jsonschema postgresql-$v-jsquery postgresql-$v-pg-hint-plan postgresql-$v-hypopg postgresql-$v-index-advisor postgresql-$v-pg-plan-filter postgresql-$v-imgsmlr postgresql-$v-pg-ivm postgresql-$v-pg-incremental postgresql-$v-pgmq postgresql-$v-pgq3 postgresql-$v-pg-cardano postgresql-$v-omnigres" #postgresql-$v-rdkit
pgsql-lang: "postgresql-$v-pg-tle postgresql-$v-plv8 postgresql-$v-pllua postgresql-$v-pldebugger postgresql-$v-plpgsql-check postgresql-$v-plprofiler postgresql-$v-plsh postgresql-$v-pljava" #postgresql-$v-plprql #postgresql-$v-plr #postgresql-$v-pgtap
pgsql-type: "postgresql-$v-prefix postgresql-$v-semver postgresql-$v-unit postgresql-$v-pgpdf postgresql-$v-pglite-fusion postgresql-$v-md5hash postgresql-$v-asn1oid postgresql-$v-roaringbitmap postgresql-$v-pgfaceting postgresql-$v-pgsphere postgresql-$v-pg-country postgresql-$v-pg-xenophile postgresql-$v-pg-currency postgresql-$v-collection postgresql-$v-pgmp postgresql-$v-numeral postgresql-$v-rational postgresql-$v-pguint postgresql-$v-pg-uint128 postgresql-$v-hashtypes postgresql-$v-ip4r postgresql-$v-pg-duration postgresql-$v-pg-uri postgresql-$v-pg-emailaddr postgresql-$v-acl postgresql-$v-debversion postgresql-$v-pg-rrule postgresql-$v-timestamp9 postgresql-$v-chkpass"
pgsql-util: "postgresql-$v-gzip postgresql-$v-bzip postgresql-$v-zstd postgresql-$v-http postgresql-$v-pg-net postgresql-$v-pg-curl postgresql-$v-pgjq postgresql-$v-pgjwt postgresql-$v-pg-smtp-client postgresql-$v-pg-html5-email-address postgresql-$v-url-encode postgresql-$v-pgsql-tweaks postgresql-$v-pg-extra-time postgresql-$v-pgpcre postgresql-$v-icu-ext postgresql-$v-pgqr postgresql-$v-pg-protobuf postgresql-$v-pg-envvar postgresql-$v-floatfile postgresql-$v-pg-readme postgresql-$v-ddl-historization postgresql-$v-data-historization postgresql-$v-pg-schedoc postgresql-$v-pg-hashlib postgresql-$v-pg-xxhash postgresql-$v-shacrypt postgresql-$v-cryptint postgresql-$v-pg-ecdsa postgresql-$v-pgsparql"
pgsql-func: "postgresql-$v-pg-idkit postgresql-$v-pg-uuidv7 postgresql-$v-permuteseq postgresql-$v-pg-hashids postgresql-$v-sequential-uuids postgresql-$v-topn postgresql-$v-quantile postgresql-$v-lower-quantile postgresql-$v-count-distinct postgresql-$v-omnisketch postgresql-$v-ddsketch postgresql-$v-vasco postgresql-$v-pgxicor postgresql-$v-tdigest postgresql-$v-first-last-agg postgresql-$v-extra-window-functions postgresql-$v-floatvec postgresql-$v-aggs-for-vecs postgresql-$v-aggs-for-arrays postgresql-$v-pg-arraymath postgresql-$v-pg-math postgresql-$v-random postgresql-$v-base36 postgresql-$v-base62 postgresql-$v-pg-base58 postgresql-$v-pg-financial"
pgsql-admin: "postgresql-$v-repack postgresql-$v-squeeze postgresql-$v-dirtyread postgresql-$v-pgfincore postgresql-$v-pg-cooldown postgresql-$v-ddlx postgresql-$v-prioritize postgresql-$v-pg-checksums postgresql-$v-pg-readonly postgresql-$v-pg-upless postgresql-$v-pg-permissions postgresql-$v-auto-failover postgresql-$v-pg-catcheck postgresql-$v-preprepare postgresql-$v-pgcozy postgresql-$v-pg-orphaned postgresql-$v-pg-crash postgresql-$v-pg-cheat-funcs postgresql-$v-pg-fio postgresql-$v-pg-savior postgresql-$v-pg-safeupdate postgresql-$v-pg-drop-events postgresql-$v-tablelog" #pgagent #postgresql-$v-pgpool2
pgsql-stat: "postgresql-$v-pg-profile postgresql-$v-pg-tracing postgresql-$v-show-plans postgresql-$v-pg-stat-kcache postgresql-$v-pg-stat-monitor postgresql-$v-pg-qualstats postgresql-$v-pg-store-plan postgresql-$v-pg-track-settings postgresql-$v-pg-wait-sampling postgresql-$v-system-stats postgresql-$v-pg-meta postgresql-$v-pgnodemx postgresql-$v-pg-sqlog postgresql-$v-bgw-replstatus postgresql-$v-pgmeminfo postgresql-$v-toastinfo postgresql-$v-pg-explain-ui postgresql-$v-pg-relusage postgresql-$v-pagevis postgresql-$v-powa"
pgsql-sec: "postgresql-$v-passwordcheck-cracklib postgresql-$v-supautils postgresql-$v-pgsodium postgresql-$v-vault postgresql-$v-pg-session-jwt postgresql-$v-pg-anon postgresql-$v-pgsmcrypto postgresql-$v-pgaudit postgresql-$v-pgauditlogtofile postgresql-$v-pg-auth-mon postgresql-$v-credcheck postgresql-$v-pgcryptokey postgresql-$v-pg-jobmon postgresql-$v-logerrors postgresql-$v-login-hook postgresql-$v-set-user postgresql-$v-snakeoil postgresql-$v-pgextwlist postgresql-$v-pg-auditor postgresql-$v-sslutils postgresql-$v-noset" #postgresql-$v-pg-tde
pgsql-fdw: "postgresql-$v-wrappers postgresql-$v-mysql-fdw postgresql-$v-tds-fdw postgresql-$v-redis-fdw postgresql-$v-pg-redis-pubsub postgresql-$v-firebird-fdw postgresql-$v-aws-s3 postgresql-$v-log-fdw" # #postgresql-$v-oracle-fdw #postgresql-$v-sqlite-fdw #postgresql-$v-kafka-fdw
pgsql-sim: "postgresql-$v-documentdb postgresql-$v-orafce postgresql-$v-pgtt postgresql-$v-session-variable postgresql-$v-pg-statement-rollback postgresql-$v-pgmemcache" # #wiltondb
pgsql-etl: "postgresql-$v-pglogical postgresql-$v-pglogical-ticker postgresql-$v-pgl-ddl-deploy postgresql-$v-pg-failover-slots postgresql-$v-db-migrator postgresql-$v-wal2json postgresql-$v-decoderbufs postgresql-$v-decoder-raw postgresql-$v-mimeo postgresql-$v-pg-fact-loader postgresql-$v-pg-bulkload" #postgresql-$v-wal2mongo #postgresql-$v-repmgr
在使用这些别名下载 PostgreSQL 软件包时,请注意,这些软件包别名与包名中的 $v
占位符变量,会在使用时被替换为实际的 PostgreSQL 大版本号(由 pg_version
参数指定,默认为 17
)。
如果您想要安装其他 PostgreSQL 大版本,只需要修改 pg_version
即可。
当然您也可以直接使用指定大版本的别名与包名,例如这些带有 pgsql-
前缀的的别名可以直接替换为 pg17-
, pg16-
,pg15-
以显式下载其他大版本的软件包。
请注意,并非所有系统都支持所有扩展插件,一些不可用,的扩展插件默认会从扩展分类列表中移除,以注释项的形式出现在别名末尾。
但并非所有在注释中的扩展都不可用,一些扩展只是较为不合时宜而未被默认列入(依赖过于庞大,比如 pl/R
,或者依赖商业软件,比如 oracle_fdw
),
而另一些可能只是在当前 PG 17 大版本中不可用,而在更早的 13-16 中可用,您依然可以手工添加这些所需的扩展并下载安装。
3 - 扩展仓库
如果您使用 Pigsty 来部署 PostgreSQL 并安装扩展,那么您 并不需要 关心软件仓库的问题,Pigsty 会自动为您配置好一切。 但如果您想要独立使用 Pigsty 扩展仓库(例如为您现有的 PG 部署安装 400+ 额外扩展),那么本节内容将对您有所帮助。
PostgreSQL 全球开发组(PGDG)提供了的 PGDG YUM/APT 软件仓库,可以视作 PostgreSQL 的“官方”仓库仓库。 而 Pigsty 提供了一个补充软件仓库(类似于 EPEL 之于 RHEL),针对 PostgreSQL 扩展与生态工具,提供了额外的 RPM / DEB 包,并在构建规范上与 PGDG 仓库 保持一致。
目前 Pigsty 扩展仓库支持 x86_64/aarch64
架构,包括两个子仓库:pigsty-infra
与 pigsty-pgsql
,
前者包含了 OS 大版本无关的通用基础设施组件(例如 EL 7/8/9 都能用的 go 程序 vip-manager),
后者包含了 OS 大版本相关的 PostgreSQL 扩展,具体的支持范围为:EL 8/9, Debian 12,Ubuntu 22.04/24.04,总计 10 个发行版大版本架构组合。
在支持的操作系统上,我们提供 PostgreSQL 包管理器 pig
命令行工具,提供了 Pigsty 仓库/扩展管理功能的子集,可以帮助您管理软件仓库,并安装/卸载/更新/查询扩展。
当然 Pigsty 扩展仓库也同样支持传统的 手动添加 方式,使用 yum/dnf/apt 进行手工管理。
快速上手
您可以使用 Pigsty 提供的 pig
命令行工具,管理 Linux 操作系统上的软件仓库。使用以下命令 安装 pig
命令行工具:
curl https://repo.pigsty.cc/pig | bash
使用以下命令添加软件仓库,Pig 命令行工具会自动检测您的网络条件(墙内/墙外),并选择速度最快的镜像:
pig repo add pigsty # 添加 PIGSTY 仓库
pig repo add pgdg # 添加 PGDG 仓库
pig repo add pgsql # 添加 PGDG + PIGSTY 镜像源
pig repo add node # 添加操作系统默认软件仓库
pig repo add all # 添加 PIGSTY + PGDG + NODE 仓库
所有Repo 文件默认会写入 /etc/yum.repos.d/
(EL) 与 /etc/apt/sources.list.d/
(Debian/Ubuntu) 目录下。
您可以使用以下命令,向当前系统添加 PIGSTY + PGDG + NODE 仓库并更新软件仓库缓存:
pig repo add all -u # 添加 NODE + PGSQL 软件仓库并更新缓存
如果您想要清除并覆盖当前系统上的所有仓库,并重新添加 PIGSTY + PGDG + NODE 仓库,您可以使用以下命令:
pig repo add all -ru # remove + update
pig repo set # 上面命令的缩写
移除的现有 repo 文件会被自动备份到上述目录下的 backup
目录中。
我们建议使用这种方式来管理软件仓库,但如果您不想使用 Pigsty 提供的命令行工具,您也可以 手工添加 YUM/APT软件仓库。
手工添加
您可以使用以下 Shell 命令,手工添加 Pigsty 仓库的 GPG 公钥,写入仓库定义,并更新缓存。
默认的 repo.pigsty.io
仓库托管于 Cloudflare CDN,中国大陆地区的用户访问速度较慢。
您可以使用国内 CDN 镜像站 repo.pigsty.cc
,替换默认的 repo.pigsty.io
仓库:
YUM仓库
对于 EL 8/9 及兼容系统,使用以下命令依次添加 Pigsty 仓库的 GPG 公钥,写入仓库定义,并更新缓存:
# 将 pigsty 的 gpg 公钥添加到你的系统钥匙链中,从而验证软件包签名
curl -fsSL https://repo.pigsty.cc/key | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty >/dev/null
# 向 /etc/yum.repos.d 目录中添加 Pigsty Repo 定义文件,包括两个仓库
sudo tee /etc/yum.repos.d/pigsty-cc.repo > /dev/null <<-'EOF'
[pigsty-infra]
name=Pigsty Infra for $basearch
baseurl=https://repo.pigsty.cc/yum/infra/$basearch
skip_if_unavailable = 1
enabled = 1
priority = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty
module_hotfixes=1
[pigsty-pgsql]
name=Pigsty PGSQL For el$releasever.$basearch
baseurl=https://repo.pigsty.cc/yum/pgsql/el$releasever.$basearch
skip_if_unavailable = 1
enabled = 1
priority = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty
module_hotfixes=1
EOF
# 刷新 YUM/DNF 仓库缓存
sudo yum makecache;
# 将 pigsty 的 gpg 公钥添加到你的系统钥匙链中,从而验证软件包签名
curl -fsSL https://repo.pigsty.io/key | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty >/dev/null
# 向 /etc/yum.repos.d 目录中添加 Pigsty Repo 定义文件,包括两个仓库
sudo tee /etc/yum.repos.d/pigsty-io.repo > /dev/null <<-'EOF'
[pigsty-infra]
name=Pigsty Infra for $basearch
baseurl=https://repo.pigsty.io/yum/infra/$basearch
skip_if_unavailable = 1
enabled = 1
priority = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty
module_hotfixes=1
[pigsty-pgsql]
name=Pigsty PGSQL For el$releasever.$basearch
baseurl=https://repo.pigsty.io/yum/pgsql/el$releasever.$basearch
skip_if_unavailable = 1
enabled = 1
priority = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty
module_hotfixes=1
EOF
# 刷新 YUM/DNF 仓库缓存
sudo yum makecache;
APT仓库
对于 Debian/Ubuntu 及其兼容系统,使用以下命令依次添加 Pigsty 仓库的 GPG 公钥,写入仓库定义,并更新缓存:
# 将 pigsty 的 gpg 公钥添加到你的系统钥匙链中,从而验证软件包签名
curl -fsSL https://repo.pigsty.cc/key | sudo gpg --dearmor -o /etc/apt/keyrings/pigsty.gpg
# 获取 Debian 发行版代号,distro_codename=jammy, focal, bullseye, bookworm,并将对应上游仓库地址写入 APT List 文件
distro_codename=$(lsb_release -cs)
sudo tee /etc/apt/sources.list.d/pigsty-io.list > /dev/null <<EOF
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.cc/apt/infra generic main
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.cc/apt/pgsql/${distro_codename} ${distro_codename} main
EOF
# 刷新 APT 仓库缓存
sudo apt update
# 将 pigsty 的 gpg 公钥添加到你的系统钥匙链中,从而验证软件包签名
curl -fsSL https://repo.pigsty.io/key | sudo gpg --dearmor -o /etc/apt/keyrings/pigsty.gpg
# 获取 Debian 发行版代号,distro_codename=jammy, focal, bullseye, bookworm,并将对应上游仓库地址写入 APT List 文件
distro_codename=$(lsb_release -cs)
sudo tee /etc/apt/sources.list.d/pigsty-io.list > /dev/null <<EOF
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.io/apt/infra generic main
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.io/apt/pgsql ${distro_codename} main
EOF
# 刷新 APT 仓库缓存
sudo apt update
仓库内容
pigsty-pgsql
仓库包含以下内容:
- 208 个 PostgreSQL 扩展对应的 RPM 包(由 Pigsty 维护,未收录于 PGDG YUM 仓库中)
- 215 个 PostgreSQL 扩展对应的 DEB 包(由 Pigsty 维护,未收录于 PGDG APT 仓库中)
- haproxy 3.1
- redis 7.2
pigsty-infra
仓库包含以下内容:
- etcd : 3.5.18
- duckdb : 1.2.0
- ferretdb: 2.0.0-rc1
- pg_timetable: 5.11.0
- grafana : 11.5.2
- prometheus : 3.1.0
- pushgateway : 1.11.0
- alertmanager : 0.28.0
- blackbox_exporter : 0.25.0
- nginx_exporter : 1.4.1
- node_exporter : 1.8.2
- keepalived_exporter : 1.4.0
- pgbackrest_exporter 0.19.0
- mysqld_exporter : 0.16.0
- redis_exporter : 1.67.0
- kafka_exporter : 1.8.0
- mongodb_exporter : 0.43.1
- VictoriaMetrics : 1.111.0
- VictoriaLogs : 1.9.1
- tigerbeetle 0.16.27
- loki : 3.1.1
- promtail : 3.0.0 (3.1.1 fail on el7/el8)
签名密钥
Pigsty 补充仓库中的所有 RPM/DEB 包都使用指纹为 9592A7BC7A682E7333376E09E7935D8DB9BD8B20
(B9BD8B20
) 的 GPG 密钥进行签名。
此密钥对应的公钥为:
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
/c7w
=4rRi
-----END PGP PUBLIC KEY BLOCK-----
4 - 安装扩展
Pigsty 使用操作系统标准的包管理器(yum/apt)来安装 PostgreSQL 扩展插件。
配置扩展
在 PGSQL 集群初始化时,Pigsty 会自动安装 pg_packages
和 pg_extensions
中指定的扩展插件。
两个参数都可以用于安装 PostgreSQL 相关软件包,通常 pg_packages
用于在全局指定整个环境中所有 PostgreSQL 集群都需要统一安装的软件包:例如 PostgreSQL 内核,高可用组建 Patroni,连接池 pgBouncer,监控 pgExporter 等。
Pigsty 默认也会在这里指定安装三个重要扩展:pgvector
, pg_repack
和 wal2json
用于膨胀治理和 CDC 变更抽取。
而 pg_extensions
则通常用于在特定集群中,指定本集群需要安装的扩展插件。默认为空列表,表示不安装任何额外的扩展插件。
pg_packages: # pg packages to be installed, alias can be used
- postgresql`
- wal2json pg_repack pgvector
- patroni pgbouncer pgbackrest pg_exporter pgbadger vip-manager
pg_extensions: [] # pg extensions to be installed, alias can be used
另一个重要区别是:pg_packages
安装的软件包只确保存在即可,而 pg_extensions
安装的软件包会默认 升级到最新可用版本。
当使用本地软件源时,这并不是一个问题。当您直接使用互联网上游软件源时,请充分考虑这一点,并将不希望升级的扩展插件转移到 pg_packages
中。
在现有集群上安装扩展
对于一个已经完成置备初始化的 PostgreSQL 集群,如果你想安装新的扩展插件:
首先将所需的扩展添加至 pg_extensions
中,然后通过以下命令执行子任务完成安装:
./pgsql.yml -t pg_extension # 安装 pg_extensions 中指定的扩展插件
请注意,pg_extension
任务中指定的扩展插件会默认升级到当前环境中最新可用版本。
安装扩展的前提条件
想要安装扩展插件,您需要确保以下两项中任意一项成立
- 本地安装:您已经配置了 Pigsty 的本地软件源,并且扩展已经下载至至本地软件仓库。
- 在线安装:您已经在待安装的节点上直接配置上游互联网软件源,并且可以访问互联网。
通常来说,对于严肃的生产环境,您应该使用 Pigsty 的本地软件源来统一管理并安装扩展: 首先下载到本地软件仓库中,再从本地软件仓库中安装扩展。这样可以确保扩展的版本全局一致,并避免让数据库节点直接访问互联网。 但某些时候(例如在开发环境中为了方便)您也可以直接使用互联网上游软件源来安装扩展。
要使用本地安装,您首先需要确保目标扩展已经被 下载 到本地软件仓库中。 如果要使用在线安装,请确保待安装的节点可以访问互联网,并且上游软件源可以正常访问。 然后使用以下命令来直接在目标集群上添加仓库并安装扩展:
./node.yml -l <cls> -t node_repo -e node_repo_modules=local,node,pgsql # 在目标节点上启用互联网软件仓库
./pgsql.yml -l <cls> -t pg_extension # 使用本地+互联网上游仓库安装扩展
扩展名翻译机制
在 Pigsty 中,您可以在 pg_packages
和 pg_extensions
中使用:
- 原始的操作系统 RPM/DEB 包名,您可以在包名中使用
*
通配符。 - 带有
$v
占位符的包名,Pigsty 会自动使用pg_version
的值替换占位符。 - Pigsty 提供的 标准扩展包名 ,Pigsty 会自动根据活跃 PG 大版本与操作系统翻译为对应的 RPM/DEB 包名。
例如:
postgis35_15* # 直接指定 RPM 包名名称
postgresql-14-postgis-3* # 直接指定 DEB 包名称
postgresql-$v-postgis-3* # 指定 DEB 包名称,同时使用 PG 大版本号占位符 $v
postgis35_$v* # 指定 RPM 包名称,同时使用 PG 大版本号占位符 $v
postgis # 指定扩展包别名,自动翻译为 DEB/RPM 包名,与当前活跃 PG 大版本
我们建议使用 Pigsty 提供的标准化扩展名(Alias),在不同的操作系统发行版中, Pigsty 将标准扩展名翻译为对应 PG 大版本的 RPM / DEB 包名,这样用户可以无需关心不同操作系统发行版的扩展包名差异:
Pigsty 尽最大努力对齐 EL 操作系统与 Debian 操作系统生态的 PostgreSQL 扩展,但仍有少量扩展因为各种原因难以/尚未移植, 请参考 RPM扩展列表 与 DEB扩展列表 了解更多信息。
5 - 加载扩展
除了纯 SQL 编写的扩展外,绝大多数扩展都会提供一个 .so
文件,这是一个动态连接库文件。大部分扩展并不需要显式加载,只需要通过 CREATE EXTENSION
直接启用 即可。
但一小部分扩展使用了 PostgreSQL 的 Hook 机制,要启用 这些扩展 需要一个额外的加载步骤 —— 您需要修改 PostgreSQL 集群的 shared_preload_libraries
参数,然后重启数据库服务器使其生效。
如果您在未加载/重启生效的情况下直接执行 CREATE EXTENSION
会报错。
快速上手
例如,在 conf/app/supa
配置模板中,我们定义了 Supabase 需要的扩展列表,并显式指定了 pg_libs
参数,用于加载扩展:
all:
children:
pg-meta:
hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
vars:
pg_cluster: pg-meta
pg_databases:
- name: postgres
pg_libs: 'timescaledb, plpgsql, plpgsql_check, pg_cron, pg_net, pg_stat_statements, auto_explain, pg_tle, plan_filter'
schemas: [ extensions ,auth ,realtime ,storage ,graphql_public ,supabase_functions ,_analytics ,_realtime ]
extensions: # 这里定义了在 postgres 数据库中 创建启用 的扩展列表
- { name: pgcrypto ,schema: extensions } # 加密函数
- { name: pg_net ,schema: extensions } # 异步 HTTP
- { name: pgjwt ,schema: extensions } # PostgreSQL 的 JSON Web Token API
- { name: uuid-ossp ,schema: extensions } # 生成通用唯一标识符 (UUID)
- { name: pgsodium } # pgsodium 是 PostgreSQL 的现代加密库
- { name: supabase_vault } # Supabase 保险库扩展
- { name: pg_graphql } # pg_graphql: GraphQL 支持
- { name: pg_jsonschema } # pg_jsonschema: 验证 JSON 模式
- { name: wrappers } # wrappers: 外部数据包装器集合
- { name: http } # http: 允许在数据库内检索网页
- { name: pg_cron } # pg_cron: PostgreSQL 的任务调度器
- { name: timescaledb } # timescaledb: 支持时间序列数据的可扩展插入和复杂查询
- { name: pg_tle } # pg_tle: PostgreSQL 的可信语言扩展
- { name: vector } # pgvector: 向量相似性搜索
- { name: pgmq } # pgmq: 类似 AWS SQS 和 RSMQ 的轻量级消息队列
并非所有扩展都需要通过 pg_libs
进行动态加载,例如这里的 pgcrypto
, pgjwt
, vector
等扩展,需要动态加载的扩展,请参考 需要加载的扩展 列表。
默认加载的扩展
在 Pigsty 中,默认会加载以下两个 PostgreSQL 第一方自带的 Contrib 扩展:
auto_explain
用于提供一种自动记录慢查询执行计划的手段,用于微观优化特定慢查询 SQLpg_stat_statements
用于跟踪所有执行的 SQL 语句的计划和执行统计信息,用于宏观统计一类 SQL 的执行指标
这是两个用于 PostgreSQL 宏观/微观查询优化 的重要自带扩展插件,因此在 Pigsty 中,pg_libs
的默认值是 pg_stat_statements, auto_explain
,
我们强烈建议您在配置加载项时保留这两个扩展,只需要在修改 pg_libs
,pg_parameters
或者直接修改 shared_preload_libraries
参数时将这两项保留即可。
修改集群配置
要修改 PostgreSQL 集群配置,有许多不同的方式,在 Pigsty 中,我们建议:
对于尚未创建的新集群,您可以在 pg_libs
参数中进行配置,指定 shared_preload_libraries
参数的初始值。
请注意,pg_libs
仅在 创建集群 时生效,在集群创建后,该参数被指定为真正的 PostgreSQL 参数 shared_preload_libraries
的初始值。
如果您需要修改默认加载的扩展,通常可以通过 Patroni 命令行 修改集群配置,直接修改 shared_preload_libraries
参数,应用后重启数据库集群生效。
对于已经初始化好的集群,您可以通过 Patroni 命令行 修改集群配置 来修改 shared_preload_libraries
参数,应用后重启数据库集群生效。
当然您也可以通过其他方式修改 shared_preload_libraries
参数,例如手工编辑 postgresql.conf
文件,或者 ALTER SYSTEM
命令等方式进行更改,
或者通过 pg_parameters
参数进行显式覆盖,只需要确保集群范围内此配置统一一致即可。
加载注意事项
在 shared_preload_libraries
中,如果有多个扩展插件需要加载,可以使用逗号分隔,例如:
shared_preload_libraries = 'timescaledb, pg_stat_statements, auto_explain'
请注意,citus
和 timescaledb
这两个扩展显式提出要求,要在 shared_preload_libraries
中预先加载,也就是放在最前面。
由于生态定位的问题,同时使用两者的情况非常罕见,但在这种情况中,建议将 citus
放在 timescaledb
之前。
全文检索插件 pg_search
要求显式加载,但是在 PostgreSQL 17 版本中,可以不显式加载。
MongoDB 仿真插件 documentdb
实际的动态库名称与扩展名不一致 —— 你需要使用 pg_documentdb
和 pg_documentdb_core
作为动态链接库的名称。
需要加载的扩展
在 扩展列表 中,带有 LOAD
标记的扩展,即为需要动态加载并重启的扩展,包括:
扩展名 | 扩展包名 | 分类 | 说明 |
---|---|---|---|
timescaledb | timescaledb | TIME | 时序数据库扩展插件 |
pg_cron | pg_cron | TIME | 定时任务调度器 |
pg_task | pg_task | TIME | 在特定时间点在后台执行SQL命令 |
vchord | vchord | RAG | 使用Rust重写的高性能向量扩展 |
pgml | pgml | RAG | PostgresML:用SQL运行机器学习算法并训练模型 |
pg_bestmatch | pg_bestmatch | FTS | 在数据库内生成BM25稀疏向量 |
vchord_bm25 | vchord_bm25 | FTS | BM25排序算法 |
citus | citus | OLAP | Citus 分布式数据库 |
pg_duckdb | pg_duckdb | OLAP | 在PostgreSQL中的嵌入式DuckDB扩展 |
pg_parquet | pg_parquet | OLAP | 在PostgreSQL与本地/S3中的Parquet文件复制数据 |
plan_filter | pg_plan_filter | FEAT | 使用执行计划代价过滤阻止特定查询语句 |
omni | omnigres | FEAT | PostgreSQL即平台,Omnigres主扩展与加载器 |
pg_tle | pg_tle | LANG | AWS 可信语言扩展 |
plpgsql_check | plpgsql_check | LANG | 对 plpgsql 函数进行扩展检查 |
pgpdf | pgpdf | TYPE | PDF数据类型,管理函数与全文检索 |
pglite_fusion | pglite_fusion | TYPE | 在PG表中嵌入SQLite数据库作为数据类型 |
pg_net | pg_net | UTIL | 用 SQL 进行异步非阻塞HTTP/HTTPS 请求的扩展 (supabase) |
pg_squeeze | pg_squeeze | ADMIN | 从关系中删除未使用空间 |
pgautofailover | pgautofailover | ADMIN | PG 自动故障迁移 |
pg_crash | pg_crash | ADMIN | 向数据库进程随机发送信号模拟故障 |
pg_prewarm | pg_prewarm | ADMIN | 预热关系数据 |
pg_tracing | pg_tracing | STAT | PostgreSQL分布式Tracing |
pg_stat_kcache | pg_stat_kcache | STAT | 内核统计信息收集 |
pg_stat_monitor | pg_stat_monitor | STAT | 提供查询聚合统计、客户端信息、执行计划详细信息和直方图 |
pg_qualstats | pg_qualstats | STAT | 收集有关 quals 的统计信息的扩展 |
pg_store_plans | pg_store_plans | STAT | 跟踪所有执行的 SQL 语句的计划统计信息 |
pg_wait_sampling | pg_wait_sampling | STAT | 基于采样的等待事件统计 |
bgw_replstatus | bgw_replstatus | STAT | 用于汇报本机主从状态的后台工作进程 |
pg_relusage | pg_relusage | STAT | 打印查询引用的表与列 |
auto_explain | auto_explain | STAT | 提供一种自动记录执行计划的手段 |
pg_stat_statements | pg_stat_statements | STAT | 跟踪所有执行的 SQL 语句的计划和执行统计信息 |
passwordcheck_cracklib | passwordcheck | SEC | 使用cracklib加固PG用户密码 |
supautils | supautils | SEC | 用于在云环境中确保数据库集群的安全 |
pgsodium | pgsodium | SEC | 表数据加密存储 TDE |
anon | pg_anon | SEC | 数据匿名化处理工具 |
pg_tde | pg_tde | SEC | 试点性质的加密存储引擎 |
pgaudit | pgaudit | SEC | 提供审计功能 |
pg_snakeoil | pg_snakeoil | SEC | PostgreSQL动态链接库反病毒功能 |
pgextwlist | pgextwlist | SEC | PostgreSQL扩展白名单功能 |
noset | pg_noset | SEC | 阻止非超级用户使用SET/RESET设置变量 |
sepgsql | sepgsql | SEC | 基于SELinux标签的强制访问控制 |
auth_delay | auth_delay | SEC | 在返回认证失败前暂停一会,避免爆破 |
passwordcheck | passwordcheck | SEC | 用于强制拒绝修改弱密码的扩展 |
documentdb | documentdb | SIM | 微软DocumentDB的API层 |
documentdb_core | documentdb | SIM | 微软DocumentDB的核心API层实现 |
documentdb_distributed | documentdb | SIM | DocumentDB多节点模式的API层 |
pg_statement_rollback | pg_statement_rollback | SIM | 在服务端提供类似Oracle/DB2的语句级回滚能力 |
babelfishpg_tsql | babelfishpg_tsql | SIM | SQL Server SQL语法兼容性扩展 |
pglogical_ticker | pglogical_ticker | ETL | pglogical复制延迟以秒计的精确视图 |
pg_failover_slots | pg_failover_slots | ETL | 在Failover过程中保留复制槽 |
6 - 启用扩展
CREATE EXTENSION
在 PostgreSQL 数据库中真正启用扩展?快速上手
PostgreSQL 扩展 安装完毕 后,用户可以通过 CREATE EXTENSION
命令启用扩展:
CREATE EXTENSION vector; -- 安装向量数据库扩展(无需加载)
CREATE EXTENSION timescaledb; -- 安装时序数据库扩展(需要加载)
有的扩展插件有依赖的扩展,在这种情况下,您可以首先安装依赖的扩展,或者选择执行 CREATE EXTENSION CASCADE
命令,一次性安装所有依赖的扩展。
CREATE EXTENSION documentdb CASCADE; -- 安装 documentdb 扩展,并安装它所有依赖的扩展
您还可以在 CREATE EXTENSION
命令中指定安装扩展的模式与具体版本。
配置扩展
扩展(数据库逻辑对象)在逻辑上属于 PostgreSQL 数据库 的组成部分,因此在 Pigsty 中,您可以在 pg_databases
中指定要在数据库中启用/创建的扩展。
pg_databases:
- name: postgres
baseline: supabase.sql
schemas: [ extensions ,auth ,realtime ,storage ,graphql_public ,supabase_functions ,_analytics ,_realtime ]
extensions: # 这里定义了在 postgres 数据库中 创建启用 的扩展列表
- { name: pgcrypto ,schema: extensions } # 加密函数
- { name: pg_net ,schema: extensions } # 异步 HTTP
- { name: pgjwt ,schema: extensions } # PostgreSQL 的 JSON Web Token API
- { name: uuid-ossp ,schema: extensions } # 生成通用唯一标识符 (UUID)
- { name: pgsodium } # pgsodium 是 PostgreSQL 的现代加密库
- { name: supabase_vault } # Supabase 保险库扩展
- { name: pg_graphql } # pg_graphql: GraphQL 支持
- { name: pg_jsonschema } # pg_jsonschema: 验证 JSON 模式
- { name: wrappers } # wrappers: 外部数据包装器集合
- { name: http } # http: 允许在数据库内检索网页
- { name: pg_cron } # pg_cron: PostgreSQL 的任务调度器
- { name: timescaledb } # timescaledb: 支持时间序列数据的可扩展插入和复杂查询
- { name: pg_tle } # pg_tle: PostgreSQL 的可信语言扩展
- { name: vector } # pgvector: 向量相似性搜索
- { name: pgmq } # pgmq: 类似 AWS SQS 和 RSMQ 的轻量级消息队列
在这里,数据库对象中的 extensions
是一个列表,每个元素可能是:
- 一个扩展名,简单的字符串,例如
vector
- 一个字典,可能包含以下字段:
name
: 唯一的 必选字段,指定扩展名,注意扩展名有可能不同于扩展包名。schema
:指定扩展安装的模式,默认是当前数据库超级用户搜索路径中的第一个模式,通常是默认的public
。version
:指定扩展的版本,默认是最新版本
如果数据库没有创建,在这里定义的扩展会在通过 Pigsty 创建集群 或 创建数据库 的时候被自动启用。
如果数据库已经启用并投产,我建议您通过标准的数据库模式变更流程(Schema Migration)来管理扩展的启用。 您可以在 Pigsty 配置文件中记录相应的修改,便于日后迁移等用例。
默认启用的扩展
Pigsty 默认会为托管的 PostgreSQL 数据库安装一些默认扩展,这些扩展会被创建至默认的 template1
模板数据库与 postgres
数据库中。
任何新建的数据库都会继承 template1
中的扩展配置,因此您无需额外配置,新建的数据库也会拥有这些扩展。
您可以通过修改 pg_default_extensions
参数,来修改全局默认安装启用的扩展,以及它们安装的位置。
所有在本参数重默认 启用 的扩展都是 PostgreSQL 自带的第一方 Contrib 扩展,唯一的例外是 pg_repack
扩展,它是一个来自 PGDG 的第三方扩展。
pg_repack
对于 PostgreSQL 表膨胀治理 非常重要,因此 Pigsty 默认会默认安装它并在所有数据库中默认启用。
pg_default_extensions:
- { name: pg_stat_statements ,schema: monitor }
- { name: pgstattuple ,schema: monitor }
- { name: pg_buffercache ,schema: monitor }
- { name: pageinspect ,schema: monitor }
- { name: pg_prewarm ,schema: monitor }
- { name: pg_visibility ,schema: monitor }
- { name: pg_freespacemap ,schema: monitor }
- { name: postgres_fdw ,schema: public }
- { name: file_fdw ,schema: public }
- { name: btree_gist ,schema: public }
- { name: btree_gin ,schema: public }
- { name: pg_trgm ,schema: public }
- { name: intagg ,schema: public }
- { name: intarray ,schema: public }
- { name: pg_repack } # <-- 唯一默认启用的三方扩展
在 Pigsty 的设计中,与监控相关的扩展会被创建至 monitor
模式中,其他功能特性性质的扩展会被创建至 public
模式中。
此外,向量数据库扩展 pgvector
有着特殊地位,它在 Pigsty 中会默认 安装,并在演示用的 meta
数据库中默认启用,作为演示之用。
最后,用于实现 CDC 变更数据捕获 的关键扩展 wal2json
扩展也会默认安装,但因为这是一个“无需启用”的逻辑解码插件,因此不会出现在 pg_default_extensions
中。
无需启用的扩展
并非所有扩展都需要通过 CREATE EXTENSION
命令启用。
从原理上来说:PostgreSQL 的扩展通常由以下三部分组成:
- 控制文件:包含关键元数据,必须
- SQL文件:包含 SQL 语句,可选
- 库文件:包含二进制动态连接库(
.so
,.dylib
,.dll
),可选
对于扩展来说,SQL
文件是可选项,因此如果扩展没有提供 SQL
文件,则通常不需要执行 CREATE EXTENSION
命令。
LOAD \ DDL | 需要 CREATE EXTENSION |
不需要 CREATE EXTENSION |
---|---|---|
需要动态加载 | 使用 Hook 的扩展 | 无头扩展 |
不需要动态加载 | 不用 Hook 的扩展 | 逻辑解码输出插件 |
例如提供 CDC 抽取能力的 wal2json
扩展,提供慢查询统计能力的 pg_stat_statements
与 auto_explain
扩展。
它们只有共享库文件和扩展 .control
文件,没有 SQL 文件,因此不需要/也无法通过 CREATE EXTENSION
命令启用。
请注意,没有 CREATE EXTENSION
命令,不影响扩展是否需要 LOAD
命令。一些扩展虽然没有 SQL/DDL
,但仍然需要 显式加载 ,比如一些安全审计相关的扩展。
无需启用的扩展列表
以下是所有无需 DDL 的扩展列表:
扩展名 | 扩展包名 | 分类 | 说明 |
---|---|---|---|
plan_filter | pg_plan_filter | FEAT | 使用执行计划代价过滤阻止特定查询语句 |
pg_checksums | pg_checksums | ADMIN | 在离线模式下激活/启用/禁用数据库集群的校验和功能 |
pg_crash | pg_crash | ADMIN | 向数据库进程随机发送信号模拟故障 |
safeupdate | safeupdate | ADMIN | 强制在 UPDATE 和 DELETE 时提供 Where 条件 |
basic_archive | basic_archive | ADMIN | 归档模块样例 |
basebackup_to_shell | basebackup_to_shell | ADMIN | 添加一种备份到Shell终端到基础备份方式 |
bgw_replstatus | bgw_replstatus | STAT | 用于汇报本机主从状态的后台工作进程 |
pg_relusage | pg_relusage | STAT | 打印查询引用的表与列 |
auto_explain | auto_explain | STAT | 提供一种自动记录执行计划的手段 |
passwordcheck_cracklib | passwordcheck | SEC | 使用cracklib加固PG用户密码 |
supautils | supautils | SEC | 用于在云环境中确保数据库集群的安全 |
pg_snakeoil | pg_snakeoil | SEC | PostgreSQL动态链接库反病毒功能 |
pgextwlist | pgextwlist | SEC | PostgreSQL扩展白名单功能 |
sepgsql | sepgsql | SEC | 基于SELinux标签的强制访问控制 |
auth_delay | auth_delay | SEC | 在返回认证失败前暂停一会,避免爆破 |
passwordcheck | passwordcheck | SEC | 用于强制拒绝修改弱密码的扩展 |
pg_statement_rollback | pg_statement_rollback | SIM | 在服务端提供类似Oracle/DB2的语句级回滚能力 |
pg_failover_slots | pg_failover_slots | ETL | 在Failover过程中保留复制槽 |
wal2json | wal2json | ETL | 用逻辑解码捕获 JSON 格式的 CDC 变更 |
wal2mongo | wal2mongo | ETL | 使用逻辑解码捕获MongoDB JSON格式的CDC变更 |
decoderbufs | decoderbufs | ETL | 将WAL逻辑解码为ProtocolBuffer协议的消息 |
decoder_raw | decoder_raw | ETL | 逻辑复制解码输出插件:RAW SQL格式 |
pgoutput | pgoutput | ETL | PG内置的逻辑解码输出插件 |
test_decoding | test_decoding | ETL | 基于SQL的WAL逻辑解码样例 |
7 - 更新扩展
要更新一个现有的扩展,您需要首先更新操作系统的软件包管理器中的 RPM/DEB 包版本,然后在 PostgreSQL 中通过 ALTER EXTENSION ... UPDATE
命令将扩展更新到新版本。
升级扩展软件包
所有在 pg_extension
中列出的扩展,都可以使用 Pigsty 的 pgsql.yml
剧本进行升级。
./pgsql.yml -t pg_extension
会自动安装当前环境中可用的最新版本扩展 RPM/DEB 包。
所有在 pg_extension
中列出的扩展,都可以使用上述剧本进行升级。
yum upgrade extname...
apt upgrade extname...
Pigsty 的 pig
命令行工具可以帮你完成这个任务:
pig ext update extname...
升级扩展软件包
然后执行数据库中的 ALTER EXTENSION ... UPDATE
命令,将扩展更新到新版本:
ALTER EXTENSION name UPDATE [ TO new_version ]
8 - 卸载扩展
移除扩展
要卸载某个扩展,通常需要执行 DROP EXTENSION
语句,例如:
DROP EXTENSION "<extname>";
请注意,如果有其他扩展,或者使用此扩展的数据库对象依赖,您需要首先卸载/删除这些依赖,然后再卸载此扩展;
或者,也可以使用以下语句一次性强制卸载扩展及其依赖:
DROP EXTENSION "<extname>" CASCADE;
注意:
CASCADE
选项会删除依赖于此扩展的所有对象,包括数据库对象、函数、视图等,慎用!
并非所有扩展都是通过 CREATE EXTENSION
语句安装的,这些扩展不需要显式执行 DROP EXTENSION
语句,请参考 无需启用的扩展列表。
移除默认加载
如果您使用的扩展需要 动态加载(修改了 shared_preload_libraries
参数),您需要首先 修改 shared_preload_libraries
参数。
将扩展名字符串从 shared_preload_libraries
中移除,并重启数据库集群生效后,您方可安全地卸载扩展包。
需要动态加载的扩展,请参考 需要加载的扩展 列表。
卸载扩展包
当你将扩展(逻辑对象)从集群中的 所有数据库 中移除后,您可以安全地卸载此扩展的软件包,Ansible 命令可以方便的帮您做到这一点:
ansible <cls> -m package -a "name=<extname> state=absent"
当然您也可以使用 pig
,或者 apt
或者 yum
的命令直接卸载。
如果您不知道扩展的名称,您可以参考 扩展列表 中的详情,或者参考 roles/node_id/vars
中定义的扩展包名映射。