質問

Rails でシャードデータベースを扱う最善の方法は何ですか?シャーディングはアプリケーション層、アクティブレコード層、データベースドライバ層、プロキシ層、またはその他の層で処理されるべきでしょうか?それぞれの長所と短所は何ですか?

役に立ちましたか?

解決

FiveRuns には、という名前の宝石があります。 データファブリック これは、アプリケーションレベルのシャーディングとマスター/スレーブのレプリケーションを行います。チェックしてみる価値があるかもしれません。

他のヒント

シャードとは、垂直分割ではなく水平分割について話していると思います (ウィキペディアの違いは次のとおりです).

最初に、 ストレッチ垂直パーティション 水平分割を検討する前に、できる限りのことを考えてください。Rails では、異なるモデルが異なるマシンを指すようにするのは簡単で、ほとんどの Rails サイトではこれで十分です。

水平分割の場合、理想的な世界では、これは アプリケーション層 Railsで。しかし、これは難しいことではありませんが、Rails では簡単ではありません。ActiveRecord 呼び出しがあちこちに散在しているため、それが必要になるまでに、アプリケーションは通常、これが実現できるレベルを超えて成長しています。そして、開発者も管理者も、必要になる前にそれに取り組むことを好む人は誰もいません。トラフィックが爆発的に増加した後、何年も機能しない可能性があるパーティショニングよりも、ユーザーが今使用する機能に取り組むことを誰もが望んでいるからです。

ActiveRecord レイヤー...私が見る限り、簡単ではありません。Rails の内部に大量のモンキーパッチを適用する必要があります。

スポック 結局、これを使用して処理することになりました カスタム MySQL プロキシ そしてそれをSourceForgeでオープンソース化しました スポックプロキシ. 。ActiveRecord は、実際にはプロキシと通信しているのに 1 つの MySQL データベース マシンと通信していると認識し、プロキシは 1 つ以上の MySQL データベースと通信し、結果をマージ/ソートして、ActiveRecord に返します。Rails コードにわずかな変更を加えるだけで済みます。詳細とこの方法を採用する理由については、Spock Proxy SourceForge ページをご覧ください。

私と同じようにシャーディングについて聞いたことのない人のために:

http://highscalability.com/unorthodox-approach-database-design-coming-shard

Rails を複数のデータベースに接続することは大したことではありません。接続プロパティをオーバーライドする各シャードの ActiveRecord サブクラスを用意するだけです。これにより、シャード間呼び出しを行う必要がある場合に非常に簡単になります。シャード間で呼び出しを行う必要がある場合は、少しコードを記述するだけで済みます。

Rails インスタンスを分割するという Hank のアイデアは好きではありません。大規模な共有ライブラリがない限り、インスタンス間でコードを呼び出すのは難しいように思えるからです。

また、次のようなことを検討する必要があります マゾヒズム シャーディングを始める前に。

Rails がレプリケートされた環境で動作するようにするには、実行時にデータベース接続をスレーブの 1 つに切り替えるのに役立つ my_replication プラグインを使用することをお勧めします。

https://github.com/minhnghivn/my_replication

私の考えでは、最も簡単な方法は、rails インスタンスと DB シャードの間で 1:1 を維持することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top