MySQL Routerのインストールと展開

MySQL Routerのインストールと展開

01 MySQLルーターの紹介

前回の記事では、ReplicaSet の基本的な概念、MySQL Shell ツール、および MySQL Shell を使用して Innodb Replicaset を構築する方法について説明しました。今日は、InnoDB ReplicaSet の展開プロセスにおけるもう 1 つの重要なコンポーネントである MySQL Router について説明します。

MySQL Router とは何ですか?

Innodb Replicaset をよりよく理解するために、前の図を次のようにここに移動します。

上の図から、MySQL Router がアプリケーション接続の入り口であることは容易にわかります。その存在により、基盤となるアーキテクチャがアプリケーションに対して透過的になります。アプリケーションは、基盤となるデータベースと対話するために MySQL Router に接続するだけでよく、データベースのマスター スレーブ アーキテクチャは MySQL Router の元の情報に記録されます。

バージョン

MySQL Router は、MySQL によって公式に開発された軽量で高性能なミドルウェアです。アプリケーションと MySQL サーバーの間に存在します。アプリケーションは、MySQL Router と基盤となる MySQL サーバーに接続して通信します。アプリケーションに対して透過的です。公式ドキュメントでは、MySQL 8.0 または MySQL 5.7 Server で使用することを推奨しています。最新バージョンは MySQL Router 8 です。MySQL Router 2.0 または 2.1 を使用していた場合は、MySQL Router 8 にアップグレードすることを強くお勧めします。

MySQL Router の機能は何ですか?

1. アプリケーションに対して透過的。 MySQL Router がアプリケーションに対して透過的であるためには、基盤となる MySQL に接続し、現在どのノードがプライマリであるかを認識して、障害が発生したときにフェイルオーバーを実行できるようにする必要があります。

2. 使用シナリオ。この機能に基づいて、Innodb Cluster、Innodb Replicaset、または MGR 環境で使用できます。

3. MySQL Router は、オンラインの MySQL インスタンスのキャッシュ リストまたは構成された Innodb Cluster のトポロジを保持します。また、起動時に、この情報は MySQL Router 構成テーブルから取得されます。

4. キャッシュ内のメタデータを即時更新できるようにするには、MySQL Router がクラスター内の少なくとも 1 つの正常なノードと通信できることを確認する必要があります。現在のインスタンスの Performance_schema テーブルから、データベースの元の情報とリアルタイムのステータスを取得します。

5. MySQL Router と通信するクラスター内のノードがシャットダウンされると、MySQL Router はクラスター内の他のノードにアクセスしようとします。関連するメタデータ情報を再取得します。

02 MySQLルータのインストールと展開

パフォーマンスを向上させるために、MySQL Router は通常、アプリケーションと一緒に導入されます。これは通常、次の考慮事項に基づいています。

1. TCP/IP方式の代わりにソケット経由でMySQLルーターに接続できます

2. ネットワーク遅延の削減

3. データベースにアクセスするアカウントを、myapp@'%' のようなフルネットワークアカウントではなく、myapp@'host' のように指定することで、セキュリティを向上できます。

4. 一般的に、アプリケーション サーバーはデータベース サーバーよりも拡張が容易です。

公式のデプロイメント アーキテクチャ図は次のとおりです。

ダウンロードとインストールのプロセス:

1. 公式 Web サイトに直接ログインして、対応するバージョンの MySQL Router をダウンロードします。

https://downloads.mysql.com/archives/router/

2. ダウンロード後、解凍します。8.0.20を例にとると、tar.xzファイルなので、解凍コマンドは以下のようになります。

xz -d xxx.tar.xz (tar 形式で解凍)

tar xvf xxx.tar (これで完了です)

次は初期化プロセスです。初期化中に、MySQL サーバーをデプロイする必要があります。前回の記事では、マスター 1 つとスレーブ 1 つを含む Innodb Replicaset アーキテクチャをデプロイしました。IP アドレスは次のとおりです。

192.168.1.10 5607 プライマリ

192.168.1.20 5607 セカンダリ

初期化プロセス:

1. 初期化コマンドを使用して MySQL Router を初期化します。

mysqlルーター
   --bootstrap superdba@'10.13.3.129':5607
    --ディレクトリ /data1/yazhou5/mysql/mysql-router
   --conf-use-sockets
    --アカウント ルーターフレンド
    --account-create 常に

