データベースのシャーディングとレール
-
09-06-2019 - |
質問
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 プラグインを使用することをお勧めします。
私の考えでは、最も簡単な方法は、rails インスタンスと DB シャードの間で 1:1 を維持することです。