Heroku上的数据库分片

11

在未来几个月中,我们的应用将达到需要对数据库进行分片处理的大小。我们使用Heroku进行托管,采用Node.js/PostgreSQL堆栈。

从概念上讲,我们的应用最好由每个逻辑分片代表一个用户及与该用户相关的所有数据(我们的应用每个用户都会产生大量数据,而且用户之间没有任何互动)。我们需要保留用户对其数据进行复杂的即席查询的能力。我已经阅读了许多相关文章,例如这篇文章,介绍了关于分片技术的内容:http://www.craigkerstiens.com/2012/11/30/sharding-your-database/

从概念上讲,我理解如何使用分片技术。然而,在实践中,我不知道如何在Heroku上实现它,需要编写哪些代码以及需要修改我的应用程序的哪些部分。教程链接或一些建议将不胜感激。

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

  • SQL数据库不具备可扩展性
  • Heroku Postgres 跟随者数据库
  • 为什么人们在AWS存在的情况下使用Heroku? Heroku与AWS有何不同之处?

  • 你有没有看过章鱼(Octopus)?https://github.com/tchandy/octopus - catsby
    2个回答

    1
    作为第一篇文章的作者,我很高兴进一步发表意见。在分片方面,其中一个非常关键的组成部分是你要使用哪个键进行分片。当你的数据交织在不同的物理节点之间时,分片的复杂性真正发挥作用。如果你是一个多租户应用程序,那么围绕租户或客户的这个想法对所有数据进行建模可以非常干净地适应这个设置。在这种情况下,你将希望将与客户相关的所有表拆分,并将它们与其他租户相关的表以相同的方式分片。
    至于在Heroku上执行此操作,有两个选项。你可以使用Heroku Postgres和应用程序逻辑自己实现,或者使用像Citus这样的东西(这是一个附加组件,可以帮助更好地管理这些内容)。

    如果要自己实现分片,您首先需要创建各种应用程序逻辑来处理创建所有分片并知道将适当的查询路由到哪里。对于Rails,有一些 gem 可以帮助解决这个问题,例如 activerecord-multi-tenantapartment。在实际进行分片和迁移时,您需要先创建一个 Heroku follower。在迁移过程中,您需要让其停止跟随原始数据库。然后,您将从原始主数据库中删除一半的数据,并从相应的 follower 上删除另一半的数据。


    Citus在Heroku中不再作为附加组件提供。(也许这与Microsoft Azure收购Citus有关) - Yassine Belmamoun

    0

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

    在LedgerSMB中,我们的做法是这样的。每个公司(业务实体)都是一个独立的数据库,具有完全独立的数据。数据不能在公司之间共享。一个postgreSQL集群可以运行任意数量的公司数据库。我们有一个管理界面,可以创建数据库并加载模式。管理界面还可以创建新用户,这些用户可以在公司之间共享(可选)。我不知道在Heroku上共享用户在多个数据库之间如何工作,但我包括这个细节来说明我们如何使用PostgreSQL。

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

    你真正需要的是一些自动化地启动数据库和管理用户的东西。从那里开始,你可以要求用户指定一个公司名称,你可以将其映射到任何你想要的数据库(例如,这个映射可以存储在另一个数据库中)。

    我知道这相当高级。但它应该能让你开始。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接