データベースへの二重書き込みバッファの一貫性を確保する方法

限りキャッシュとして、それはキャッシングやデータベースストレージダブルダブルの書き込みに関連している可能性があり、あなたがいる限り、二重のように記述し、その後、データの一貫性の問題があるでしょう

だから、どのように整合性の問題を解決するには?

キャッシュは、お使いのシステムは、厳密に必要とされていない場合ことを意味し、データベース、とわずかに時折矛盾許可することができれば一般的には、バッファ+データベースは一貫していなければならないが、それがこのプログラムを行うことが最善ではありません。すなわち:読み取りと行くためにメモリキューに文字列を直列化要求を記述します。

直列化は矛盾が発生しないことが保証されますが、また、要求をサポートするために、マシンの通常のラインよりも数倍で、システムスループットの大幅な削減につながります。

キャッシュ別にパターン

最も古典的なデータベースの読み取りおよび書き込みキャッシュ+モード以外にもパターンのキャッシュです。

先読みキャッシュ、キャッシュではない、学校のデータベース、および、データ・キャッシュに取り出し、応答を返し、お読みください。あなたは、データベースを更新し、キャッシュを削除したときに更新しました。

なぜキャッシュを削除し、代わりにキャッシュを更新しますか?

その理由は、より複雑なシナリオのキャッシュに、キャッシュは直接取り出したデータベースの値だけではない、シンプルな、何回もあります。

例えば、フィールドがテーブルは、対応するキャッシュを更新することができる、他の2つは、キャッシュの新しい値を計算するために、データ・テーブルと操作を照会する必要があります。

また、キャッシュを更新するコストは、時には非常に高いです。常にデータベースを変更し、対応するキャッシュの更新を持つようにしてくださいませんか?

たぶん、このようないくつかのシーンは、より複雑なキャッシュ・データ・コンピューティングのシナリオのために、それはそうではありません。

あなたが頻繁にキャッシュに関わる複数のテーブルを変更した場合、キャッシュが頻繁に更新されます。しかし、問題は最終的にキャッシュが頻繁にアクセスされないことがありますか?

しかし、1分でキャッシュのみ1回読み込まれ、栗の場合は、キャッシュテーブルのフィールドは、変更1分で20倍、または100倍、キャッシュが更新さ20倍、100倍の関与します、コールドデータの数が多いです。

あなたはちょうどその1分で、キャッシュを削除しますが、キャッシュは一度だけ再計算されます場合は、コストが大幅に削減され、実際には、キャッシュはキャッシュをカウントするために使用されました。

実際には、キャッシュを更新することはあるのではなく、キャッシュを削除怠惰な計算常にそれが使用されていないかどうか、複雑な計算を再実行しない、思考のが、それは使用する必要がある場合に再計算。

MyBatisのと同じように、休止状態、遅延ロードの考えを持っています。1000スタッフがデータ内にある部門、スタッフのリストを持つ部門、各クエリの各部門を言うする必要はありませんが、また、チェックアウト照会します。

例の80%は、調査部門は、ちょうどその上に、この分野での情報にアクセスすることができます。まず、あなたは従業員の内部にアクセスすると同時に、部署を確認するので、あなたはスタッフの内部にアクセスする場合にのみ、この時間は、データベースクエリ従業員1000人の内側に移動します。

ほとんどの一次キャッシュ矛盾の問題と解決策

質問:最初にデータベースを変更して、キャッシュを削除します。あなたはキャッシュが失敗した削除した場合、データベースは新しいデータにつながる、キャッシュが古いデータで、矛盾がありました。

ソリューション:キャッシュを削除し、データベースを変更します。データベースの変更が失敗した場合、データベースは古いデータで、キャッシュが空である場合、データは矛盾するものではありません。

