1 マスター・スレーブの読み取り・書き込み分離ほとんどのインターネットビジネスでは、書き込みよりも読み取りが多いため、DB がより多くのクエリをサポートする方法を検討することが優先されます。まず、読み取りトラフィックと書き込みトラフィックを区別する必要があり、読み取りトラフィックを個別に拡張すると便利です。つまり、マスターとスレーブの読み取りと書き込みの分離です。 フロントエンドのトラフィックが急増してスレーブ データベースが過負荷になった場合、DBA はスレーブ データベースの容量拡張を優先します。これにより、DB への読み取りトラフィックが複数のスレーブ データベースに分散され、各スレーブ データベースの負荷が軽減されます。開発者は、DB レイヤーでトラフィックをブロックするために最善を尽くします。 キャッシュ VS MySQL の読み取り/書き込み分離 開発とメンテナンスの難しさにより、キャッシュの導入は複雑さをもたらします。キャッシュ データの一貫性、侵入、アバランシェ対策などの問題を考慮する必要があり、さらに 1 種類のコンポーネントをメンテナンスする必要があります。したがって、まずは読み取りと書き込みの分離を使用し、それが処理できない場合にキャッシュを使用することをお勧めします。 1.1 コアマスター/スレーブの読み取り/書き込み分離では、通常、DB のデータを 1 つ以上のコピーにコピーし、他の DB サーバーに書き込みます。
したがって、マスターとスレーブの読み取り/書き込み分離の鍵は次のとおりです。
マスタースレーブレプリケーション
開発者が単一のDBを使用しているように感じさせる 2 マスタースレーブレプリケーションMySQL マスター/スレーブ レプリケーションは、MySQL のすべての変更を記録し、バイナリ ログ ファイルにバイナリ形式でディスクに保存する binlog に依存しています。 マスタースレーブレプリケーションは、バイナリログ内のデータをマスターデータベースからスレーブデータベースに、通常は非同期で転送します。つまり、マスターデータベースの操作は、バイナリログの同期が完了するまで待機しません。 2.1 マスタースレーブレプリケーションプロセス
独立したログダンプスレッドを使用すると、マスターデータベースのメイン更新プロセスに影響を与えないように非同期になります。スレーブデータベースは情報を受信した後、それをスレーブデータベースストレージに書き込まず、リレーログに書き込みます。これは、スレーブデータベースの実際のストレージへの書き込みを回避するためです。スレーブデータベースの実際のストレージへの書き込みは時間がかかり、最終的にはスレーブデータベースとマスターデータベース間の遅延が長くなります。
パフォーマンス上の理由から、マスター データベースの書き込みプロセスは、マスターとスレーブの同期が完了するまで待たずに結果を返します。極端な場合、たとえば、マスター データベースのバイナリ ログがディスクに書き込まれる前にディスクが破損したり、マシンの電源が切れたりすると、バイナリ ログが失われ、マスターとスレーブのデータの一貫性が失われます。しかし、その確率は非常に低く、許容範囲内です。 マスター データベースがダウンすると、binlog の損失によって生じたマスターとスレーブ間のデータの不整合は手動でのみ復元できます。 マスタースレーブレプリケーションの後、次のことが可能になります。
この方法では、書き込み要求によってテーブルまたはレコードがロックされても、読み取り要求の実行には影響しません。高い同時実行性では、複数のスレーブを展開して読み取りトラフィックを共有できます。つまり、1 つのマスターと複数のスレーブが、高い同時実行性の読み取りをサポートします。 スレーブ データベースは、マスター データベースの障害によるデータ損失を回避するためのバックアップ データベースとしても使用できます。 スレーブの数を無制限に増やすことで、より高い同時実行性をサポートできますか? 2.2 マスタースレーブレプリケーションの副作用たとえば、Moments への投稿操作には次のデータが含まれます。
DBを更新する場合
たとえば、Momentsのコンテンツをレビューシステムに同期させる したがって、メインデータベースを更新した後、友人サークル ID が MQ に書き込まれ、コンシューマーは ID に基づいてデータベースから友人サークル情報を取得し、レビュー システムに送信します。 マスタースレーブ遅延がビジネスに与える影響の概略図 2.3 マスタースレーブレプリケーションにおける遅延の回避どうすればいいですか?実際には多くの解決策があり、その中心となる考え方は、データベースからデータをクエリしないようにすることです。したがって、上記のケースでは、次の解決策があります。 2.3.1 データの冗長性MQ を送信する場合、フレンド サークル ID だけでなく、コンシューマーが必要とするすべてのフレンド サークル情報を送信できるため、DB からデータを再クエリする必要がなくなります。 このソリューションは十分に単純なので推奨されますが、単一のメッセージが大きくなり、帯域幅とメッセージ送信時間が増加する可能性があります。 2.3.2 キャッシュの使用DB に同期的に書き込むときに、Moments データをキャッシュに書き込みます。この方法では、コンシューマーが Moments 情報を取得するときに、最初にキャッシュを照会し、データの一貫性も確保できます。 このソリューションは、新しいデータが追加されるシナリオに適しています。データを更新する場合、最初にキャッシュを更新するとデータの不整合が発生する可能性があります。たとえば、2 つのスレッドが同時にデータを更新します。
最終DB値(1)とキャッシュ値(2)が矛盾しています。 2.3.3 メインデータベースのクエリコンシューマー内のスレーブ データベースをクエリする代わりに、マスター データベースをクエリすることができます。 使用時には注意してください。クエリ量が多くなく、メイン データベースの許容範囲内であることを確認してください。そうでない場合、メイン データベースに大きな負荷がかかります。 絶対に必要な場合を除き、このソリューションを使用しないでください。メインデータベースを照会するためのインターフェースが提供されているため、他のユーザーがこのメソッドを悪用しないようにすることは困難です。 マスターとスレーブの同期遅延も、トラブルシューティング時に見落とされがちです。 どのデータベースのどのインジケータを通じてマスタースレーブ遅延時間警告を判断するにはどうすればよいでしょうか? スレーブライブラリで、モニタshow slave 3 DBへのアクセス方法マスタースレーブレプリケーションを使用してデータを複数のノードにコピーすることで、DBの読み取りと書き込みの分離も実現します。このとき、DBの使用方法も次のように変わります。
実装の複雑さを軽減するために、業界では DB アクセスの問題を解決するための多くの DB ミドルウェアが登場しており、大まかに次のように分類できます。 3.1 アプリケーションの内部たとえば、TDDL (Taobao Distributed Data Layer) は、コードの形式でアプリケーションに埋め込まれて実行されます。これはデータ ソース エージェントと見なすことができます。その構成では、複数のデータ ソースを管理します。各データ ソースは、マスター データベースまたはスレーブ データベースである可能性のある DB に対応します。 アドバンテージ使いやすく、導入コストも低く抑えられます。アプリケーション内に組み込まれ、プログラムと一緒に実行されるため、運用・保守能力が弱い小規模チームに適しています。 欠点多言語サポートが不足しており、すべて Java で開発されているため、他の言語をサポートできません。バージョンのアップグレードもユーザーからの更新に依存します。 3.2 独立して展開されたプロキシ層ソリューションMycat、Atlas、DBProxy など。 このタイプのミドルウェアは、独立したサーバー上に展開されます。ビジネス コードは、単一の DB を使用するようなものです。実際には、内部で多くのデータ ソースを管理します。DB 要求があると、SQL ステートメントに必要な変更を加えてから、指定されたデータ ソースに送信します。 アドバンテージ
欠点
4 結論マスタースレーブレプリケーションは、ストレージノード間でストレージデータを複製するテクノロジーに拡張することができ、これによりデータの冗長性を実現してバックアップを実現し、水平拡張機能を向上させることができます。 マスタースレーブレプリケーションを使用する場合は、次の点を考慮してください。
すべてのスレーブ ノードへの書き込みが成功することが保証されている場合、書き込みパフォーマンスは確実に影響を受けます。マスター ノードへの書き込みのみが成功を返す場合、スレーブ ノードでデータ同期の失敗が発生し、マスターとスレーブの間で不整合が発生する可能性があります。インターネットプロジェクトでは一般的に、強力なデータ一貫性よりもパフォーマンスを優先します。
これにより、データを読み取ることができないという多くの奇妙な問題が発生します。 多くの実際の事例:
コンポーネントによってレプリケーションの一貫性とレイテンシの要件が異なり、採用するソリューションも異なりますが、設計の考え方は同じです。 よくある質問注文が多数ある場合、フロントエンドのユーザー注文クエリでは、userId を介して異なるデータベースにハッシュすると便利ですが、バックエンドのシステム ページではすべての注文を表示して並べ替える必要があるため、SQL の実行が非常に遅くなります。これについてどうすればいいでしょうか? バックエンド システムはサブデータベースおよびサブテーブル内のデータを直接クエリできないため、データを別のバックエンド データベースまたは ES に同期することを検討できます。 これで、MySQL が数十億のトラフィックをサポートする方法についてのこの記事は終了です。MySQL の数十億のトラフィックの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: ウェブのさまざまなフロントエンド印刷方法: CSS はウェブページの印刷スタイルを制御します
>>: CSS3 で transform を使用した場合のフォントぼかしの解決方法の詳細な説明
VueはPCカメラを呼び出してリアルタイムで写真を撮影します。参考までに、具体的な内容は次のとおりで...
この記事の例では、ポップアップ効果を実現するためのjsの具体的なコードを参考までに共有しています。具...
Vue では、ほとんどの場合、テンプレートを使用して HTML を作成することを推奨しています。ただ...
Vue のツリー表示については、プロジェクトが使用されています: エフェクト ダイアグラムがツリー...
UNIONの使用ほとんどの SQL クエリは、1 つ以上のテーブルからデータを返す単一の SELEC...
最近、スタック コンテキストについて学習しています。学習の過程で、z-index が 0 の場合と ...
この記事では、VMware Workstation 14 Proのインストールとアクティベーションに...
目次1. 問題2. 解決策2.1 ページングコンポーネント2.2 データベースデータを取得する関数:...
目次序文1. パンくずリストはなぜ必要なのでしょうか? 2. 一次包装1. 実装のアイデア2. コー...
最近、プロジェクトで選択クエリを使用する際に、未使用の主キー ID を除外するために not in ...
<br />Web2.0とは何ですか? Web2.0にはソーシャルネットワーク製品とその...
1. スロークエリの用途は何ですか? long_query_time を超えて実行されるすべての S...
複数の条件を持つ MySQL クエリ環境: MySQL 5.7 where ステートメントに複数の ...
時間フィールドを作成するときデフォルトのCURRENT_TIMESTAMPデータを挿入する際、このフ...
著者が MySQL を使用してユーザーを追加していたところ、ユーザー名が間違って記述されていることに...