2013-02-13 10 views
8

今後数ヶ月のうちのある時点で、私たちのアプリはDBを破棄する必要があるサイズになります。私たちは、HerokuをNode.js/PostgreSQLスタックのホスティングに使用しています。Herokuのデータベースシャーディング

概念的には、私たちのアプリは、それぞれの論理シャードが1人のユーザーと、そのユーザーに関連付けられたすべてのデータを表すことが理にかなっています(アプリケーションの各ユーザーは大量のデータを生成し、ユーザー間の対話はありません)。ユーザーがデータに対して複雑なアドホッククエリを実行できるようにする必要があります。私はシャーディングについて語るこのような記事をたくさん読んでいます:http://www.craigkerstiens.com/2012/11/30/sharding-your-database/

概念的に、私はシャーディングの仕組みを理解しています。しかし、実際には、どのようなコードを書く必要があるのか​​、アプリケーションのどの部分を修正する必要があるのか​​、Herokuでこれを実装する方法はわかりません。チュートリアルやいくつかのポインタへのリンクは非常に高く評価されます。

+0

Octopusをチェックしましたか? https://github.com/tchandy/octopus – catsby

答えて

0

私はこの「シャーディング」と呼んでいますか?

ここLedgerSMBではどうやってやるの?各企業(事業体)は、完全に別々のデータを持つ別個のデータベースです。企業間でデータを共有することはできません。 1つのpostgreSQLクラスタは、任意の数の企業データベースを実行できます。私たちには、データベースを作成し、スキーマをロードする管理インタフェースがあります。管理インタフェースは、新しいユーザを作成することもでき、企業間で共有することもできます(オプション)。私はHeroku上でdbsの間でユーザーを共有するのがどれくらいうまくいくかはわかりませんが、私はPostgreSQLの仕組みを詳しく説明しています。

これは実行可能なアプローチです。

あなたが本当に必要とするのは、データベースをスピンアップし、ユーザーを自動化する方法です。そこから、ユーザーが希望するデータベースにマップできる会社名を指定することができます(このマッピングは、たとえば別のデータベースに保存することができます)。

これはかなり高いレベルです。しかし、それはあなたを始めなければなりません。

0

最初の記事の著者がさらにチャイムして喜んでいます。非常に重要なコンポーネントの1つをシャーディングする場合、どのような鍵をかけているのですか?シャーディングの複雑さは、実際には、異なる物理ノード間でデータが混在している場合に発生します。あなたがマルチテナントアプリのようなものであれば、テナントか顧客のこのアイデアのすべてのデータをモデリングしてcan fit very cleanly in this setup。その場合、顧客に関連するすべてのテーブルを分割し、他のテナント関連テーブルと同じ方法で分割する必要があります。

ヘロクでこれを行う場合、2つのオプションがあります。 Heroku Postgresとアプリケーションロジックを使って自分自身をロールバックすることも、Citusのようなものを使うこともできます。これは、これをさらに管理するのに役立つアドオンです。

独自のアプリケーションロジックを作成するには、最初にすべてのシャードを作成し、適切なクエリをどこにルーティングするかを知るさまざまなアプリケーションロジックを作成します。 Railsには、activerecord-multi-tenantapartmentのような宝石があります。シャーディングとその移行に実際に移行する場合は、まずはHerokuフォロワーを作成する必要があります。マイグレーション中に、あなたはそれに追従しないようにするでしょう。次に、元のプライマリからデータの半分を削除し、それに応じて分離したフォロワーから残りの半分を削除します。