MySQL の読み書き分離と負荷分散

著者: 禅とコンピュータープログラミングの芸術

1 はじめに

インターネット Web サイトのトラフィックの増加に伴い、データベースの負荷という課題に直面する Web サイトが増えています。単一のサーバーではこのような大量のアクセスを処理できないため、サーバーが同時により多くのリクエストを処理できるように、データベースを水平に分割する必要があります。通常の状況では、MySQL のマスター/スレーブ レプリケーションは読み取りと書き込みの分離を実現する方法です。つまり、マスター サーバーはスレーブ サーバーへの書き込みと同期を担当し、スレーブ サーバーは読み取りのみを担当します。ただし、マスター/スレーブ レプリケーションにおける遅延や非同期レプリケーションなどの問題により、同時実行性が高いシナリオではパフォーマンスが低下します。MySQL のマスター/スレーブ レプリケーションの問題を解決し、データベースの処理能力を向上させるために、MySQL の公式チームは、ミドルウェアとして mysql-proxy と呼ばれるオープン ソース ソフトウェアを立ち上げました。読み取りと書き込みの分離機能を実現することで、データベースへの負荷を軽減し、データベースの処理能力を向上させることができます。この記事では、mysql-proxy の動作原理、設定方法、具体的な最適化方法などを詳しく紹介します。

2. 読み書きの分離

読み取り書き込み分割は、データベース サーバーの処理能力を向上させるためにデータベース クラスターで一般的に使用されるデータベース最適化戦略です。通常、マスター データベース (Master) の場合、負荷は特定の戦略に従って複数のスレーブ データベース (Slave) に分散され、クエリ ステートメントがマスター データベースにアクセスする必要がある場合、クエリ ステートメントは実行のためにマスター データベースにのみ送信されます。 ; while 更新またはステートメントを挿入すると、すべてのスレーブ ライブラリに実行の通知が同時に送信されます。これを行うことの利点には、主に次のような側面が含まれます。

  1. データベース サーバーの処理能力の向上: 負荷分散により、データベース リクエストを異なるデータベース サーバーに分散できるため、データベース クラスター全体の処理能力が向上します。

  2. データベース サービスの可用性の向上: データベース サーバーに障害が発生した場合、そのサーバー上のスレーブ データベースのみが影響を受け、他のサーバーは引き続き通常のサービスを提供できます。

  3. 災害耐性の向上: 特定のエリアのデータベースに障害が発生した場合、そのエリアのサーバーをシャットダウンするだけで済み、他のサーバーは引き続き通常のサービスを提供できます。

  4. メイン データベースへの負荷を軽減する: すべてのクエリはメイン データベースにのみ送信されるため、メイン データベースへの負荷が軽減され、データベースの応答が速くなります。

MySQL の読み取りと書き込みを分離する利点:

  1. メイン ライブラリへの負荷を共有する: 読み取りと書き込みが分離されると、メイン ライブラリへの書き込み操作の負荷が半分になります。同時に、すべてのデータ操作がスレーブ ライブラリを通じて実行されるため、メイン ライブラリへの負荷が軽減されます。大幅に軽減される。

  2. データベース処理能力の向上: 読み取りと書き込みが分離されると、データベースの処理能力が大幅に向上します。

  3. データのバックアップと災害復旧機能の向上: マスター データベースのデータをスレーブ データベースにバックアップすることで、マスター データベースの致命的な障害によるデータ損失のリスクを効果的に回避できます。

3.mysql-proxy の概要

mysql-proxy は、Alibaba Group によって開発されたオープンソースのデータベース ミドルウェアであり、次の特徴があります。

  1. 読み書き分離のサポート: mysql-proxy はデータベースの読み書き分離機能を実現できます。つまり、一部のクエリ要求を特定のスレーブ ライブラリに送信して、メイン ライブラリの負荷を軽減できます。

  2. 負荷分散: mysql-proxy は、接続と SQL 解析に基づいた 2 つの負荷分散戦略をサポートしており、負荷の不均衡を自動的に特定し、バックエンド接続プール情報を自動的に調整できます。

  3. ホット スイッチングのサポート: mysql-proxy は、サービスを停止することなくスレーブ データベース ノードを動的に追加または削除でき、読み書き分離の動的スイッチングを実現します。

  4. データの整合性の保証: mysql-proxy は、binlog ダンプ プロトコルを使用して、メイン データベースのデータ変更をスレーブ データベースにリアルタイムで同期し、データの整合性を確保します。

  5. 強力なプロトコル互換性: mysql-proxy はネイティブ MySQL クライアントとの良好な互換性を維持しており、クライアントの接続パラメータを変更することで mysql-proxy に直接接続できます。

  6. 柔軟な構成: mysql-proxy は構成ファイルのホット ロードをサポートしており、動作中に構成情報を動的に変更してシームレスな切り替えを実現できます。

