MySQLで負荷分散を実装する方法

MySQLで負荷分散を実装する方法

序文

MySQL は、クライアント/サーバー構造に基づく、高速、高性能、マルチスレッドのオープン ソース リレーショナル データベース管理システム (RDBMS) です。これは 1979 年に始まり、元々は Michael Widenius がスウェーデンの TcX 社向けに作成した UNIREG データベース システムでした。当時の UNIREG には SQL (構造化クエリ言語) インターフェイスがなかったため、その用途は限られていました。

1996 年 5 月、Widenius は MySQL の初期バージョンを開発し、インターネット上で公開し始めました。 MySQL の開発者は、当初から常にパフォーマンスを重視し、機能セットに全力を注いできました。今日に至るまで、MySQL は高速性と高性能を基本原則として、その本質を忠実に守り続けています。時が経つにつれ、MySQLにはストアドプロシージャ、ビュー、トリガーなどの大規模データベース製品の高度な機能も追加され、エンタープライズレベルのデータベースシステムに導入および適用できるようになりました[1]。

2008 年 10 月、SUN は MySQL AB を買収し、オープン ソース分野への参入を開始しました。主要オペレーティングシステム Solaris がオープンソース化されたことで、データベース市場における SUNMySQL のシェアはさらに拡大するでしょう。したがって、実稼働環境に負荷分散機能を備えた MySQL サーバー クラスターを導入することは、エンタープライズ データベース アプリケーション システムの速度、安定性、およびスケーラビリティを向上させる上で大きな実用的意義があり、アプリケーション システムへの投資コストを効果的に削減することもできます。

1. 負荷分散の基本的な考え方

サーバー クラスターでは、負荷をできるだけ均等に分散するようにしてください。通常の方法は、サーバーのフロントエンドにロード バランサー (専用のハードウェア デバイス) を設定することです。MySQL のロード バランシングには通常、データ シャーディング (データを小さな断片に分割し、異なる DB ノードに保存する) とレプリケーションが必要です。

サーバー クラスターでは、負荷をできるだけ均等に分散するようにしてください。通常の方法は、サーバーのフロントエンドにロード バランサー (専用のハードウェア デバイス) を設定することです。MySQL のロード バランシングには通常、データ シャーディング (データを小さな断片に分割し、異なる DB ノードに保存する) とレプリケーションが必要です。

負荷分散の主な貢献は、データベース要求を均等に分散することに加えて、読み取り/書き込み戦略の管理を提供することです。リクエストを配布する際に、どのノードが書き込み可能で読み取り可能であるかを判断し、指定されたノードにリクエストを送信して操作を実行します。

2. 負荷分散を実装する方法

1. MySQLの読み書き分離

MySQL がレプリケーションを行うと、複数のデータ コピー (スタンバイ データベース) が生成されます。サーバーの負荷を軽減するために、スタンバイ データベースを使用して読み取り操作を処理します。プライマリ データベースは読み取り操作と書き込み操作を同時に処理できます。これは、MySQL クラスターで読み取りと書き込みの分離を実現するための一般的な戦略です。

スタンバイ データベースのレプリケーションは非同期であり、リアルタイムで同期できないため、読み取り/書き込み分離の主な難しさは、スタンバイ データベース上のダーティ データにあります。通常、スタンバイ データベースを読み取りに使用する場合、データのリアルタイム要件はそれほど高くできません。この点に関して、MySQL は、クエリベースの読み取り/書き込み分離、ダーティデータベース、セッションベースなど、いくつかの一般的な読み取り/書き込み分離方法を提供しています。興味がある場合は、引き続き学習してください。

MySQL によって設定された読み取りと書き込みの分離により、プライマリ データベースへの要求の数が削減され、大量の読み取り操作がバックアップ データベースに送信され、負荷分散が実現されます。

2. DNSを変更する

「高同時実行負荷分散 (I) - エンタープライズ アーキテクチャ分析と DNS」では、DNS と DNS が負荷分散を実装する方法について詳しく説明しています。簡単に言うと、n 個のサーバー IP がドメイン名に割り当てられ、要求は、要求の異なる識別機能に基づいて処理するために異なる IP サーバーに送信されます。

3. ミドルウェアの導入

MySQL は、MySQL ロード ミドルウェアである mysql_proxy を公式に提供していますが、これもサーバーにインストールする必要があり、構成ファイル (mysql サーバー IP) を変更する必要があります。本質的には nginx に似ており、プロキシ サーバーでもあります。

4. MySQLを使用してクエリ操作をコピーおよび転送する

MySQL のマスター スレーブ レプリケーションを使用すると、更新操作とクエリ操作を効果的に迂回できます。具体的な実装は、更新操作を担当するマスター サーバーと、クエリ操作を担当する複数のスレーブ サーバーです。マスターとスレーブ間のレプリケーションによって、データの同期が実現されます。可用性を確保し、さまざまなクエリのニーズを満たすさまざまなインデックスを作成するために、複数のスレーブ サーバーが使用されます。