ここで、いくつかのパラメータについて説明する必要があります。

--bootstrap はブートストラップ インスタンスを表し、その後に接続情報の URL が続きます。
--directory は生成された設定ディレクトリを表します --conf-use-sockets はソケット接続を有効にするかどうか (ソケットファイルを生成するかどうか) を表します
--account は、初期化後に MySQL ルーターが MySQL サーバーに接続するために使用するアカウントを示します。
--account-create はアカウント作成戦略を表します。always は、アカウントが存在しない場合にのみブートストラップ操作が実行されることを意味します。

このコマンドを入力すると、次のようなエラー メッセージが返されます。

エラー: スーパーユーザーとしてブートストラップしています。
これにより、すべての結果ファイル (config など) がスーパーユーザーによって個人的に所有されるようになります。
ルーターを実行するユーザーを指定するには、--user=username オプションを使用してください。
本当にスーパーユーザーである必要がある場合は、--user=root を使用します。

システムは、MySQL Routerを初期化するためにrootアカウントを使用していることを検出し、root操作を使用する場合は最後に--user=rootを追加する必要があることを通知します。

2. --user=root を追加した後、コマンドを再実行すると、結果は次のようになります。

[root mysql-router]# /usr/local/mysql-router-8.0.20/bin/mysqlrouter --bootstrap [email protected]:5607 --directory /data1/yazhou5/mysql/mysql-router --conf-use-sockets --account routerfriend --account-create always --user=root --force
superdba の MySQL パスワードを入力してください: # ここでわかっている superdba アカウントのパスワードを入力してください# '/data1/yazhou5/mysql/mysql-router' で MySQL Router インスタンスをブートストラップしています...

routerfriend の MySQL パスワードを入力してください: # ここで新しいアカウントのパスワードを作成 - アカウントを作成中
 - アカウントの確認(ルーターによって実行される SQL クエリを実行するために使用)
- キーリングにアカウントを保存する
- 生成されたファイルの権限を調整する
- 設定 /data1/yazhou5/mysql/mysql-router/mysqlrouter.conf を作成しています

# InnoDB レプリカセット 'yeyz_test' 用に構成された MySQL ルーター

このMySQLルータが生成された構成で起動された後

    $ /usr/local/mysql-router-8.0.20/bin/mysqlrouter -c /data1/yazhou5/mysql/mysql-router/mysqlrouter.conf

クラスター 'yeyz_test' にアクセスするには、次の接続を使用します。

## MySQL クラシックプロトコル

- 読み取り/書き込み接続: localhost:6446、/data1/yazhou5/mysql/mysql-router/mysql.sock
- 読み取り専用接続: localhost:6447、/data1/yazhou5/mysql/mysql-router/mysqlro.sock

## MySQL X プロトコル

- 読み取り/書き込み接続: localhost:64460、/data1/yazhou5/mysql/mysql-router/mysqlx.sock
- 読み取り専用接続: localhost:64470、/data1/yazhou5/mysql/mysql-router/mysqlxro.sock

ご覧のとおり、パスワードを 2 回入力するように求められた後、ブートストラップ操作は成功したとみなされます。

3. この時点で、パラメータで指定された --directory ディレクトリを入力し、生成された初期化ファイルを表示すると、次の内容が表示されます。

drwx------ 2 ルート ルート 4096 4月12日 23:15 データ
drwx------ 2 ルート ルート 4096 4月12日 23:15 ログ
-rw------ 1 ルート ルート 1532 4月 12日 23:15 mysqlrouter.conf
-rw------ 1 ルート ルート 104 4月12日 23:15 mysqlrouter.key
drwx------ 2 ルート ルート 4096 4月12日 23:15 実行
-rwx------ 1 ルート ルート 353 4月12日 23:15 start.sh
-rwx------ 1 ルート ルート 209 4月 12 23:15 stop.sh

いくつかの設定ファイルと起動および停止スクリプトが生成されます。設定ファイル mysqlrouter.conf を開いて内容を確認してみましょう。