キャッシュが読み込まれていない場合ので、その後、データベース内の古いデータを読み、[キャッシュを更新。

データの不整合のより複雑な分析

データは、最初のデータベースを照会するために、要求が来て、キャッシュを読んで、キャッシュは、空の発見されたデータベースではなく、変更するのに十分な時間を変更するために行く、キャッシュを削除し、かつ、変更されている、キャッシュに、変更前の古いデータを見つけました。後続のデータ変更プログラムは、データベースの変更が終了しました。

以上、データベースのキャッシュデータとは同じではありません。

なぜ高い同時実行のシナリオでのトラフィックの何百万人があり、キャッシュは、この問題が表示されますか?

同時のデータは読み取りと書き込みのときにのみ、あなたはこの問題に直面する可能性があります。あなたは同時実行の言葉が特に10,000日あたりの低同時読み取りアクセスでは、非常に低いと言えば実際には、その後、いくつかのケースでは、今説明したシーンの種類と矛盾が存在します。

毎日がトラフィックの何百万人である場合しかし、問題は、同時の数万人は、それが+データベースキャッシュの矛盾を超えるかもしれ限りのデータを更新するための要求があるとして毎秒、毎秒読み込み、、です。

次のように解決策は以下のとおりです。

データを更新すると、固有の識別データに基づいて、運転ルートの後に、JVMの内部キューを送信します。

データの読み出し時に、データがキャッシュ内に見つからない場合、キャッシュ+操作を更新するために、再度データを読み込み、ルートに従い、一意に識別した後、また同じJVM内部キューを送信します。

ワークキューは、1つが実行され、対応するシリアル動作を得るために、スレッドを各ワーカースレッドに対応します。

この場合、動作データの変更は、キャッシュを削除し、データベースを更新するために行くが、アップデートを完了しませんでした。

このとき、読み取り要求が終わるとキャッシュを空読み、キャッシュの更新が最初のキューに要求を送信できる場合、この時間は、キューに保持され、キャッシュの同期の更新が完了するのを待ち。

ある最適化のポイント、キュー、実際には、キャッシュの更新要求の複数が一緒に意味のない文字列である、フィルタを作ることが可能です

あなたはキューがキャッシュを更新するために要求されていることが判明した場合、再び生きて来た要求された操作を更新しないと、更新操作要求が完了することができるのを待っているの前に直接アクセスしてください。

アクションを実行するための意志で1つのオペレーションのデータベース・スレッドを修正するために行われるべき仕事を、対応するそのキューの後、それは、キャッシュの更新操作では、データベースから最新の値を読み込み、書き込みキャッシュ。

リクエストが見つかった値を取ることができ、ポーリングを継続するために、時間範囲を待っている場合は、直接返し、待機時間が時間要求の一定の長さを超えている場合、この時間は、現在の古い値は、データベースから直接読み取ります。

高い同時実行のシナリオの下では、解決策は、問題に注意を払うことです。

1、ブロック読み出し要求の長さ

非常に穏やかな非同期の読み取り要求の結果として、そのタイムアウトを読み取る問題に注意を払うようにしてください、それぞれがタイムアウト時間内に返さなければならないリクエストをお読みください。

ソリューション、最大のリスクは、その時点で、データは内部に大きなバックログキューの更新操作で、その結果、非常に頻繁に更新されることがあり、その後、読み出し要求は、多数の要求につながる、タイムアウト発生の多くになり、データベースに直接アクセスしてください。常にいくつかのシミュレートされた実際のテストまでは、更新データのどの周波数を表示します。

また、キューので、それが故に複数のデータ項目のバックログ、独自のビジネス状況に応じてテストの必要性を更新することが、あなたはそれぞれが更新データの一部を共有し、複数のサービスを展開する必要があるかもしれません。

100品在庫のメモリキューのバックログは、操作を変更する場合は、この時間、データを取得するには、10×100 = 1000ミリ秒= 1秒を待って、最後に読み出し要求品、完了するまでに10msのを過ごすために、各在庫の動作を変更しますこれは、読み取り要求の期間をブロックにつながります。

そのため、操作が忙しい時間を確認するために、オンラインのいくつかのストレステストおよびシミュレーション環境を実行するために、実際の業務システムに基づいている必要があり、操作のバックログを更新することがどのくらいのメモリキュー、最後の更新に対応する読み出し動作を引き起こす可能性要求、どのくらいの時間ハングします。

読み出し要求200msのは、あなたが計算した後ならば、それは最も忙しい時期であったとしても、10アップデートのバックログは、200msのまで待つ戻る場合は、それも可能です。

可能なメモリキューバックログ更新の特に大規模な数が、その後、あなたがそのサービスインスタンスは、各マシンの処理より少ないデータに展開して、マシンを追加する必要がある場合は、各メモリキューバックログの更新操作が少なくなります。

実際には、プロジェクト以前の経験によると、一般的には、実際には更新操作は小さくすべきキューのバックログに、正常ですので、周波数データは、非常に低い書き込み。

このような非常に同時読み取りのために、プロジェクトのキャッシュ・アーキテクチャを読んで、書き込み要求を、一般的に非常に小さく、毎秒QPSエネルギーかなり良い数百。

一つの第二の書き込み動作500は、20メモリキューに5時間スライス、200ミリ秒当たり100への書き込み動作、に分割されている場合は、各メモリ・キューバックログ5は書き込み動作かもしれない実際の概算値。

各書き込み操作のパフォーマンステストの後、通常は、各メモリ読み出し要求キューデータのために、ほとんどは確かに200msの中に返され、しばらくの間、ハング、およそ20msの中で完成。

ただ単純に計算した後、我々は数百のシングルライトQPSのサポートは問題ありませんことを知って、あなたはQPSを書いた場合、マシンの拡大、膨張機10回、各マシン20個のキュー、その後、10倍に拡大しました。

2、読み取り要求が高すぎる同時実行であります

ここで我々はまた、ストレステストは、それが上記のような状況に遭遇してしまったときに、数十ミリ秒で読み取り要求の突然の大多数は、ライブ、必要性を運ぶことができるサービスを参照して、サービスにハングアップ遅延というリスクがあることを確認するために行う必要がありますどのように多くのマシンカン朱は最大限界状況をピークすることができます。

すべてのデータが同時に更新されていない、キャッシュが同時に、データが失敗したキャッシュされるので、すべての可能な少数派を失敗することはありませんので、しかし、その後、以上の読み取り要求に対応するこれらのデータは、同時実行は特にすべきではありません大規模な。

3、マルチサービス要求のルーティングインスタンス展開

このサービスでは、データ更新の実装だけでなく、キャッシュ更新操作は、すべて同じサービスインスタンスにnginxのサーバールートを実行するために要求することを確認する必要があり、複数のインスタンスに配備することができます。

たとえば、同じ商品の読み出し要求のために、同じマシンのすべてにルーティングされます。リクエストパラメータのハッシュに基づいて、独自のルートを行うことができ、あなたはまた、サービス間などのルーティング機能のハッシュnginxのを、使用することができます。

傾斜した要求をもたらす4、ホット商品ルーティング問題

商品の場合、読み取りおよび書き込み要求はすべて、圧力は機械が大きすぎる可能性がありどこへ行くか、同じマシン内の同じキューを打つ、特に高いです。

更新された製品データは、更新頻度がない高すぎるので、ビジネスに基づいてシステムを見て、読み取りおよび書き込みキャッシュを空になり、その後、同時につながるときにのみなので、この問題の影響が特に大きくありませんが、それはそのいくつかの可能性でありますマシンの負荷が高くなります。

おすすめ

転載: blog.csdn.net/suifeng629/article/details/93903185