Spock 安装指南:源码编译与 pgEdge 包部署两种方式对比
Spock 安装是搭建 PostgreSQL 多主复制集群的第一步,也是许多新手最先遇到的坎。Spock 是一款面向 PostgreSQL 15~19 的开源多主(active-active)逻辑复制扩展,基于 pgLogical 项目构建,支持双向写入、自动 DDL 复制、冲突解决等企业级特性。面对 Spock 安装,很多人纠结:选开箱即用的 pgEdge 包部署,还是从源码一步步编译?这篇文章用一份通俗易懂的 Spock 安装指南,从适用人群、操作步骤、维护成本三个角度对比两种方式,帮你快速选对路径、少走弯路。
认识 Spock:专为 PostgreSQL 多主复制而生 🚀
简单说,Spock 让多个 PostgreSQL 节点可以同时读写同一批数据,任何节点的修改都会实时同步到其他节点,实现「多主(multi-master)复制」。它常被用来搭建高可用、多活的数据架构,比如跨机房的双活集群。
与普通逻辑复制相比,Spock 的几个亮点很实用:
- ✅ 双向(多主)复制:每个节点既是发布者也是订阅者
- ✅ 自动 DDL 复制:建表、加字段自动同步到全集群
- ✅ 冲突检测与解决:内置多种冲突策略,保障数据一致
- ✅ 在线加节点:配合 Zodan 工具可无停机扩容
想要进一步了解,可翻阅项目内的官方文档:docs/index.md、docs/install_spock.md 和 docs/getting_started.md。
方式一:pgEdge 包部署——最快最稳的 Spock 安装方式 ⚡
如果你是新手,或者希望在生产环境快速落地,pgEdge 包部署是首选。它的思路很简单:通过系统包管理器(dnf/apt)安装 pgEdge 提供的 PostgreSQL 发行版,Spock 扩展已经随包内置,装完即可启用,全程只需几分钟。
一键安装步骤(以 PostgreSQL 18 为例)
第一步:添加 pgEdge 软件源。 Debian/Ubuntu 系执行:
sudo curl -sSL https://apt.pgedge.com/repodeb/pgedge-release_latest_all.deb -o /tmp/pgedge-release.deb
sudo dpkg -i /tmp/pgedge-release.deb
sudo apt update
RHEL/Rocky/AlmaLinux 系则先安装 EPEL 仓库,再执行 sudo dnf install 相关命令。
第二步:安装 PostgreSQL 与 Spock 扩展包。
# Debian/Ubuntu
sudo apt install -y pgedge-postgres18-server pgedge-postgres18-contrib pgedge-spock18
# RHEL/Rocky/AlmaLinux
sudo dnf install -y pgedge-postgres18-server pgedge-postgres18-contrib pgedge-spock18
第三步:初始化数据库集群并启动服务。
sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
sudo systemctl enable postgresql-18
sudo systemctl start postgresql-18
pgEdge 包部署能获得什么 🎁
除了 Spock 本身,pgEdge 发行版还自动集成了多款运维利器,省去大量手工装配工作:
- Spock 扩展与全部管理函数(预装待启用)
- ACE 一致性监控、Snowflake 序列
- pgBackRest 备份恢复、LOLOR 大对象支持
- 面向多活集群的一整套管理工具
包依赖关系可参考 pkg/rpm/spock.spec 与 pkg/deb/debian/control.in,可以看到 Spock 包的编译与依赖被完全托管,升级也只需一条 dnf update,非常省心。
方式二:源码编译安装 Spock——灵活但门槛更高 🔧
如果你需要定制内核、深度调优,或想研究 Spock 内部实现,可以选择源码编译。注意:Spock 必须构建在经过补丁处理的 PostgreSQL 源码之上,这也是它与普通扩展最大的不同。
源码编译前提条件
- 下载与目标版本一致的 PostgreSQL 源码(15~19 均可)
- 安装 jansson 库(Spock 的依赖)
- 准备编译工具链(gcc、make 等)
最快编译方法(五步走)
第一步:获取 Spock 源码。 克隆仓库:
git clone https://gitcode.com/gh_mirrors/spock3/spock
第二步:应用版本补丁。 项目 patches/ 目录下按 PostgreSQL 大版本分目录存放了补丁文件,例如 patches/15/、patches/18/。把对应版本的 .diff 文件依次拷入 PostgreSQL 源码根目录并按数字前缀顺序应用:
patch -p1 < pg18-015-attoptions.diff
第三步:编译安装补丁版 PostgreSQL(configure && make && make install),完成后把 pg_config 所在目录加入 PATH:
export PATH=/path/to/pg_config_dir:$PATH
第四步:编译安装 Spock 扩展。
cd spock
make
make install
第五步:验证产物。 安装成功后,share/extension/ 下会出现 spock.control 与升级脚本(如 sql/spock--6.0.0.sql),可执行 make check 跑回归测试确认环境无误。
两种 Spock 安装方式对比一览 📊
| 对比维度 | pgEdge 包部署 | 源码编译安装 |
|---|---|---|
| 安装难度 | ⭐ 低,命令即装 | ⭐⭐⭐ 高,需打补丁 |
| 耗时 | 5~10 分钟 | 1 小时以上 |
| 适用人群 | 新手、生产环境 | 高级用户、定制化场景 |
| 升级维护 | 包管理器一条命令 | 需重新编译 |
| 附带组件 | ACE、pgBackRest 等全家桶 | 仅 Spock 本体 |
| 灵活性 | 较低 | 高,可深度定制 |
安装后统一配置:让 Spock 跑起来 ⚙️
无论哪种方式,装完后都要做同样的配置。编辑 postgresql.conf,追加以下参数:
wal_level = logical
max_worker_processes = 10
max_replication_slots = 10
max_wal_senders = 10
shared_preload_libraries = 'spock'
track_commit_timestamp = on
💡 小提示:PostgreSQL 18+ 新增了
max_active_replication_origins参数单独控制复制来源状态,默认值 10 在多订阅场景可能不够,建议按订阅数酌情调大。
重启服务后连接数据库,创建扩展:
CREATE EXTENSION spock;
接着用 spock.node_create 注册节点、spock.repset_add_all_tables 加入复制集、spock.sub_create 建立订阅,一个多主复制集群就上线了。完整的分步演练可参考 docs/getting_started.md。
Spock 安装常见问题 FAQ ❓
Q:源码编译时提示找不到 jansson? 先安装 jansson 开发库(如 libjansson-dev / jansson-devel),再重新编译。
Q:补丁打不上或顺序错了? 必须严格按补丁文件名前缀的数字顺序应用,且确保 PostgreSQL 源码版本与补丁目录(15~19)完全对应。
Q:订阅一直卡在初始化? 多半是 max_replication_slots 或 max_wal_senders 设置偏小,适当调大后重启。
Q:想了解升级注意事项? 可查阅 docs/upgrading_spock.md,升级前务必做好备份。
总结:如何选择?🤔
- 追求省心、快速上线、生产环境 → 选 pgEdge 包部署,这也是官方推荐的安装路径
- 需要深度定制、学习内核机制、参与开发 → 选源码编译安装,灵活度更高
无论选哪条路,Spock 安装完成后你都将拥有一个强大的 PostgreSQL 多主复制集群。动手试试吧,从 docs/getting_started.md 的双节点集群教程开始,很快就能看到数据在节点间实时流转的奇妙效果!🖖
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