マスターとスレーブ間ですべてのテーブルを複製する必要がない場合は、マスター サーバー上に仮想スレーブ サーバーを構築し、スレーブ サーバーに複製する必要があるテーブルをブラックホール エンジンに設定し、replicate-do-table パラメータを定義してこれらのテーブルのみを複製します。これにより、複製する必要があるバイナリ ログがフィルターされ、バイナリ ログを転送するための帯域幅が削減されます。仮想スレーブ サーバーは binlog をフィルターするだけで、実際にはデータを記録しないため、メイン データベース サーバーへのパフォーマンスの影響は非常に限定的です。

レプリケーションとシャントによるクエリの問題点は、マスター データベースが頻繁に更新されたり、ネットワークに問題があったりすると、マスターとスレーブ間でデータが異なり、クエリ結果に不具合が生じる可能性があることです。アプリケーションを設計する際には、この点を考慮する必要があります。

5. 分散データベースアーキテクチャを使用する

MySQL は 5.0.3 以降、分散トランザクションをサポートしています。現在、分散トランザクションは Innodb ストレージ エンジンでのみサポートされています。分散データベース アーキテクチャは、大量のデータと高負荷に適しており、優れたスケーラビリティと高い可用性を備えています。複数のサーバーにデータを分散することで、複数のサーバー間の負荷分散が実現され、アクセス実行効率が向上します。実装にあたっては、MySQL(NDB エンジン)の Cluster 機能を利用したり、独自のプログラムを作成してグローバル トランザクションを実装したりすることができます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQLデュアルマシンホットスタンバイと負荷分散の実装手順の詳細説明
  • パフォーマンス負荷診断にMySQLシステムデータベースを使用する方法
  • MySQL のロードバランサーとして nginx を使用する方法
  • OneProxy に基づいて MySQL の読み取り/書き込み分離と負荷分散を実装する
  • mysql+mycat、負荷分散、マスタースレーブレプリケーション、読み取り/書き込み分離操作に基づく安定した高可用性クラスタを構築します。
  • PythonはMySQLの読み書き分離と負荷分散を実装します
  • MySQLの高可用性負荷分散構成を実装するためのKeepalived+HAProxy
  • MySQLのインデックスによって引き起こされるCPU負荷の急増を分析する
  • MYSQLデータベース接続の負荷容量を迅速に増やす方法
  • 負荷分散機能を備えたMySQLサーバクラスタの導入と実装
  • MySQL の CPU 負荷が高い問題のトラブルシューティング

<<:  Centos7 に DAMO データベースをインストールするチュートリアル

>>:  NodeJSプロセスがどのように終了するかについて詳しく説明します

推薦する

MySql ログイン パスワードを忘れた場合とパスワードを忘れた場合の解決策

方法1: MySQL では、次のコマンド ラインで MySQL サーバーを起動することにより、アクセ...

SpringBoot のパッケージ化と Docker へのアップロード、およびマルチインスタンス デプロイメントの実装に関する簡単な分析 (IDEA バージョン)

最近友人からDockerを触ったことがあるかと聞かれました。あまり自信がなかったので答えられませんで...

MySQL クラスタの詳細な説明: 1 つのマスターと複数のスレーブのアーキテクチャ実装

実験環境: 1. CentOS 7 サーバー 3 台2. mysql5.7.26 (3台のマシンはす...

JavaScript 配列の重複排除とフラット化関数の紹介

目次1. 配列の平坦化(配列の次元削減とも呼ばれる)方法1: 削減メソッドを使用する方法2: スタッ...

Linux Dig コマンドの使用法

発掘紹介: Dig は、Unix ライクなコマンドライン モードで NS レコード、A レコード、M...

Dockerコンテナを閉じずに終了する方法の詳細な説明

Docker コンテナに入った後、コンテナを終了すると、コンテナは Exited 状態に変わります。...

MySQLにおける(JOIN/ORDER BY)文のクエリ処理と最適化方法

EXPLAIN ステートメントは、MySQL クエリ ステートメント プロセスと EXPLAIN ス...

ウェブサイトのハイパーリンクを開く方法に関する議論

新しいウィンドウが開きます。 利点: ユーザーがリンクをクリックしても、現在閲覧しているコンテンツは...

更新SQL文に基づくMySQLロックの理解

序文MySQL データベース ロックは、データの一貫性を実現し、同時実行性の問題を解決するための重要...

CSS で要素を垂直方向に中央揃えする 7 つの方法

【1】中央の要素の幅と高さを知る絶対値 + 負のマージンコードの実装 .wrapBox5{ 幅: 3...

JavaScript PromiseとAsync/Awaitの詳細な説明

目次概要4つの例例1: 誕生日で説明する約束の基本例2: 数字当てゲーム例3: Web APIから国...

Vue の高度なコンポーネント機能コンポーネントの使用シナリオとソースコード分析

目次導入使用シナリオソースコード分析要約する導入Vue は、コンポーネントをステートレスかつインスタ...

新しい CSS display:box プロパティの詳細な説明

1. ディスプレイボックス;要素にこのプロパティを設定すると、display:inline-bloc...

Jenkins の Docker のデプロイとインストール手順

まず、Docker がインストールされたサーバーが必要です。 (私はすでにこれをサーバーにインストー...

Centos7 に Docker をインストールします (2020 の最新バージョンが利用可能、コピーして貼り付けるだけ)

操作については、こちらの公式ドキュメントを参照してください。インストール1. 古いバージョンの do...