简化分片 Django

我有一个项目 Django, 成立于多服务器上 PostgreSQL.

我希望用户分为这些数据库服务器,
http://instagram-engineering.t ... agram
:

用户 ID => 逻辑部分 ID => 物理碎片化 ID => 服务器数据库 => 方案 => user 桌子

逻辑段 ID 直接从用户计算 ID /13 位内置于用户ID中/.

从逻辑显示到物理段 ID 硬编码 /在某些配置文件或静态表中/.

与物理段进行比较 ID 数据库服务器也刚性编码。 Instagram 用途
http://pgfoundry.org/projects/pgbouncer/
在此阶段,要获取与数据库池的连接到相应的数据库服务器。

每个逻辑分部都自己生存
http://www.postgresql.org/docs ... .html
PostgreSQL /对于那些不熟悉的人 PostgreSQL, 这是

不是

表格方案,而是命名空间,就像
http://dev.mysql.com/doc/refma ... .html
/. 该方案简称为类似的东西 "shardNNNN", 其中nnnn逻辑段 ID.

最后,在相应的方案中请求用户表。

如何尽可能简单地实现 Django ?

理想情况下,我希望能够编写代码 Django, 例如:

提取实例


# this gets the user object on the appropriate server, in the appropriate schema:
user = User.objects.get/pk = user_id/


提取相关对象


# this gets the user's posted articles, located in the same logical shard:
articles = user.articles


创建一个实例


# this selects a random logical shard and creates the user there:
user = User.create/name = "Arthur", title = "King"/
# or:
user = User/name = "Arthur", title = "King"/
user.save//


按名称搜索用户


# fetches all relevant users /kings/ from all relevant logical shards
# - either by querying *all* database servers /not good/
# - or by querying a "name_to_user" table then querying just the
# relevant database servers.
users = User.objects.filter/title = "King"/


我使用的东西更加复杂
http://wiki.postgresql.org/wik ... ation
将每个数据库服务器的数据复制到多个下级服务器中。 业主应该用来录制和奴隶阅读。

Django 提供支持
https://docs.djangoproject.com ... uting
数据,这可能足以满足上述大多数情况,但我被困在一起
User.objects.get/pk = user_id/

, 因为路由器无法访问查询参数,所以它不知道用户是什么 ID, 他只是知道代码正在尝试阅读用户模型。

我很讨人令人难以使用作为最后一个手段的优化,因为它有局限性,并且真的使事情变得非常复杂。 大多数人疤痕不需要:优化的架构 master/slave 它可以通过很长的路。 但是让我们假设我

真的

需要一个片段。

简而言之:

我如何产卵 Django, 简单吗?

非常感谢您的帮助。

笔记

https://coderoad.ru/4481435/
, 这非常相似,但它太一般,不包含准确的例子。 我想缩小到碎片的具体技术的问题范围,这对我来说感到兴趣 /道路 Instagram/.
已邀请:

喜特乐

赞同来自:

Mike Clark最近进行了 PyPgDay 呈现如何 Disqus 他们的用户的碎片 Django 和 PostgreSQL. 他写了一篇文章
http://mike-clarke.com/2013/03 ... -orm/
关于他们如何做到。

分段数据库时 Postgres 您可以使用多种策略。 在 Disqus 我们根据表名选择段。 如果生成的表的源名称 Django, 也许 comments_post, 然后我们的分段工具将重写 SQL 对于表的要求 comments_post_X, 其中x是段 ID, 基于相干散列方案计算。 所有这些表在数据库的一个实例上都存在于同一图中。

此外,他们释放了
https://github.com/disqus/sharding-example
, 展示它们是碎片的方式。

窦买办

赞同来自:

当你问这个问题时,你真的不想在一个位置。 如果您被用户ID分段,那么您可能不想按名称搜索。

如果您分段为您的数据库,它对您的应用程序不会看不见,并且可能最终需要更改方案。

你可能会发现
http://pgfoundry.org/projects/skytools/
有用 - 读n。 pl/proxy., 作为 Skype 他们的数据库碎片。

要回复问题请先登录注册