# MySQL Router のブートストラップ中に自動的に生成されるファイル
[デフォルト]
ユーザー=root
ログ記録フォルダ=/data1/yazhou5/mysql/mysql-router/log
ランタイムフォルダ=/data1/yazhou5/mysql/mysql-router/run
データフォルダ=/data1/yazhou5/mysql/mysql-router/data
keyring_path=/data1/yazhou5/mysql/mysql-router/data/keyring
マスターキーパス=/data1/yazhou5/mysql/mysql-router/mysqlrouter.key
接続タイムアウト=15
読み取りタイムアウト=30
dynamic_state=/data1/yazhou5/mysql/mysql-router/data/state.json

[ロガー]
レベル = INFO

[メタデータキャッシュ:yeyz_test]
クラスタータイプ=rs
ルータID=1
ユーザー=ルーターフレンド
メタデータクラスタ=yeyz_test
0.5 秒
auth_cache_ttl=-1
auth_cache_refresh_interval=2

[ルーティング:yeyz_test_rw]
バインドアドレス=0.0.0.0
バインドポート=6446
ソケット=/data1/yazhou5/mysql/mysql-router/mysql.sock
宛先=メタデータキャッシュ://yeyz_test/?role=PRIMARY
ルーティング戦略=最初に利用可能なもの
プロトコル=クラシック

[ルーティング:yeyz_test_ro]
バインドアドレス=0.0.0.0
バインドポート=6447
ソケット=/data1/yazhou5/mysql/mysql-router/mysqlro.sock
宛先=メタデータキャッシュ://yeyz_test/?role=SECONDARY
routing_strategy=ラウンドロビンとフォールバック
プロトコル=クラシック

[ルーティング:yeyz_test_x_rw]
バインドアドレス=0.0.0.0
バインドポート=64460
ソケット=/data1/yazhou5/mysql/mysql-router/mysqlx.sock
宛先=メタデータキャッシュ://yeyz_test/?role=PRIMARY
ルーティング戦略=最初に利用可能なもの
プロトコル=x

[ルーティング:yeyz_test_x_ro]
バインドアドレス=0.0.0.0
バインドポート=64470
ソケット=/data1/yazhou5/mysql/mysql-router/mysqlxro.sock
宛先=メタデータキャッシュ://yeyz_test/?role=SECONDARY
routing_strategy=ラウンドロビンとフォールバック
プロトコル=x

4. 生成された構成ファイルを分析すると、MySQL Router が 6446、6447、64460、64470 の 4 つのポートと対応するソケット ファイルで構成されていることが簡単にわかります。

もちろん、いくつかのパラメータを設定することでデフォルトのポートとソケットを変更することもできます。たとえば、次のようになります。

--conf-use-sockets: (オプション) 4 つの接続タイプすべてに対して UNIX ドメイン ソケットを有効にします。
--conf-skip-tcp: (オプション) TCP ポートを無効にします。ソケットのみを使用する場合は、このオプションを --conf-use-sockets 経由で渡すことができます。
--conf-base-port: (オプション) デフォルトのポートを使用する代わりに、ポート範囲を変更します。 デフォルトは 6446 です。
--conf-bind-address: (オプション) 各ルートのbind_address値を変更します。

5. コマンドを使用して MySQL Router をローカルで起動し、ローカルで生成された構成ファイルを指定します。コマンドは次のとおりです。

[root@mysql-router]# /usr/local/mysql-router-8.0.20/bin/mysqlrouter -c /data1/yazhou5/mysql/mysql-router/mysqlrouter.conf &

起動後、先ほど作成した routerfriend アカウントと読み取り/書き込みポート 6446 を使用して MySQL Router に接続します。

[root@mysql-router]# mysql -u routerfriend -h 127.0.0.1 -P 6446 -p
 パスワードを入力してください:
 MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは95696です
サーバーバージョン: 8.0.19 MySQL コミュニティサーバー - GPL

Copyright (c) 2000, 2013, Oracle およびその関連会社。無断複写・転載を禁じます。

OracleはOracle Corporationおよびその関連会社の登録商標です。
その他の名称は各社の商標である場合があります。
所有者。

ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。

[email protected] [(なし)] 23:42:00>
[email protected] [(なし)] 23:42:01>@@ポートを選択します。
+--------+
| @@ポート |
+--------+
| 5607 |
+--------+
セット内の 1 行 (0.00 秒)

ポート 6446 経由で MySQL Router に接続した後、MySQL Router で select @@port コマンドを実行して、現在のポート番号情報を表示します。戻り値が 5607 であることは、MySQL Router が基盤となる MySQL Server へのルーティングに役立ったことを示しています。

