Hacker News 中文摘要

RSS订阅

展示HN:开源、逻辑多主PostgreSQL复制 -- Show HN: Open source, logical multi-master PostgreSQL replication

文章摘要

pgEdge/spock是一个支持多主节点逻辑复制的PostgreSQL扩展工具,可实现跨数据库节点的数据同步与共享。

文章总结

Spock:PostgreSQL 的逻辑多主复制扩展

项目简介
Spock 是 PostgreSQL 的逻辑多主复制扩展,支持 PostgreSQL 15 及更高版本。它允许在多个数据库节点之间实现双向数据同步,适用于需要高可用性和分布式数据管理的场景。

核心功能
- 多主复制:所有节点均可读写,数据变更双向同步。
- 自动 DDL 复制:通过配置可自动同步表结构变更(如 CREATE TABLE)。
- 冲突解决:支持基于时间戳的冲突检测与解决机制。
- 灵活配置:可自定义复制集(replication sets),选择同步特定表或操作类型。

安装与配置
1. 构建要求
- 需基于打过补丁的 PostgreSQL 源码(补丁文件位于 spock/patches/ 目录)。
- 按数字顺序应用补丁(如 pg16-015-xxx 优先于 pg16-020-xxx)。

  1. 编译安装
    ```bash

    编译 PostgreSQL 和 Spock 扩展

    ./configure && make && make install export PATH=$PATH:

  2. 数据库配置
    修改 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');

  1. 设置双向订阅:
    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 导航菜单、贡献者列表等非核心内容已精简,保留关键技术细节和操作指南。)

评论总结

这篇评论主要围绕多主数据库工具的实用性和潜在问题展开讨论,主要观点如下:

  1. 对多主数据库的实用性存疑
  • 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"
  1. 对冲突解决的疑问
  • tonyhart7和OsrsNeedsf2P都关注写入冲突问题:"how do they resolve write conflict????"、"what happens? I don't see this crucial detail"
  1. 技术实现问题
  • 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"
  1. 与其他方案的比较
  • imglorp提到这是老技术:"multi master postgres is such an old idea, it was done in Perl"
  • foreigner询问与CockroachDB的对比:"pros and cons of this compared to CockroachDB"
  1. 实际应用场景
  • verelo询问真实用例:"What are the real world cases you built this for?"