11

Railsでシャードデータベースを処理する最良の方法は何ですか? シャーディングは、アプリケーション レイヤー、アクティブ レコード レイヤー、データベース ドライバー レイヤー、プロキシ レイヤー、またはその他のレイヤーで処理する必要がありますか? それぞれの長所と短所は何ですか?

4

9 に答える 9

13

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

于 2008-09-07T08:47:30.657 に答える
9

シャードでは、垂直パーティショニングではなく水平パーティショニングについて話していると思います(ウィキペディアの違いは次のとおりです)。

まず、水平パーティショニングを検討する前に、可能な限り垂直パーティショニングを拡張します。Rails では、異なるモデルが異なるマシンを指すようにするのは簡単です。ほとんどの Rails サイトでは、これで十分です。

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

ActiveRecord 層... 私が見る限り簡単ではありません。Rails の内部に多くのモンキー パッチを適用する必要があります。

Spockでは、最終的にカスタム MySQL プロキシを使用してこれを処理し、SourceForge でSpock Proxyとしてオープン ソース化しました。ActiveRecord は、実際にはプロキシと通信しているとき、1 つの MySQL データベース マシンと通信していると考えます。プロキシは 1 つまたは複数の MySQL データベースと通信し、結果をマージ/ソートして、ActiveRecord に返します。Rails コードを少し変更するだけで済みます。詳細と、このルートに進む理由については、Spock Proxy SourceForge ページをご覧ください。

于 2008-09-11T01:56:42.403 に答える
8

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

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

于 2008-09-04T19:31:47.327 に答える
2

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

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

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

于 2008-09-23T14:28:58.430 に答える
1

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

https://github.com/minhghivn/my_replication

于 2011-09-20T18:17:48.880 に答える
0

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

于 2008-09-04T16:50:52.720 に答える