7

Amazon RDSリードレプリカを使用してデータベースをスケーリングすることを検討しています。

Web アプリケーションの一部のコントローラーは読み取り/書き込み可能で、一部は読み取り専用です。どのコントローラーが読み取り専用であるかを識別する自動化された方法が既にあるので、私の最初のアプローチは、読み取り/書き込みコントローラーを要求するときにマスターへの接続を開くことでした。そうでなければ、読み取りを要求するときに読み取りレプリカへの接続を開くことでした。コントローラーのみ。

理論的には、それはいいですね。しかし、その後、レプリカがマスターより数秒遅れる可能性があることを基本的に示すレプリケーション ラグの概念を見つけました。

次に、次の使用例を想像してみましょう。

  • ブラウザは読み取り/書き込み可能な に投稿し/create-account、マスターに接続します
  • アカウントが作成され、トランザクションがコミットされ、ブラウザがリダイレクトされます/member-area
  • 読み取り専用のブラウザが開き/member-area、レプリカに接続します。レプリカがマスターより少しでも遅れている場合、ユーザー アカウントがまだレプリカに存在しない可能性があり、エラーが発生します。

これらの潜在的な問題を回避するために、アプリケーションでリードレプリカを実際にどのように使用しますか?

4

2 に答える 2

2

擬似垂直パーティショニングを使用するアプリケーションで作業しました。ほんの一握りのデータのみが時間の影響を受けるため、アプリケーションは通常、スレーブからフェッチし、選択された場合にのみマスターからフェッチしました。

例として、ユーザーがパスワードを更新すると、アプリケーションは常にマスターに認証プロンプトを要求します。時間の影響を受けないデータ (ユーザー設定など) を変更すると、成功ダイアログが表示され、すべてが更新されるまでに時間がかかる可能性があるという情報が表示されます。

環境に応じて機能する場合と機能しない場合があるその他のアイデア:

  • 計算エンティティ チェックサムを更新した後、それをアプリケーション キャッシュに保存し、データを取得するときに常にチェックサムへの準拠を要求します。
  • ユーザーが常に最新バージョンを確認できるように、デルタを保存するためにブラウザー ストア/Cookie を使用します。
  • 「up-to-date」フラグを追加し、更新の前後にすべてのスレーブ ノードで同期的に無効化します

どのソリューションを選択しても、それはCAP Theoremの主題であることに注意してください。

于 2013-08-08T09:55:38.090 に答える
1

これは難しい問題であり、多くの潜在的な解決策があります。考えられる解決策の 1 つは、Facebook が行ったことを調べることです。

TLDR - 読み取り要求は読み取り専用コピーにルーティングされますが、書き込みを行うと、次の 20 秒間、すべての読み取りが書き込み可能なマスターに送られます。

私たちが対処しなければならなかったもう 1 つの主な問題は、カリフォルニアにあるマスター データベースだけが書き込み操作を受け入れることができるということでした。この事実は、バージニア州からデータベースへの書き込みを行ったページを提供することを避ける必要があることを意味しました。これは、各ページが国を越えてカリフォルニア州のマスター データベースに到達する必要があるためです。幸いなことに、最も頻繁にアクセスされるページ (ホームページ、プロフィール、写真ページ) は、通常の操作では書き込みを行いません。この問題は、ユーザーがページを要求したときに、バージニアに送信しても「安全」か、カリフォルニアにルーティングする必要があるかをどのように判断するかという問題に要約されます。

この質問には、比較的簡単な答えがあることがわかりました。Facebook へのユーザー リクエストがヒットする最初のサーバーの 1 つは、ロード バランサーと呼ばれます。このマシンの主な役割は、リクエストを処理する Web サーバーを選択することですが、サービス拒否攻撃からの保護やユーザー接続の多重化など、他の多くの目的にも役立ちます。このロード バランサーには、レイヤー 7 モードで実行する機能があり、ユーザーが要求している URI を調べ、その情報に基づいてルーティングを決定できます。この機能により、ロード バランサーに「安全な」ページを簡単に伝えることができ、ページ名とユーザーの場所に基づいて、リクエストをバージニア州とカリフォルニア州のどちらに送信するかを決定できるようになりました。

ただし、この問題には別の問題があります。出身地を変更するために editprofile.php にアクセスするとします。このページは安全とマークされていないため、カリフォルニアにルーティングされ、変更を行います。次に、プロファイルを表示します。安全なページであるため、バージニアに送信されます。ただし、前述のレプリケーション ラグのため、行った変更が表示されない場合があります。このエクスペリエンスは、ユーザーにとって非常に混乱を招くだけでなく、二重投稿にもつながります。データベースに何かを書き込むたびに、ブラウザーに現在の時刻の Cookie を設定することで、この懸念を回避しました。ロード バランサーもその Cookie を探し、20 秒以内に何かを書き込んだことに気付いた場合、無条件にカリフォルニアに送信します。それから 20 秒が経過すると、

于 2013-08-02T04:19:45.443 に答える