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 を使用した場合のフォントぼかしの解決方法の詳細な説明
以前、私は自分で WordPress を構築していましたが、当時はサードパーティの仮想ホストを使用し...
目次予備作業バックエンド構築フロントエンドページダイレクトレンダリングsetTimeout ページン...
手ぶれ防止: 繰り返しのクリックによるイベントのトリガーを防止まず、揺れとは何でしょうか? 震えるの...
目次1. 準備2. コマンドラインの記述2.1 バージョンと説明を追加する2.2 パスワードの長さを...
1: 速度と読み込み方法の違いdivとtableの違いは速度ではなく、読み込み方法です。速度はネット...
目次ステップ 1: root ユーザーとしてログインします。ステップ 2: 新しいデータ テーブルを...
DATE_ADD() 関数は、指定された時間間隔を日付に追加します。現在のテーブル内のすべてのデー...
<br />jb51.net では、常に記事のセマンティクスを重視してきましたが、HTM...
本日、ローカル開発環境で突然「入力ファイルが指定されていません」というエラーが発生してしまいました。...
この記事では、参考として MySQL 5.7.23 のインストール チュートリアルを記録します。 1...
序文この記事はかなり詳細で、少し面倒です。他のチュートリアル ドキュメントでは多くの手順が省略されて...
目次コンテナデータボリュームとはコンテナ データ ボリュームが必要なのはなぜですか?使用データボリュ...
まずは本体から始めましょう:ウェブページを閲覧するとき、最初に目に留まるのは通常、ページの背景です。...
mysql-5.7.9 では、ついにシャットダウン構文が提供されます。以前は、MySQL データベー...
この記事では、参考までに、簡単なコメントエリアを実装するためのjQueryの具体的なコードを紹介しま...