2013-06-30 12 views
7

Amazon RDSread replicasを使用してデータベースをスケールアップすることを検討しています。非同期データベースのレプリケーションを正しく処理する方法は?

私たちのWebアプリケーションのコントローラの中には、読み書き可能なものもあり、読み込み専用のものもあります。私は既に、どのコントローラが読み取り専用であるかを識別する自動化された方法を持っています。そのため、私の最初のアプローチは、読み取り/書き込みコントローラを要求するときにマスタへの接続を開き、読み取り専用コントローラを要求するとき、コントローラのみ。

理論的には、それは良いと思います。しかし、その後、私はレプリケーションラグコンセプトを開きました。これは基本的に、レプリカがマスターの数秒後になることを示しています。トランザクションがコミットされ、アカウントが作成されるので、マスター

  • に接続し、読み取り/書き込みさ/create-account

    • ブラウザの投稿を、そしてブラウザが取得します。

      のは、次のユースケースを想像してみましょう/member-area

    • ブラウザは、読み取り専用の/member-areaを開き、レプリカに接続します。レプリカがマスターのわずかに後ろにある場合でも、ユーザーアカウントはまだレプリカ上に存在しない可能性があります。その結果、エラーが発生します。

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

  • 答えて

    1

    これは難しい問題であり、潜在的な解決策がたくさんあります。 1つの可能な解決法はTLDR、何facebook didを見て

    ある - 読み取り専用にルーティングされるリード要求をコピーしていますが、書き込みを行う場合は、次の20秒間、すべてのあなたの読み込みが書き込み可能なマスターに行きます。

    カリフォルニアの データベースのみが書き込み操作を受け入れることができたという主な問題がありました。この事実は、 バージニア州 バージニアからのデータベース書き込みを行ったページの配信を避ける必要があることを意味しました。カリフォルニアの マスターデータベースに各国を渡らなければならないからです。幸いにも、最も頻繁にアクセスするページ(ホームページ、プロフィール、写真ページ)の は、通常の操作では の書き込みを行いません。この問題は、ユーザー がページをリクエストしたときに、 をバージニア州に送信するのが「安全」かどうか、またはカリフォルニア州に送信する必要がある場合、どのように判断するのでしょうか?

    この質問は、比較的簡単な答えがあることが判明しました。 ユーザーがFacebookにヒットする最初のサーバーの1つは、 ロードバランサーと呼ばれます。このマシンの主な責務は、要求を処理するためにウェブ サーバを選択することですが、サービス拒否攻撃からの保護とユーザー接続の多重化を挙げるなど、多くの目的にも役立ちます。このロードバランサは、 レイヤーモードで実行する機能を持ち、 ユーザが要求しているURIを調べて、 情報に基づいてルーティングを決定します。この機能はロードバランサ に安全なページについて簡単に伝え、ページ名とユーザーの 場所に基づいて、 をVirginiaまたはCaliforniaに送信するかどうかを決定することができました。

    しかし、この問題にはもう一つのシワがあります。あなたの故郷を変更するには editprofile.phpに行くとしましょう。このページには と表示されていないので、カリフォルニアに転送され、変更されます。その後、 あなたのプロフィールを表示してください。それは安全なページであるため、 バージニア州にお送りします。ただし、先ほど説明したレプリケーションの遅れのため、 が表示されている可能性があります。この経験 はユーザーにとって非常に混乱し、二重の投稿にもつながります。この問題を解決するには があります。ブラウザにCookieを設定すると、データベースに何かを書き込むたびに の現在の時刻が設定されます。負荷 バランサもそのクッキーを検索し、 を20秒以内に書き込んだことに気付いた場合は、無条件で カリフォルニアに送信されます。その後、20秒が経過し、 のデータがVirginiaに複製されたことが確認された場合、安全な ページに戻ってきます。

    2

    私はpseudo-vertical partitioningを使用したアプリケーションで作業しました。少数のデータだけが時間に敏感であったので、アプリケーションは通常、選択されたケースでのみスレーブおよびマスターからフェッチされました。

    例:ユーザーがパスワードアプリケーションを更新したときに、マスターに認証プロンプトが常に表示されます。非機密データ(User Preferencesなど)を変更すると、すべての情報が更新されるまでに時間がかかる可能性がある情報と共に成功ダイアログが表示されます。

    や環境によっては動作しない場合がありますいくつかの他のアイデア:、更新計算エンティティのチェックサムの後

    • アプリケーションキャッシュに保存し、データを取得する際に、常にチェックサム
    • 使用ブラウザの遵守を求めますユーザーを確保デルタを格納するための店舗/クッキーは、常に最新のバージョン
    • は、「最新の」フラグを追加し、更新後/前に、すべてのスレーブノードに同期し
    を無効に見ています

    あなたが選んだ解決策はどれも、CAP Theoremの件名に留意してください。

    関連する問題