Azure Database for PostgreSQL灵活服务器中的弹性群集上的分片模型

分片是数据库系统和分布式计算中使用的一种技术,用于在多个服务器或节点之间水平分区数据。 它涉及到将大型数据库或数据集分解为更小、更易于管理的部分,称为分片。 分片包含数据的子集,所有分片组成完整的数据集。

Azure Database for PostgreSQL灵活服务器上的弹性群集提供两种类型的数据分片:基于行和基于架构。 每个选项都有其自己的 权衡,因此你可以选择最符合应用程序要求的方法。

基于行的分片

单一数据库共享架构模型中的分片表,也称为基于行的分片,租户作为同一表内的行共存。 您可以定义一个分布列,用于确定租户,并将表水平拆分。

基于行的分片是最高效的硬件方法。 集群中的节点以高密度方式承载并分布租户。 但是,此方法需要确保架构中的所有表都具有分布列,并且应用程序中的所有查询都按该列进行筛选。 按行分片非常适用于 IoT 工作负载,并且能够最大限度提高硬件利用率。

优点:

  • 最佳性能。
  • 每个节点的最佳租户密度。

缺点:

  • 需要修改架构。
  • 需要修改应用程序查询。
  • 要求所有租户共享相同的架构。

基于架构的分片

基于架构的分片使用共享数据库和单独的架构模型。 每个架构充当数据库中的逻辑分片。 多租户应用可以为每个租户使用单独的数据库架构,从而轻松按租户维度进行分片。 无需更改查询,应用程序只需进行少量修改即可在切换租户时设置正确 search_path 。 基于架构的分片对于微服务来说是一种理想的解决方案,对于部署应用程序的 ISV(独立软件供应商)来说也是如此,因为这些应用程序无法进行基于行的分片所需的更改。

优点:

  • 租户可以具有异类架构。
  • 不需要修改架构。
  • 不需要修改应用程序查询。
  • 与基于行的分片相比,基于架构的分片 SQL 兼容性更高。

缺点:

  • 与基于行的分片相比,每个节点的租户数更少。

分片权衡

基于架构的分片 基于行的分片
多租户模型 每个租户都有单独的架构 具有租户 ID 列的共享表
Citus 版本 12.0+ 所有版本
与 vanilla PostgreSQL 相比需要额外的步骤 无,仅配置更改 在每个表上使用 create_distributed_table,按租户 ID 对表进行分布并共置
租户数目 1-1 万 1-100 万
数据建模要求 分布式架构之间没有外键 每个表以及主键、外键中需要包含租户 ID 列(分布列,也称为分片键)
单节点查询的 SQL 要求 每个查询使用单个分布式架构 联接和 WHERE 子句应包括 tenant_id 列
并行跨租户查询 是的
每个租户的自定义表定义 是的
访问控制 架构权限 架构权限
跨租户共享数据 是,使用引用表(在单独的架构中) 是,使用引用表
租户到分片隔离 每个租户都有其自己的分片组(按定义) 可以通过 isolate_tenant_to_new_shard 为特定租户 ID 分配其自己的分片组