11

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

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

从概念上讲,我了解分片是如何工作的。但是在实践中,我不知道如何在 Heroku 上实现这一点,就我需要编写的代码以及我需要修改应用程序的哪些部分而言。一个教程或一些指针的链接将不胜感激。

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

4

2 回答 2

1

作为第一篇文章的作者,很高兴进一步补充。当涉及到分片时,非常关键的组件之一就是您要分片的关键是什么。当您拥有混合在不同物理节点上的数据时,分片的复杂性就真正发挥了作用。如果您是一个多租户应用程序,那么围绕租户或客户的想法对您的所有数据进行建模可以非常适合此设置。在这种情况下,您将希望分解与客户相关的所有表,并以与其他租户相关表相同的方式对它们进行分片。

至于在 Heroku 上执行此操作,有两种选择。您可以使用 Heroku Postgres 和应用程序逻辑自行开发,或者使用 Citus 之类的工具(这是一个可以帮助您管理更多内容的附加组件。

为了滚动您自己,您将首先创建各种应用程序逻辑来处理创建所有分片并知道将适当的查询路由到哪里。对于 Rails,有一些 gem 可以帮助解决这个问题,例如activerecord-multi-tenantapartment。当谈到实际转向分片和迁移时,您要做的是创建一个 Heroku 追随者来开始。在迁移期间,您将开始取消关注。然后,您将从原始主节点中删除一半数据,并从您相应分离的跟随者中删除另一半数据。

于 2017-04-17T14:05:08.480 回答
0

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

在 LedgerSMB 中,这是我们做事的方式。每个公司(业务实体)都是一个具有完全独立数据的独立数据库。数据不能在公司之间共享。一个 postgreSQL 集群可以运行任意数量的公司数据库。我们有一个创建数据库和加载模式的管理界面。管理界面还可以创建新用户,可以在公司之间共享(可选)。我不太清楚在 Heroku 上的 dbs 之间共享用户的效果如何,但我包括了关于我们如何使用 PostgreSQL 的详细信息。

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

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

我知道这是相当高的水平。但是,它应该可以帮助您入门。

于 2013-04-26T14:22:09.677 回答