Heroku上的数据库分片

时间:2013-02-13 19:16:41

标签: database heroku partitioning sharding heroku-postgres

在接下来的几个月中,我们的应用程序将达到我们需要对数据库进行分区的大小。我们使用Heroku进行托管,Node.js / PostgreSQL堆栈。

从概念上讲,我们的应用程序让每个逻辑分片代表一个用户以及与该用户关联的所有数据(我们的应用程序的每个用户生成大量数据,用户之间没有交互)是有意义的。我们需要保留用户对其数据进行复杂的临时查询的能力。我已经阅读了许多文章,例如关于分片的文章:http://www.craigkerstiens.com/2012/11/30/sharding-your-database/

从概念上讲,我理解Sharding的工作原理。但是在实践中我不知道如何在Heroku上实现这个,就我需要编写什么代码以及我需要修改的应用程序的哪些部分而言。非常感谢指南或指针的链接。

以下是我已经查看过的一些资源:

2 个答案:

答案 0 :(得分:0)

我不确定我会称之为“分片”。

在LedgerSMB中,我们就是这样做的。每个公司(业务实体)都是一个单独的数据库,具有完全独立的数据公司之间无法共享数据。一个postgreSQL集群可以运行任意数量的公司数据库。我们有一个管理界面,可以创建数据库并加载架构。管理界面还可以创建新用户,可以在公司之间共享(可选)。我不知道在Heroku上的dbs之间共享用户的效果如何,但我在使用PostgreSQL时如何处理这些细节。

所以这是一种可行的方法。

您真正需要的是以自动方式启动数据库和管理用户。从那里,您可以要求用户指定您可以映射到数据库的公司名称(例如,此映射可以存储在另一个数据库中)。

我知道这是相当高的水平。它应该让你开始。

答案 1 :(得分:0)

由于第一篇文章的作者乐于进一步说明。当涉及到分片时,其中一个非常关键的组件是你要分片的关键。当您拥有跨不同物理节点混合的数据时,分片的复杂性真正发挥作用。如果你喜欢多租户应用,那么就围绕这个租户或客户can fit very cleanly in this setup的想法建模所有数据。在这种情况下,您将要分解与客户相关的所有表,并以与其他租户相关的表相同的方式对它们进行分片。

至于在Heroku上这样做,有两种选择。您可以使用Heroku Postgres和应用程序逻辑,或使用Citus(这是一个有助于为您管理更多此类内容的附加组件)推出自己的内容。

要自己滚动,您首先要创建各种应用程序逻辑来处理创建所有分片并知道将相应查询路由到何处。对于Rails,有一些宝石可以提供帮助,例如activerecord-multi-tenantapartment。当涉及到实际转向分片和迁移时,你想要做的就是创建一个Heroku追随者来开始。在迁移过程中,您将开始无法跟踪。然后,您将从原始主数据库中删除一半数据,从相应分离的关注者中删除另一半数据。