doctrine/shards

此包已被废弃,不再维护。未建议替代包。
无法获取此包最新版本(v1.0)的许可证信息。

v1.0 2012-05-08 20:31 UTC

This package is not auto-updated.

Last update: 2020-01-18 05:01:25 UTC


README

Doctrine ORM 支持水平分片的扩展。

想法

在 Doctrine 中实现分片,尽可能减少对开发者的干扰。

需要解决的问题

  1. 将 INSERT 语句发送到何处?
  2. 如何生成主键?
  3. 如何选择更新、删除语句的分片?
  4. 如何选择选择操作的分片?
  5. 如何合并跨越多个分片的查询?
  6. 如何处理/防止无法合并的多分片查询(GROUP BY)?
  7. 如何处理非分片数据?(例如静态元数据表)
  8. 如何处理多个连接?
  9. 在 DBAL 或 ORM 层面上实现?

路线图

版本 1:DBAL 2.3(多租户应用)

1. ID Generation support (in DBAL + ORM done)
2. Multi-Tenant Support: Either pick a global metadata database or exactly one shard.
3. Fan-out queries over all shards (or a subset) by result appending

版本 2:ORM 相关(复杂)

4. ID resolving (Pick shard for a new ID)
5. Query resolving (Pick shards a query should send to)
6. Shard resolving (Pick shards an ID could be on)
7. Transactions
8. Read Only objects

数据库模式的技术要求

分片表需要将分片分配键作为它们的一个列。这将与您与规范化 db-schema 相比代码产生影响。如果您有一个 Blog <-> BlogPost <-> PostComments 实体通过 blog_id 分片,那么 PostComment 表也需要此列,即使“非分片”,规范化的 DB-Schema 不需要此信息。

实现细节

假设

  • 对于查询,您要么想查询所有,要么恰好查询一个分片。
  • 所有分片表的 ID 必须在所有分片中都是唯一的。
  • 非分片数据在所有分片之间进行复制。它们冗余地保留信息。这是使跨分片的连接查询能够工作所必需的。
  • 如果您从一个分片检索对象 A,那么该对象的引用和集合也位于同一分片上。
  • 所有分片上的数据库模式都是相同的(或兼容的)

SQL Azure 联邦

SQL Azure 是一个特殊情况,点 1、2、3、4、7 和 8 部分在数据库级别上处理。这使得它成为仅针对点 5-6 中的功能子集的完美测试实现。但是,需要有一种方法来配置 SchemaTool 生成 SQL Azure 上的正确模式。

  • SELECT 操作:最简单的假设是始终查询所有分片,除非用户明确指定。
  • 可以在 PHP 代码中合并查询,这显然不适用于 DISTINCT、GROUP BY 和 ORDER BY 查询。

通用分片

需要更多功能才能在 PHP 层面上实现分片,独立于数据库支持

  1. 多个连接的配置,一个连接 = 一个分片。
  2. 主键生成机制(UUID、中央表、序列模拟)

主要用例

  1. 多租户应用

这种方法更容易支持,因为您可以在请求初期就确定整个请求的分片ID。在这里,查询也可以始终限制在单个分片上。

  1. 按某些属性进行扩展(轮询?)

这种策略需要根据访问的数据在单个请求中访问多个分片。