文章摘要
pgEdge/spock是一个支持多主节点逻辑复制的PostgreSQL扩展工具,可实现跨数据库节点的数据同步与共享。
文章总结
Spock:PostgreSQL 的逻辑多主复制扩展
项目简介
Spock 是 PostgreSQL 的逻辑多主复制扩展,支持 PostgreSQL 15 及更高版本。它允许在多个数据库节点之间实现双向数据同步,适用于需要高可用性和分布式数据管理的场景。
核心功能
- 多主复制:所有节点均可读写,数据变更双向同步。
- 自动 DDL 复制:通过配置可自动同步表结构变更(如 CREATE TABLE)。
- 冲突解决:支持基于时间戳的冲突检测与解决机制。
- 灵活配置:可自定义复制集(replication sets),选择同步特定表或操作类型。
安装与配置
1. 构建要求:
- 需基于打过补丁的 PostgreSQL 源码(补丁文件位于 spock/patches/ 目录)。
- 按数字顺序应用补丁(如 pg16-015-xxx 优先于 pg16-020-xxx)。
编译安装:
```bash编译 PostgreSQL 和 Spock 扩展
./configure && make && make install export PATH=$PATH:
数据库配置:
修改postgresql.conf:
ini shared_preload_libraries = 'spock' wal_level = logical track_commit_timestamp = on # 启用冲突解决 spock.enable_ddl_replication = on # 自动同步 DDL
基本使用示例
1. 在每个节点创建 Spock 节点:
sql
SELECT spock.node_create(node_name := 'n1', dsn := 'host=10.0.0.5 port=5432 dbname=test');
- 设置双向订阅:
sql -- 在 n1 上订阅 n2 SELECT spock.sub_create(subscription_name := 'sub_n1n2', provider_dsn := 'n2的连接信息'); -- 在 n2 上订阅 n1 SELECT spock.sub_create(subscription_name := 'sub_n2n1', provider_dsn := 'n1的连接信息');
高级功能
- 监控:提供 spock.sub_show_status() 等函数查看复制状态。
- 数据过滤:通过复制集选择同步的表或序列。
- 容器化支持:提供 Docker 和 Ansible 部署方案(详见 pgEdge 文档)。
限制与注意事项
- 所有节点的表结构(包括主键、约束)必须完全一致。
- 升级后不可回滚,需提前备份。
- 需确保节点间网络畅通,防火墙允许数据库端口通信。
许可证
采用 PostgreSQL 许可证,详情见 LICENSE.md。
(注:原文中的 GitHub 导航菜单、贡献者列表等非核心内容已精简,保留关键技术细节和操作指南。)
评论总结
这篇评论主要围绕多主数据库工具的实用性和潜在问题展开讨论,主要观点如下:
- 对多主数据库的实用性存疑
- verelo认为这类工具存在许多未记录的边缘情况,令人担忧:"all the undocumented edge cases that can come up and they scare me off"
- sgarland强烈反对使用多主架构:"You do not want multi-master. If you think you do, think again"
- 对冲突解决的疑问
- tonyhart7和OsrsNeedsf2P都关注写入冲突问题:"how do they resolve write conflict????"、"what happens? I don't see this crucial detail"
- 技术实现问题
- pisikesipelgas提出DDL同步和应用兼容性问题:"DDL is will be replicated to second node, which is used by not-jet-updated application"
- 还指出扩展更新问题:"postgis for example...Data will be replicated to node which is not jet updated"
- 与其他方案的比较
- imglorp提到这是老技术:"multi master postgres is such an old idea, it was done in Perl"
- foreigner询问与CockroachDB的对比:"pros and cons of this compared to CockroachDB"
- 实际应用场景
- verelo询问真实用例:"What are the real world cases you built this for?"