routerfriend アカウントには十分な権限がない可能性があります。また、superdba 高権限アカウントを使用して mysqlrouter に接続し、MySQL サーバーのデータベース テーブルを読み書きすることもできます。

03 MySQLルーターのメタ情報を表示する

MySQL Router が構築された後、メタ情報ライブラリ mysql_innodb_cluster_metadata 内のテーブル情報 (クラスター テーブル、ルーター テーブル、インスタンス テーブルなど) を表示できます。これらのテーブル情報は、次のものに対応します。

[email protected] [mysql_innodb_cluster_metadata] 23:51:20>インスタンスから*を選択します。
+-------------+--------------------------------------+----+---------------------------------------+---------------------------------------+------------+-------------+
| インスタンス ID | クラスター ID | アドレス | mysql_server_uuid | インスタンス名 | アドレス | 属性 | 説明 |
+-------------+--------------------------------------+----+---------------------------------------+---------------------------------------+------------+-------------+
| 1 | 94d5f935-990e-11eb-8832-fa163ebd2444 | 192.168.1.10:5607 | 0609f966-690f-11eb-bd89-fa163ebd2444 | 192.168.1.10:5607 | {"mysqlClassic": "192.168.1.10:5607"} | {} | NULL |
| 2 | 94d5f935-990e-11eb-8832-fa163ebd2444 | 192.168.1.20:5607 | c6ba0bf0-6d4d-11eb-aa4b-b00875209c1c | 192.168.1.20:5607 | {"mysqlClassic": "192.168.1.20:5607"} | {} | NULL |
+-------------+--------------------------------------+----+---------------------------------------+---------------------------------------+------------+-------------+
セット内の 2 行 (0.00 秒)

[email protected] [mysql_innodb_cluster_metadata] 23:51:30>
[email protected] [mysql_innodb_cluster_metadata] 23:51:30>クラスターから*を選択します。
+--------------------------------------+--------------+--------------------+---------+------------------------------------------------+--------------+--------------+----------------+
| cluster_id | cluster_name | 説明 | オプション | 属性 | cluster_type | primary_mode | router_options |
+--------------------------------------+--------------+--------------------+---------+------------------------------------------------+--------------+--------------+----------------+
| 94d5f935-990e-11eb-8832-fa163ebd2444 | yeyz_test | デフォルトのレプリカセット | NULL | {"adopted": 0, "opt_gtidSetIsComplete": false} | ar | pm | NULL |
+--------------------------------------+--------------+--------------------+---------+------------------------------------------------+--------------+--------------+----------------+
セット内の 1 行 (0.00 秒)

[email protected] [mysql_innodb_cluster_metadata] 23:51:57>
[email protected] [mysql_innodb_cluster_metadata] 23:51:58>ルーターから*を選択します。
+-----------+--------------+--------------+-------------+----------+----------+----------------------+--------------------------------------------------------------------------------------------------------------+--------------------------------------+---------+
| router_id | router_name | product_name | アドレス | バージョン | last_check_in | 属性 | cluster_id | オプション |
+-----------+--------------+--------------+-------------+----------+----------+----------------------+--------------------------------------------------------------------------------------------------------------+--------------------------------------+---------+
| 1 | | MySQL ルーター | 10.13.3.129 | 8.0.20 | 2021-04-12 23:52:29 | {"ROEndpoint": "6447", "RWEndpoint": "6446", "ROXEndpoint": "64470", "RWXEndpoint": "64460", "MetadataUser": "routerfriend"} | 94d5f935-990e-11eb-8832-fa163ebd2444 | NULL |
+-----------+--------------+--------------+-------------+----------+----------+----------------------+--------------------------------------------------------------------------------------------------------------+--------------------------------------+---------+
セット内の 1 行 (0.00 秒)

テーブルから現在のプライマリ ノード情報を表示することもできます。 primary_master フィールドが 1 の場合、それはプライマリ ノードです。

