1. はじめにMySQL Router は、以前の古いバージョンの SQL プロキシを置き換えるために MySQL によって公式に提供される軽量の MySQL ミドルウェアです。 MySQL Router はデータベース ミドルウェアであるため、前のクライアントからの SQL 要求が書き込み要求であるか読み取り要求であるかを分析し、SQL 要求をマスターに送信するかスレーブに送信するか、またどのマスターまたはスレーブに送信するかを決定できる必要があります。このようにして、MySQL Router は MySQL の読み取りと書き込みの分離を実現し、MySQL リクエストの負荷を分散します。 したがって、MySQL Router の前提は、バックエンドが MySQL マスター スレーブ レプリケーションを実装することです。 MySQL Router は非常に軽量で、異なるポートを介した単純な読み取り/書き込み分離のみを実装できます。読み取り要求のスケジュール アルゴリズムでは、デフォルトの rr (ラウンドロビン) のみを使用できます。より高度で複雑な機能はありません。したがって、MySQL Router を実装する場合は、バックエンド MySQL の高可用性を自分で構成する必要があります。高可用性を実現するには、Percona XtraDB Cluster、MariaDB Galera、またはMySQLの公式グループレプリケーションを使用することをお勧めします。他に選択肢がない場合は、MHAを使用して実現することもできます。 したがって、単純な MySQL Router の展開図は次のようになります。 この記事では、バックエンドに MySQL マスター/スレーブ高可用性がない場合に、MySQL Router を使用して読み取り/書き込み分離を実装します。バックエンドに MySQL 高可用性がある場合に読み取り/書き込み分離が実装されない理由について説明します。私の意見では、MySQL Router は単なるおもちゃです。機能が少ないだけでなく、アプリケーション コードで読み取り/書き込みに異なるポートを指定する必要があります (後述の構成ファイルの説明を参照)。実際の環境では誰も使用しません。 2. MySQLルーターを構成する以下は実験環境です。
バックエンドの MySQL マスター/スレーブ レプリケーションでは高可用性が実現されないため、書き込み操作を担当するマスター ノードは 1 つだけです。 すべてのバックエンド MySQL ノードは新しくインストールされた MySQL インスタンスであるため、マスター/スレーブ レプリケーションを直接有効にできます。既存データのマスター・スレーブレプリケーションの場合は、まずそれらが同期されていることを確認する必要があります。方法は次のとおりです。スレーブをマスターによって指定された座標に復元します。 2.1 MySQLルーターのインストールMySQL Router のバイナリ バージョンを次の場所からダウンロードします: https://dev.mysql.com/downloads/router/ ここでは、MySQL Router 2.1.6 のバイナリ バージョンが使用されます。 tar xf mysqlrouter-2.1.6-linux-glibc2.12-x86-64bit.tar.gz mv mysqlrouter-2.1.6-linux-glibc2.12-x86-64bit /usr/local/mysqlrouter そうなんです、とても簡単です。 バイナリパッケージを解凍すると、解凍されたディレクトリに次のファイルがあります。 [root@s1 mr]# ls binデータにはlib実行共有が含まれる bin ディレクトリには、MySQL Router のメイン プログラムでもあるバイナリ プログラム mysqlrouter が 1 つだけあります。 共有ディレクトリにはサンプル設定ファイルとサンプル SysV スタイルの起動スクリプトがありますが、残念ながらスクリプトは Debian プラットフォームに基づいているため、Red Hat シリーズで使用する前に変更してインストールする必要があります。そこで、後で CentOS で SysV スクリプトを作成しました。 [root@s1 mr]# ls share/doc/mysqlrouter/ ライセンス.txt README.txt sample_mysqlrouter.conf sample_mysqlrouter.init 最後に、メイン プログラムを PATH 環境変数に追加します。 echo "PATH=$PATH:/usr/local/mysqlrouter/bin" >/etc/profile.d/mysqlrouter.sh chmod +x /etc/profile.d/mysqlrouter.sh ソース /etc/profile.d/mysqlrouter.sh 2.2 MySQLルーターの起動とテスト以下は、上記の実験環境用の設定ファイルです。マスターノードは [デフォルト] config_folder = /etc/mysqlrouter ログ記録フォルダ = /usr/local/mysqlrouter/log ランタイムフォルダ = /var/run/mysqlrouter [ロガー] レベル = INFO [ルーティング:スレーブ] バインドアドレス = 192.168.100.21:7001 宛先 = 192.168.100.23:3306,192.168.100.24:3306 モード = 読み取り専用 接続タイムアウト = 1 [ルーティング:マスター] バインドアドレス = 192.168.100.21:7002 宛先 = 192.168.100.22:3306 モード = 読み書き 接続タイムアウト = 2 次に、MySQL Router が配置されているマシンに上記で使用したディレクトリを作成します。 シェル> mkdir /etc/mysqlrouter /usr/local/mysqlrouter/log /var/run/mysqlrouter これにより、MySQL Router が起動してサービスが提供されます (開始する前に、バックエンドの MySQL がマスター/スレーブ レプリケーションで構成されていることを確認してください)。 [root@s1 mr]# mysqlrouter & [1] 16122 監視ステータスを確認します。ここで監視される 2 つのポート 7001 と 7002 は、フロントエンドが MySQL ルーターに接続するために使用されます。これらは、フロントエンドから送信された SQL 要求を受信し、読み取りおよび書き込みルールに従って SQL 要求をバックエンドの MySQL マスター ノードとスレーブ ノードにルーティングするために使用されます。 [root@s1 mr]# netstat -tnlp アクティブなインターネット接続(サーバーのみ) プロトコル 受信Q 送信Q ローカルアドレス 外部アドレス 状態 PID/プログラム名 tcp 0 0 0.0.0.0:6032 0.0.0.0:* LISTEN 1231/proxysql tcp 0 0 0.0.0.0:6033 0.0.0.0:* LISTEN 1231/proxysql tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1152/sshd tcp 0 0 192.168.100.21:7001 0.0.0.0:* LISTEN 16122/mysqlrouter tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2151/マスター tcp 0 0 192.168.100.21:7002 0.0.0.0:* LISTEN 16122/mysqlrouter tcp6 0 0 :::22 :::* 1152/sshdをリッスン tcp6 0 0 ::1:25 :::* LISTEN 2151/マスター ログを表示します: [root@s1 mr]# cat /usr/local/mysqlrouter/log/mysqlrouter.log 2018-07-07 10:14:29 INFO [7f8a8e253700] [routing:slaves] が開始されました: 192.168.100.21:7001 でリッスン中; 読み取り専用 2018-07-07 10:14:29 INFO [7f8a8ea54700] [routing:masters] が開始されました: 192.168.100.21:7002 でリッスン中; 読み取り/書き込み 最後にテストします。テストする前に、バックエンド マスターの MySQL ルーター ノードに認証を与えて接続を許可します。接続は 2 つのスレーブ ノードに複製されます。 mysql> 'P@ssword1!' で識別される root@'192.168.100.%' に *.* のすべての権限を許可します。 書き込みポートである MySQL Router のポート 7002 に接続します。マスター/スレーブの高可用性は構成されていないため、書き込み可能かどうかを確認する簡単なテストで十分です。 [root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7002 -e '@@server_idを選択します;' mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。 +-------------+ | @@サーバーID | +-------------+ | 110 | +-------------+ [root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7002 -e 'データベースmytestを作成します;' mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。 [root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7002 -e 'データベースを表示;' mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。 +--------------------+ | データベース | +--------------------+ | 情報スキーマ | |mysql | | マイテスト | | パフォーマンススキーマ | |システム| +--------------------+ 次に、各スレーブ ノードをテストして、rr スケジューリング アルゴリズムの読み取り要求の負荷分散を実現できるかどうかを確認します。 [root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7001 -e '@@server_idを選択します;' mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。 +-------------+ | @@サーバーID | +-------------+ | 120 | +-------------+ [root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7001 -e '@@server_idを選択します;' mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。 +-------------+ | @@サーバーID | +-------------+ | 130 | +-------------+ [root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7001 -e 'データベースを表示;' mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。 +--------------------+ | データベース | +--------------------+ | 情報スキーマ | |mysql | | マイテスト | | パフォーマンススキーマ | |システム| +--------------------+ 当然ながら、検査結果は正常です。 MySQL Router は非常にシンプルであるように見えます。実際、非常にシンプルです。適切な構成ファイルを提供するだけで、すべて設定完了です。それでは、MySQL Router の設定ファイルについて説明しましょう。 3. MySQLルーター設定ファイルの説明MySQL Router の設定ファイルも非常にシンプルで、設定が必要な項目は多くありません。 デフォルトでは、mysql ルーターはインストール ディレクトリで "mysqlrouter.conf" を検索し、ホーム ディレクトリで ".mysqlrouter.conf" を検索します。バイナリ プログラムの mysqlrouter コマンドで "-c" または "--config" を使用して、構成ファイルを手動で指定することもできます。 MySQL ルーターの設定ファイルはフラグメント形式であり、よく使用されるフラグメントは [DEFAULT]、[logger]、[routing:NAME] の 3 つです。フラグメント名は大文字と小文字が区別され、単一行の「#」または「;」コメントのみがサポートされます。行の途中または行末のコメントはサポートされません。 上記の例の設定ファイルを見てみましょう。 [デフォルト] config_folder = /etc/mysqlrouter ログ記録フォルダ = /usr/local/mysqlrouter/log ランタイムフォルダ = /var/run/mysqlrouter [ロガー] レベル = INFO [ルーティング:スレーブ] バインドアドレス = 192.168.100.21:7001 宛先 = 192.168.100.23:3306,192.168.100.24:3306 モード = 読み取り専用 接続タイムアウト = 1 [ルーティング:マスター] バインドアドレス = 192.168.100.21:7002 宛先 = 192.168.100.22:3306 モード = 読み書き 接続タイムアウト = 2 1.DEFAULTフラグメントの構成。 例えば: [デフォルト] config_folder=/etc/mysqlrouter #追加の設定ファイルディレクトリを指定します。このディレクトリ内のすべての conf ファイルが読み込まれます。logging_folder=/usr/local/mysqlrouter/log #ログディレクトリを指定します。ログファイル名は mysqlrouter.log です。 runtime_folder=/var/run/mysqlrouter #ランタイムディレクトリを指定します。デフォルトは /run/mysqlrouter です。 2.ロガーフラグメントの構成。 [ロガー] レベル=debug # デバッグ、情報(デフォルト)、警告、エラー、致命的、大文字と小文字を区別しない 3.ルーティングフラグメントの構成。 ルーティング構成セクションで設定できるオプションは次のとおりです。 (1) bind_address と bind_port は、mysql ルーターがフロントエンド SQL 要求をリッスンするアドレスとポートです。 MySQL Router ではポートは必須ですが、bind_address を使用して さらに、リスニング アドレスは destinations ディレクティブによって指定されたリストに表示できません。 次に例を示します。 [ルーティング:スレーブ] バインドポート = 7001 [ルーティング:スレーブ] バインドアドレス = 192.168.100.21 バインドポート = 7001 [ルーティング:スレーブ] バインドアドレス = 192.168.100.21:7001 一般的に言えば、異なるポートを介して読み取り/書き込みの分離を実装することは良い考えではありません。最大の理由は、これらの接続ポートをアプリケーション コードで指定する必要があることです。ただし、MySQL Router は読み取りと書き込みの分離をこの方法でのみ実現できるため、MySQL Router はおもちゃとしてのみ使用する必要があります。 (2) ルーティング ルールの転送先を [ルーティング:スレーブ] バインドアドレス = 192.168.100.21:7001 宛先 = 192.168.100.23:3306,192.168.100.24:3306 [ルーティング:マスター] バインドアドレス = 192.168.100.21:7002 宛先 = 192.168.100.22:3306,192.168.100.100:3306 (3) MySQL ルーターには、読み取り専用モードと読み取り/書き込みモードの 2 つのモードがあります。これら 2 つの方法により、異なる転送スケジューリング方法が生成されます。 読み取り/書き込みに設定します。これは、マスターの高可用性を実現するために、宛先をマスターに設定する場合によく使用されます。
読み取り専用に設定され、MySQL 読み取り要求の負荷分散を実現するために宛先をスレーブに設定する場合によく使用されます。
(4)
(5)その他の選択肢 使用するプロトコル、リクエストの最大数など、その他の指示も設定できますが、デフォルト値を設定する必要はありません。これらはすべて、MySQL Router が MySQL と組み合わせて最適化したオプションであり、それ自体がすでに完璧です。 設定ファイルには、おおよそ次の内容が含まれています。設定後、最初にデフォルト セグメントに関係するディレクトリを作成することを忘れないでください。その後、mysql router を起動して、読み取り/書き込み分離サービスを提供できます。 4. MySQL Router用のSysVスクリプトを提供するMySQL Router はメイン プログラム (bin ディレクトリの mysqlrouter) のみを提供し、プログラムは停止オプションなしでのみ起動できるため、プロセスを強制終了するには kill コマンドのみを使用できます。 MySQL Router にはサンプルの起動スクリプトも用意されており、 シェル> vim /etc/init.d/mysqlrouter #!/bin/bash # chkconfig: -78 30 # 説明: MySQL ルーターの起動/停止 デーモン=/usr/local/mysqlrouter proc=$DAEMON/bin/mysqlrouter DAEMON_OPTIONS="-c ${DAEMON}/mysqlrouter.conf" . /etc/init.d/functions 始める() { [ -e /var/lock/subsys/mysqlrouter ]の場合; アクション「MySQL ルータは動作しています」/bin/false それ以外 $proc $DAEMON_OPTIONS & &>/dev/null 戻り値=$? エコー [ $retval -eq 0 ]の場合; /var/lock/subsys/mysqlrouter をタッチします アクション「MySQL ルーターを起動しています」/bin/true それ以外 echo "MySQL ルーターの起動に失敗しました" フィ フィ } 停止() { [ -e /var/lock/subsys/mysqlrouter ]の場合; キルオール$proc 戻り値=$? エコー [ $retval -eq 0 ]の場合; rm -f /var/lock/subsys/mysqlrouter アクション「MySQL ルーターを停止しています」/bin/true フィ それ以外 アクション「MySQL ルータが動作していません」/bin/false フィ } 状態() { [ -e /var/lock/subsys/mysqlrouter ]の場合; echo "MySQL ルータが実行中です" それ以外 echo "MySQL ルータは実行されていません" フィ } ケース「$1」 始める) 始める 睡眠1 ;; 停止) 停止 睡眠1 ;; 再起動) 停止 始める 睡眠1 ;; 状態) 状態 ;; *) echo "使用法: $0 {start|stop|status|restart}" 戻り値=1 ;; エサック $retval を終了 次に実行権限を付与します。 シェル> chmod +x /etc/init.d/mysqlrouter これで、MySQL Router を使用して MySQL の読み取り/書き込み分離を実装する方法についての記事は終了です。MySQL Router の読み取り/書き込み分離の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: iframe src 割り当ての問題 (サーバー側)
目次結論は実践分析拡張機能要約する結論は親コンポーネントでカスタム イベントが定義されている場合、子...
MySQL 8.0のインストールと設定方法は参考までに。具体的な内容は以下のとおりです。ダウンロード...
MySQL は人気のオープンソースデータベース管理システムとして多くのユーザーが利用しています。デー...
特記事項:この記事は、Chris Spooner の英語記事「Web デザイン用の Retina グ...
目次OAuth アプリの作成コードを取得するaccess_tokenを取得するユーザー情報を取得する...
nginx はリクエストを受信すると、まず server_name でサーバーを照合し、次にサーバー...
序文説明を簡略化するために以前に設定した要件は、他のグループから MQ メッセージを受信し、データベ...
目次ユースケースリアクティブAPI関連プロセス反応的なcreateReactiveObjectはレス...
1. はじめにVagrant は、仮想マシン (VirtualBox) を構築および管理するためのツ...
Vueのメソッドとプロパティ1. 方法使用法 1メソッド: {メソッド名: function(){}...
まず、フォントアイコンとは何でしょうか?表面的にはアイコンですが、実際はテキストです。テキストの設定...
目次トランザクション分離レベル同時トランザクション実行中に発生した問題SQL標準の4つの分離レベルM...
1. 改行を強制せず、省略記号で終了します。コードをコピーコードは次のとおりです。 <div ...
序文コア機能のデフォルトの組み込みディレクティブ (v-model および v-show) に加えて...
前面に書かれたLinux を使用する際にソフトウェアをインストールする必要がある場合があります。もち...