内置分片

来自 PostgreSQL wiki
跳转到导航跳转到搜索

简介

有十几个 Postgres 分支都实现了分片。虽然许多此类分支都获得了成功,但它们经常落后于 Postgres 的社区版本。通过在社区 Postgres 中实现分片,此功能将对 Postgres 当前版本的所有用户都可用。这将极大增加社区 Postgres 在需要高写入伸缩或数据库非常大的环境中的采用率。

在 Postgres 中实现分片的一大挑战是实现此目标时尽量减少代码更改。大多数 Postgres 的分片分支都要求对社区代码进行大量的更改,而这对总体 Postgres 社区而言是不可接受的,其中许多人并不需要分片。随着外部数据包装程序 (FDW) 的出现,现在可以考虑一个内置分片实现,该实现可以通过可接受的代码更改水平来实现。

该可能基于 FDW 的分片解决方案的基本设计基于 Postgres-XC 的工作,该工作是 NTT 有近十年开发的,已开发Postgres-XL 是此设计的更灵活的实现。 Citus 纳入了这两个项目的想法并提供了无需从 Postgres 分离的分片。

增强现有功能

在尽量减少代码更改的情况下实现内置共享需要改进几个现有的 Postgres 功能

  • 已完成?改进 FDW 基础设施和 postgres_fdw。具体来说,良好的性能需要将所有合理的操作推送到外部分片。在 Postgres 9.6 中,连接、分类、更新和删除被推送到外部服务器。总计下推将在 Postgres 10 中得到支持。外部表目前可以参与继承。
  • 已完成?Postgres 10 将包含一个针对单节点使用的分区彻底检修,以提高性能并支持更多优化,例如基于执行的分区剪枝。这将也被用于分片。
  • 添加并行性以使 FDW 请求可以并行发出。这将允许并行分片执行。这也许可以通过建立多个异步 libpq 连接来实现。

改进这些特性独立于分片很有价值。

新子系统

需要开发附加子系统

  • 允许查找表复制到所有分片以允许更多联接下推。这可以通过逻辑复制(完成)来实现,但优化器必须知道表已复制以实现下推。
  • 编写子模块以使用新的分区系统表来创建和发出与已提交查询匹配的 FDW 查询。
  • 编写子模块以收集 FDW 查询结果并将其返回给用户。
  • 编写 全局事务管理器 以高效地允许分片以原子方式提交事务。这也许可以建立在已准备好的事务上,并带有某种类型的交易管理器,以便在崩溃后清理开放的已准备好的事务,例如 XA。
  • 编写 全局快照管理器,该管理器允许分片查看一致的快照。(SERIALIZABLE 事务模式将避免跨节点快照冲突吗?pg_export_snapshot() 或 hot_standby_feedback 有帮助吗?)一致的多分片备份还需要此项。
  • 编写用户 API 以创建、管理和报告分片。

用例

有四种可能的使用情况,需求不断增加

  1. 使用聚合查询对只读分片执行跨节点只读查询,例如数据仓库

    这是最简单的实现,因为它不需要全局事务管理器、全局快照管理器,且由于聚合,分片返回的行数最少。

  2. 使用非聚合查询对只读分片执行跨节点只读查询

    这会给协调器带来压力,使其收集并处理许多返回行,并且将显示 FDW 传输机制的扩展情况。

  3. 对读/写分片执行跨节点只读查询

    这将需要一个全局快照管理器来确保分片返回一致的数据。

  4. 跨节点读写查询

    这将需要全局快照管理器和全局事务管理器。

以前的文档

幻灯片 中包含早期提案图表,现已推出。在 2015 年举行了有关集群的 会议