你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于: 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 提供其自己的分片组 |