[email protected] [mysql_innodb_cluster_metadata] 23:52:29>async_cluster_members から * を選択します。
+--------------------------------------+---------+-------------+--------------------+----------------+----------------------------------------------------------------------------------------------------------------------------------+
| クラスター ID | ビュー ID | インスタンス ID | マスター インスタンス ID | プライマリ マスター | 属性 |
+--------------------------------------+---------+-------------+--------------------+----------------+----------------------------------------------------------------------------------------------------------------------------------+
| 94d5f935-990e-11eb-8832-fa163ebd2444 | 2 | 1 | NULL | 1 | {"instance.address": "192.168.1.10:5607", "instance.mysql_server_uuid": "0609f966-690f-11eb-bd89-fa163ebd2444"} |
| 94d5f935-990e-11eb-8832-fa163ebd2444 | 3 | 1 | NULL | 1 | {"instance.address": "192.168.1.10:5607", "instance.mysql_server_uuid": "0609f966-690f-11eb-bd89-fa163ebd2444"} |
| 94d5f935-990e-11eb-8832-fa163ebd2444 | 3 | 2 | 1 | 0 | {"instance.address": "192.168.1.20:5607", "instance.mysql_server_uuid": "c6ba0bf0-6d4d-11eb-aa4b-b00875209c1c"} |
+--------------------------------------+---------+-------------+--------------------+----------------+----------------------------------------------------------------------------------------------------------------------------------+
セット内の 3 行 (0.01 秒)

上記はMySQL Routerのインストールと展開の詳細な内容です。MySQL Routerの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL 高可用性クラスタの展開とフェイルオーバーの実装
  • Docker に MySQL をデプロイする例
  • Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました
  • MySQL8 ベースの docker-compose デプロイメント プロジェクトの実装
  • mysql-canal-rabbitmq のインストールと展開の非常に詳細なチュートリアル
  • MySQL MHA の高可用性構成とフェイルオーバーの詳細な導入手順
  • MySQL で MHA アーキテクチャのデプロイメントを構築する手順
  • CentOS8 で MySQL 8.0 をインストールしてデプロイする方法

<<:  パーソナライズされた検索エンジンを使用して、必要なパーソナライズされた情報を検索します

>>:  Dockerfileを使用してDockerイメージを構築する

推薦する

クラウドネイティブテクノロジー Kubernetes (K8S) の紹介

目次01 Kubernetes とは何ですか? 02 KubernetesとCompost+Swar...

JavaScript配列重複排除の詳細な説明

目次1. アレイ重複排除2. 配列内のオブジェクトの重複排除3. 配列内の同じフィールドに基づいて別...

CSSフィルターにはどんな魔法の用途があるか

背景基本概念CSS filterプロパティは、ぼかしや色の変化などのグラフィック効果を要素に適用して...

CSS ですべての子要素を選択し、スタイルを追加する方法

方法:実際のプロジェクトを例に挙げてみましょう。 .lk-ツールバー{ .el-入力{ 幅: 169...

体験をデザインする: ボタンには何があるか

<br />最近、UCDChina は「インターフェース上のテキストに注意を払う」という...

MySQL の datetime フィールドの丸め操作

目次序文1. 背景2. シミュレーションテスト3. 結論要約する序文もし私が罠に陥っていなかったら、...

Vue はフォームデータ検証のサンプルコードを実装します

el-form フォームにルールを追加します。データにルールを定義する定義されたルールをel-for...

MySQL に接続されている IP アドレスを表示する方法の例

具体的な方法:まずコマンドプロンプトを開きます。次に、[ mysql -u root -p ] コマ...

Vueは州、都市、地区のカスケード選択を実現します

最近、省、市、地区のカスケード選択効果を実装する必要があります。省、市、地区のデータはすべてローカル...

CentOS 6.2 に MySQL 5.7.28 をインストールするチュートリアル (mysql ノート)

1. 環境整備1.MySQLインストールパス: /usr/local 2. CentOS 6.2 ...

Zabbixで指定時間内の変化値を設定する方法の詳細な説明

背景説明: 既存の負荷分散装置には、付加価値状態にある指標があります (増加するだけで減少しないため...

HTMLは角丸四角形を簡単に実装します

質問: div+css と配置を使用して角丸四角形を実現するにはどうすればよいですか?ソリューション...

フォームの送信イベントが応答しない

1. 問題の説明<br />JS を使用してフォームの送信メソッドを呼び出してフォームを...

ウェブデザインの詳細分析に関する詳細な議論

設計業務では、設計者がレビューに参加したり、リーダーの一部が設計案の詳細が足りないと言っているのをよ...

Docker 入門インストールチュートリアル (初心者版)

ドクター紹介: Docker はコンテナ関連の技術です。簡単に言うと、さまざまなソフトウェアを実行で...