複数の Rails エンジンが単一の mySQL サーバーに書き込みを行う、このような図を見たことがあります。
1) これは可能ですか? それとも、Rails は各アプリケーション サーバーが 1 つのデータベース サーバーに書き込むことを望んでいるのでしょうか?
2) これが可能である場合、どのように達成されますか? アプリケーション サーバーと書き込みデータベース サーバーの間にキューとスケジューラはありますか?
複数の Rails エンジンが単一の mySQL サーバーに書き込みを行う、このような図を見たことがあります。
1) これは可能ですか? それとも、Rails は各アプリケーション サーバーが 1 つのデータベース サーバーに書き込むことを望んでいるのでしょうか?
2) これが可能である場合、どのように達成されますか? アプリケーション サーバーと書き込みデータベース サーバーの間にキューとスケジューラはありますか?
mysql データベースのスケーリングは非常に難しい作業ですが、確かに何度も行われており、利用できるベスト プラクティスが数多くあります。最初に知っておくべきことは、しばらくの間書き込みのスケーリングについて心配する前に、おそらく最初に読み取りをスケーリングする必要があるということです。
読み取りのスケーリングは、レプリケーションを使用してかなり簡単に行うことができます。Amazon RDSなど、レプリケーションの管理をより簡単にするツールがいくつかあります。一般的に言えば、多くのWebサーバーは多くのデータベースに接続できますが(他の人が示唆しているように)、大量のトラフィック、接続、またはサーバーに負荷を生成する他のアクションを実行すると、スケールの問題にすぐに遭遇します.
レプリケートされたサーバーは読み取り専用であるため、実行しているアクションに応じて接続するサーバーを管理する必要があります。つまり、users テーブルがある場合、ユーザーを作成、更新、または削除するときは、「書き込み」データベース (プライマリ「ソース」サーバー) を使用する必要がありますが、user テーブルを読み取るときは、読み取りレプリカの 1 つを使用できます。これにより、プライマリ書き込みサーバーの負荷が軽減され (さらに多くの書き込みを処理できるようになります)、ロード バランサーの背後に複数の読み取りデータベースを配置できるため、この構造を非常に長い時間使用でき、読み取りを数十にスケーリングできます。重大な問題が発生する前にデータベース サーバーを削除します (ただし、ほとんどのアプリは 1 ~ 3 で解決します)。
読み取りアクションに書き込みデータベースを使用する必要がある状況があります (ただし、可能な限り避ける必要があります)。これは、書き込みデータベース クエリのレプリケートの待ち時間が原因で、読み取りレプリカが書き込みデータベースよりわずかに遅れる可能性があるためです。ただし、ほとんどの場合、読み取りデータベースが遅延する可能性があることを認識してコーディングできる時間(つまり、更新がすべての読み取りサーバーに伝播するような妥当な期間のキューアクション)であり、読み取りデータベースの1つを使用するだけです。書き込みデータベースよりも。
これ以外に取り組むべき重要な項目は、効率的なインデックスを確保し、適切なデータ構造を維持するための他のベスト プラクティスを適用することです。また、データベース サーバーの 3 つの異なる「グループ」を持つことを検討することもできます。私は一般的に、書き込み、読み取り、および「統計」データベースグループが好きです。作成、更新、および削除操作 (および更新の選択) の書き込みグループ、結果を迅速に返さなければならない一般的な読み取り項目の読み取り、および高負荷になる可能性があり、依存しないすべての統計迅速な応答のために on (これにより、一般的な読み取りのために迅速な応答が必要な読み取りデータベースから、時間に敏感ではない重いクエリが保持されます)
より大きなハードウェアを購入できなくなり、書き込み容量が限界に近づいている状況になったら、シャーディングを検討する必要がありますが、それには大量のトラフィック/データが必要になります (心配しないでください)上記のすべてをすでに行っていない限り)。