4.mysql-proxy のインストールとデプロイメント

4.1 コンパイル環境のインストール

システムに gcc または make ツールがインストールされていない場合は、まずそれらをインストールしてから、mysql-proxy ソース パッケージをインストールしてください。

yum install -y gcc make

4.2 ソースコードのダウンロード

mysql-proxy の最新バージョンは 1.9 です。他のバージョンを選択してダウンロードし、コンパイルしてインストールすることもできます。

wget https://github.com/mysql-net/MySqlConnector/releases/download/v1.3.14/mysql-connector-net_1.3.14.tar.gz
tar zxvf mysql-connector-net_1.3.14.tar.gz && cd mysql-connector-net_1.3.14/
./build.sh
cp MySqlConnector.dll /usr/local/lib/

4.3 設定ファイルの説明

インストールが完了したら、/etc/myproyx/ ディレクトリに移動し、my.ini ファイルを表示します。重要な情報は次のとおりです。

[server]
# server_id is used to identify this proxy instance among a set of proxies
server_id = 1

[mysql]
host=127.0.0.1 # 连接到的MySQL主机地址,通常设置为master节点的IP地址
port=3306 # MySQL端口号
user=root # 登录用户名
password=<PASSWORD> # 登录密码
schema=test # 设置默认的数据库名

[readconnroute]
# readconnroute specifies the destination of SELECT queries
rule1=slave|localhost:3306|test

[writeconnroute]
# writeconnroute specifies the destination of INSERT, UPDATE and DELETE queries
rule1=master|localhost:3306|test

[app]
enable_heartbeat=true # 是否开启心跳检测功能

このうち、hostどの MySQL ノードに接続するかを指定するフィールド (通常はマスター ノードの IP アドレスに設定されます)、portMySQL のポート番号、userMySQLpasswordにログインするためのユーザー名とパスワードをそれぞれ指定しschemaます。デフォルトのデータベース名を設定するために使用されます。readconnroute2 つのwriteconnrouteサブキーは、それぞれ SELECT ステートメントと INSERT/UPDATE/DELETE ステートメントのターゲット ノードを定義します。形式は、{type}|{IP}:{port}|{database name} です。ここで注目すべきはrule1マッチングルールを表す第1条です。最初の部分slaveはタイプを示し、ルールが SELECT リクエストに適用されることを示します。後半の部分は、localhost:3306マスター ノードに送信されたリクエストの転送先アドレスであるターゲット ノードを示します。3 番目のパラメータは、testリクエストがどのデータベースに送信されるかを示します。 (データベースに設定したデフォルト)。その他のサブ項目には次のものがあります。

  • charset:文字エンコード形式を指定します。
  • sqlblacklist: 特定の SQL ステートメントがスレーブ データベースに送信されることを禁止するように指定できます。
  • tls:TLS暗号化通信を設定します。

4.4 mysql-proxyの起動

mysql-proxy を開始します。

/usr/local/mysql-proxy/bin/myproyx --defaults-file=/etc/myproyx/my.ini

異常なログが表示された場合は、プロンプトに従ってエラーの原因をトラブルシューティングできます。正常に起動すると、コマンド ライン ウィンドウに関連情報が表示されます。これは、正常に実行されていることを意味します。

4.5 テスト

4.5.1 マスター/スレーブステータスの表示

まず、mysql コマンド ライン ツールを使用してマスター/スレーブのステータスを確認します。

mysql -h 127.0.0.1 -P 3306 -u root -p123456 -e "show slave status\G"

返された結果のSeconds_Behind_Master値が でない場合はNULL、現在のマスター/スレーブ レプリケーションのステータスが正常であることを示します。

4.5.2 クエリデータ

次に、読み取りと書き込みの分離の効果が正しいかどうかをテストします。まず別のウィンドウを開いて、mysql-proxy が配置されているマシンに接続します。

mysql -h 127.0.0.1 -P 4040 -u root -p123456 -D test

ポート 3306 ではなく、ポート 4040 への接続を指定する必要があることに注意してください。次に、いくつかの簡単なクエリを実行してステートメントを挿入してみます。

-- 查询数据
select * from users where id=1;

-- 插入数据
insert into users (name, age) values ('Tom', 25);

すべてのクエリは実行のためにメイン データベースにのみ送信され、すべての挿入ステートメントは実行のためにメイン データベースとスレーブ データベースの両方に送信されることがわかります。このプロセスを繰り返して、読み取りと書き込みの分離の効果を検証できます。

おすすめ

転載: blog.csdn.net/universsky2015/article/details/133504780