データベース ディスク IO の同時実行性の増加によりシステムのパフォーマンスのボトルネックが発生したため、システムにキャッシュを導入したことについて説明しました。また、開発時にキャッシュの読み取りおよび書き込み戦略を正しく使用する方法を学び、データの不整合を防ぐための事例に基づいたいくつかの提案を行いました。これが現在の私たちのシステムのアーキテクチャです。 上図に示すように、サービス層とデータベース層の間にキャッシュ層を追加します。現在、データを読み取るときは、まずキャッシュから読み取り、読み取れない場合はデータベースから読み取ります。 キャッシュを導入した以上、できるだけ多くのリクエストがキャッシュに入るようにしたいので、キャッシュヒット率に注意を払う必要があります。ヒット率が高ければ高いほど、バックエンドのストレージが低下してボトルネックになる可能性が低くなります。キャッシュ ヒット率が低下した場合は、その理由を突き止めなければなりません。同時実行性の高いリクエストの場合、1% の低下でも大惨事となるからです。 たとえば、現在のシステム QPS が 10,000 で、各リクエストでキャッシュが 10 回クエリされるとします。ここでヒット率が突然 1% 低下し、バックエンド データベース MySql に 10,000 * 10 * 1% = 1,000 件のリクエストが送信されることになります。これは、MySQL データベースが 1,000 件の同時リクエストの急増に直面することを意味し、非常に危険です。通常の MySQL マシンは約 2,000 件の同時リクエストしか処理できません。したがって、キャッシュヒット率に注意を払う必要があります。 今では、わずか 1% の低下でもシステムに大きな影響を与えます。キャッシュ ノードがクラッシュして使用できなくなった場合、振り出しに戻り、すべてのリクエストがデータベースに送信されます。したがって、キャッシュを使用する場合は、上記のシングルポイント キャッシュ アーキテクチャを回避するために、可用性の高いキャッシュを構築する必要があります。今日は、キャッシュの高可用性ソリューション、つまり分散キャッシュの高可用性ソリューションを構築する方法を学習します。 経験に基づくと、分散キャッシュの高可用性ソリューションに現在使用されている主な 3 つのソリューションは、アプリケーション側、中間プロキシ層、およびサーバー側です。
次に、これら 3 つのソリューションを個別に検討します。 アプリケーション側のソリューション アプリケーション側、つまりコード レベルでは、キャッシュの読み取りと書き込みを自分で管理する必要があります。つまり、主に次の 2 つのモジュールを記述して、分散キャッシュの書き込みと読み取りを行う必要があります。
次に、どのように設計するかを見てみましょう。実際、この設計アイデアは必ずしもキャッシュに限定されるわけではありません。私たちの基盤となる開発のほとんどでこれを使用できます。誰もがそれをマスターできることを願っています。 キャッシュデータを分割する方法 マシン自体のメモリ、ネットワーク帯域幅などのさまざまな理由により、単一ノードのキャッシュはより高い同時実行性に耐えられないことがわかっているため、データをシャードに保存する、つまりシャーディング アルゴリズムを通じて各キャッシュ ノードにデータを分散させる必要があります。実際、これは先ほど説明したデータベースとテーブルのシャーディングと非常によく似ており、アーキテクチャのアイデアのほとんどは同じであることに気付きましたか。 現在、データは各キャッシュノードに保存されているため、部分的な障害が発生しても、ビジネス全体に影響が及ぶことはありません。この時点で、データを各ノードに均等に分散する必要があるので、このシャーディング アルゴリズムをどのように記述すればよいのか疑問に思うかもしれません。心配しないでください。このシャーディング アルゴリズムの記述方法を以下で確認してみましょう。 データシャーディングアルゴリズム 一般的に、データ シャーディング アルゴリズムには 2 種類あります。誰もが知っておくべき。これらは、以前のデータベースおよびテーブル シャーディングで使用されます。
ハッシュシャーディングアルゴリズム ハッシュ シャーディング アルゴリズムでは、キャッシュされたキーを取得し、それに対してハッシュ操作を実行し、最後にハッシュ操作の結果の係数とキャッシュ ノードの合計数を取得します。結果の番号は特定のシャーディング ノードです。たとえば、現在 3 つのキャッシュ ノードがあります。データを書き込むときは、次の図に示すように、キーをハッシュして hash(key) を計算し、結果を 3 で割った剰余をとります。 このシャーディング アルゴリズムの利点は、開発が簡単で理解しやすいことです。デメリットは、キャッシュ ノードの総数が変わると、データの不均一性が生じ、多数のキャッシュが無効になり、使用できなくなることです。ただし、私たちも開発でこのアルゴリズムを使用しています。たとえば、ビジネスでキャッシュヒット率をあまり気にしない場合は、このハッシュシャーディングアルゴリズムを使用できます。 一貫性ハッシュシャーディングアルゴリズム 上記の単純なハッシュシャーディングアルゴリズムは、高いキャッシュヒット率を必要とするビジネスに一定の影響を与えるため、キャッシュノードの増減によって発生するキャッシュヒット率の低下の問題を効果的に解決する一貫性のあるハッシュシャーディングアルゴリズムが登場しました。それでは、どのように行われるか見てみましょう。
たとえば、以下の場合、key1 と key2 はノード 1 に、key3 と key4 はノード 2 に、key5 はノード 3 に、key 6 はノード 4 にそれぞれ格納されます。 上の図に示すように、ノード 1 とノード 2 の間に別のノード 5 を追加すると、以前はノード 2 にヒットしていたキー 3 が今度はノード 5 にヒットしますが、他のキーは変更されないことがわかります。同様に、ノード 3 をクラスターから削除すると、キー 5 のみが影響を受けます。したがって、ノードを追加および削除すると、少数のキーのみが他のノードに移動し、キーがヒットしたノードの大部分は変更されないため、ヒット率が大幅に低下することはありません。 生産開発の提案 一貫性ハッシュアルゴリズムを使用する場合は、キャッシュの有効期限を設定する必要があります。なぜそう言うのでしょうか?ここで、クラスター内に node1 と node2 の 2 つのノードがあり、node1 が (k, 5) を格納しているとします。次に、クライアントが 5 を 8 に変更することを要求します。この時点で、ネットワークの問題により、node1 のノード サービスとクライアントは切断されます。次に、この書き込み操作はノード 2 にルーティングされます。 node1 ネットワークが復元されると、クライアントは node1 の k を 5 として読み取りますが、実際には k はすでに 8 であり、ダーティ データが発生するため、有効期限を設定する必要があります。 Memcached はマスタースレーブメカニズムとしてどのように機能しますか? Memcached は Redis 自体のようなマスター/スレーブ レプリケーション メカニズムをサポートしていないため、memcached の高可用性をどのように確保できるでしょうか?実際、これは以前のデータベース ソリューションに似ています。
マスタースレーブレプリケーションの利点は、スレーブに障害が発生した場合でも、マスターがバックアップとして機能し、大量のリクエストがデータベースに侵入することがないため、キャッシュシステムの高可用性が向上することです。 中間プロキシ層ソリューション 上記のアプリケーション側のソリューションは、基本的にほとんどの問題を解決できます。現在、多くの技術言語を持つ企業では、言語ごとにセットを開発する必要があります。例えば、弊社では Java、PHP などを採用しております。 net の場合は、中間プロキシ レイヤーを使用するのが最適です。ビジネス側はこれらの複雑な状況を考慮する必要がなく、プロキシ層に直接接続できます。 プロキシ層は、キャッシュノード自体の高可用性を管理し、Redis プロトコルなどのプロトコルを介してさまざまな言語のビジネス端末に接続します。業界には、Facebook の Mcrouter、Twitter の Twemproxy、Wandoujia の Codis など、中間プロキシ層ソリューションも数多く存在します。基本的なアーキテクチャは次のとおりです。 上図に示すように、中間層プロキシ ソリューションとは、すべてのキャッシュの読み取りおよび書き込み操作がプロキシ層を介して直接完了し、プロキシ層が上記のアプリケーション側のすべての操作を単独で完了することを意味します。 サーバーソリューション サーバー側のソリューションは、主にキャッシュ サービス自体によって管理されます。私たち開発者は、コード管理を記述したり、中間層を導入したりする必要はありません。必要なのは、関連する運用と保守の構成サポートだけです。たとえば、Redis のセンチネル モードは、Redis がデプロイされるときに高可用性の問題を解決するために使用されます。マスターノードがハングアップした後、スレーブノードを自動的にマスターノードに昇格させ、クラスター全体の可用性を確保できます。したがって、サーバーは私たちの開発に大きな影響を与えません。 Redis Sentinel についてはまだ知っておく必要がありますが、これについては後で説明します。 まとめると、今日はキャッシュを使用する際に単一ノードによって発生するさまざまな問題を回避する方法について説明しました。そのため、高可用性のキャッシュ アーキテクチャを構築する必要があります。アプリケーション側、中間プロキシ層、サーバー側の合計 3 つのソリューションについて説明しました。企業のリソース状況に応じて適切なソリューションを選択できます。 |
<<: ハイブリッドクラウド環境における高可用性のコスト効率を向上
>>: AWS は、機械学習の経験がなくても、企業の日常業務を改革し改善する 5 つの新しい機械学習サービスを開始しました。
私たちのネットワークプロモーションにおけるソフト記事プロモーションの位置は、「軸」という単語で説明で...
最近、百度の検索エンジンが引き続きその力を発揮し、多くのウェブサイトがダウングレードされているのを誰...
ご存知のとおり、Baidu 入札バックグラウンドには「IP 除外」という機能があります。この機能は主...
VMware (NYSE: VMW) は、VMware vSphere、VMware vCenter...
Magoro.com は 2010 年から KVM ベースの VPS を販売しており、4 年間販売し...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますウェブサイ...
インタビューは主に中国語の検索と SEO に焦点を当てていました。マット・カッツ氏と Google ...
馬峰窩CEOの陳剛氏は、Qunarが「肯定的なレビューを買う」ために投稿ごとに500元を支払ったと非...
生活水準の向上に伴い、健康的なライフスタイルに注目する人が増えています。同時に、クラウドコンピューテ...
SEO最適化技術の品質は、コンテンツと外部リンクだけでなく、いくつかの詳細の処理にも左右されます。コ...
Fliphost.net は優れた VPS 業者です。顧客ベースは buyvm よりはるかに少ないで...
DevOps という言葉については、多くの人が知っていると思います。 DevOps は人気のある概念...
vpsspace の VPS はすべてセミマネージド型であり、一部のアンマネージド VPS ベンダー...
[[261171]]プログラマーは皆、フロントエンド技術が非常に急速に変化することを知っています。 ...
Hostsolutions はルーマニアのホスティング会社です。主な特徴は、サーバーが苦情に強く、著...