Railsでシャードデータベースを処理する最良の方法は何ですか? シャーディングは、アプリケーション レイヤー、アクティブ レコード レイヤー、データベース ドライバー レイヤー、プロキシ レイヤー、またはその他のレイヤーで処理する必要がありますか? それぞれの長所と短所は何ですか?
9 に答える
FiveRuns には、アプリケーション レベルのシャーディングとマスター/スレーブ レプリケーションを行うDataFabricという名前の gem があります。チェックしてみる価値があるかもしれません。
シャードでは、垂直パーティショニングではなく水平パーティショニングについて話していると思います(ウィキペディアの違いは次のとおりです)。
まず、水平パーティショニングを検討する前に、可能な限り垂直パーティショニングを拡張します。Rails では、異なるモデルが異なるマシンを指すようにするのは簡単です。ほとんどの Rails サイトでは、これで十分です。
水平分割の場合、理想的な世界では、これはRailsのアプリケーション層で処理されます。しかし、それは難しいことではありませんが、Rails では些細なことではありません。通常、必要になるまでに、ActiveRecord 呼び出しがあちこちに散らばっているため、アプリケーションはこれが実行可能なレベルを超えて成長しています。また、開発者も管理者も、必要になる前に作業することを好みません。なぜなら、誰もが、トラフィックが急増した後何年も機能しない可能性のあるパーティション分割よりも、ユーザーが現在使用する機能に取り組むことを好むからです。
ActiveRecord 層... 私が見る限り簡単ではありません。Rails の内部に多くのモンキー パッチを適用する必要があります。
Spockでは、最終的にカスタム MySQL プロキシを使用してこれを処理し、SourceForge でSpock Proxyとしてオープン ソース化しました。ActiveRecord は、実際にはプロキシと通信しているとき、1 つの MySQL データベース マシンと通信していると考えます。プロキシは 1 つまたは複数の MySQL データベースと通信し、結果をマージ/ソートして、ActiveRecord に返します。Rails コードを少し変更するだけで済みます。詳細と、このルートに進む理由については、Spock Proxy SourceForge ページをご覧ください。
私のようにシャーディングについて聞いたことがない人のために:
http://highscalability.com/unorthodox-approach-database-design-coming-shard
Rails を複数のデータベースに接続することは大したことではありません。接続プロパティをオーバーライドする各シャードの ActiveRecord サブクラスを用意するだけです。これにより、クロスシャード呼び出しを行う必要がある場合に非常に簡単になります。シャード間で呼び出しを行う必要がある場合は、コードを少し記述するだけです。
Rails インスタンスを分割するというハンクのアイデアは好きではありません。大きな共有ライブラリがない限り、インスタンス間でコードを呼び出すのは難しいように思えるからです。
また、シャーディングを開始する前に、マゾヒズムのようなことを検討する必要があります。
レプリケートされた環境でレールを動作させるには、実行時にデータベース接続をいずれかのスレーブに切り替えるのに役立つ my_replication プラグインを使用することをお勧めします
私の考えでは、最も簡単な方法は、Rails インスタンスと DB シャードの間で 1 対 1 を維持することです。