Heroku 上的数据库分片
Posted
技术标签:
【中文标题】Heroku 上的数据库分片【英文标题】:Database sharding on Heroku 【发布时间】:2013-01-29 10:51:57 【问题描述】:在接下来几个月的某个时间点,我们的应用程序将达到我们需要对数据库进行分片的大小。我们使用 Heroku 来托管 Node.js/PostgreSQL 堆栈。
从概念上讲,对于我们的应用来说,让每个逻辑分片代表一个用户以及与该用户关联的所有数据是有意义的(我们应用的每个用户都会生成大量数据,并且用户之间没有交互)。我们需要保留用户对他们的数据进行复杂的即席查询的能力。我读过很多文章,比如这篇关于分片的文章:http://www.craigkerstiens.com/2012/11/30/sharding-your-database/
从概念上讲,我了解分片的工作原理。但是在实践中,我不知道如何在 Heroku 上实现这一点,就我需要编写的代码以及我需要修改应用程序的哪些部分而言。一个教程链接或一些指针将不胜感激。
这里有一些我已经看过的资源:
http://www.craigkerstiens.com/2012/11/30/sharding-your-database/ mysql sharding approaches? Heroku takes care of multiple database servers? http://petrohi.me/post/30848036722/scaling-out-postgres-partitioning http://adam.heroku.com/past/2009/7/6/sql_databases_dont_scale/ https://devcenter.heroku.com/articles/heroku-postgres-follower-databases Why do people use Heroku when AWS is present? What distinguishes Heroku from AWS?【问题讨论】:
你检查过八达通吗? github.com/tchandy/octopus 【参考方案1】:我不确定我会称之为“分片”。
在 LedgerSMB 中,这是我们做事的方式。每个公司(业务实体)都是一个具有完全独立数据的独立数据库。数据不能在公司之间共享。一个 postgreSQL 集群可以运行任意数量的公司数据库。我们有一个创建数据库和加载模式的管理界面。管理界面还可以创建新用户,可以在公司之间共享(可选)。我不太清楚在 Heroku 上的 dbs 之间共享用户的效果如何,但我将详细介绍我们如何使用 PostgreSQL。
所以这是一种可行的方法。
您真正需要的是以自动化方式启动数据库和管理用户的东西。从那里您可以要求用户指定一个公司名称,您可以根据需要映射到数据库(例如,此映射可以存储在另一个数据库中)。
我知道这是相当高的水平。但是,它应该可以帮助您入门。
【讨论】:
【参考方案2】:作为第一篇文章的作者,很高兴进一步补充。当涉及到分片时,非常关键的组件之一就是您要分片的关键是什么。当您拥有混合在不同物理节点上的数据时,分片的复杂性就真正发挥了作用。如果你是一个多租户应用程序,那么围绕租户或客户can fit very cleanly in this setup 的想法对所有数据进行建模。在这种情况下,您将希望分解与客户相关的所有表,并以与其他租户相关表相同的方式对它们进行分片。
至于在 Heroku 上执行此操作,有两种选择。您可以使用 Heroku Postgres 和应用程序逻辑自行开发,或者使用 Citus 之类的东西(这是一个可以帮助您管理更多内容的附加组件。
为了自己滚动,您将首先创建各种应用程序逻辑来处理创建所有分片并了解将适当查询路由到何处。对于 Rails,有一些 gem 可以帮助解决这个问题,例如 activerecord-multi-tenant 或 apartment。当谈到实际转向分片和迁移时,您要做的是创建一个 Heroku 追随者来开始。在迁移期间,您将开始取消关注。然后,您将从原始主节点中删除一半数据,并从您相应分离的跟随者中删除另一半数据。
【讨论】:
Citus 在 Heroku 中不再作为附加组件提供。 (或许,这可能与微软 Azure 收购 Citus 有关)以上是关于Heroku 上的数据库分片的主要内容,如果未能解决你的问题,请参考以下文章
我的新迁移将破坏我在 heroku (postgres) 上的数据库
如何让我在 Heroku 上的 Laravel 项目使用 Heroku Postgres?
Heroku 上的 Django 1.7:如何让 makemigrations 重新扫描数据库?