在之前的文章中,我们使用 MySQL Shell 搭建了一个最简单的三节点 InnoDB Cluster ,虽然它利用组复制可以提供高可用、单节点容错功能、故障转移,却并未提供诸如会话重定向、负载均衡等路由器相关功能,而这些功能是通过使用 MySQL Router 来实现的。
有关 MySQL Router 的更多详细信息,可以参阅我持续更新的 《 MySQL Router 8.0 》专栏 ,也可以参阅官方 《 MySQL Router 8.0 》文档 。
https://blog.csdn.net/wudi53433927/article/details/128138647
本文仅介绍在 Linux 操作系统上使用 Yum 仓库包安装 MySQL Router 。
更多有关 MySQL Router 8.0 安装的详细信息,请参阅 2.1 在 Linux 上安装 MySQL Router
。
安装过程:
[root@ic-source ~]# yum install -y mysql-router-community.x86_64
已加载插件:fastestmirror
Repository base is listed more than once in the configuration
Loading mirror speeds from cached hostfile
* centos-sclo-rh: ftp.sjtu.edu.cn
base | 3.6 kB 00:00:00
centos-sclo-rh | 3.0 kB 00:00:00
extras | 2.9 kB 00:00:00
mysql-connectors-community | 2.6 kB 00:00:00
mysql-tools-community | 2.6 kB 00:00:00
mysql80-community | 2.6 kB 00:00:00
updates | 2.9 kB 00:00:00
正在解决依赖关系
--> 正在检查事务
---> 软件包 mysql-router-community.x86_64.0.8.0.31-1.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
=======================================================================================================================================
Package 架构 版本 源 大小
=======================================================================================================================================
正在安装:
mysql-router-community x86_64 8.0.31-1.el7 mysql-tools-community 4.7 M
事务概要
=======================================================================================================================================
安装 1 软件包
总下载量:4.7 M
安装大小:21 M
Downloading packages:
mysql-router-community-8.0.31-1.el7.x86_64.rpm | 4.7 MB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : mysql-router-community-8.0.31-1.el7.x86_64 1/1
验证中 : mysql-router-community-8.0.31-1.el7.x86_64 1/1
已安装:
mysql-router-community.x86_64 0:8.0.31-1.el7
完毕!
注意
检查 MySQL 提供的 Yum 源时发现有两个可用安装包,请选择最新的那个 mysql-router-community 社区版本安装。[root@ic-source ~]# yum list mysql-router* 已加载插件:fastestmirror Repository base is listed more than once in the configuration Loading mirror speeds from cached hostfile * centos-sclo-rh: ftp.sjtu.edu.cn 已安装的软件包 mysql-router-community.x86_64 8.0.31-1.el7 >@mysql-tools-community 可安装的软件包 mysql-router.x86_64 8.0.12-1.el7 mysql->tools-community
我在部署时参考了 6.10 Using MySQL Router with AdminAPI, InnoDB Cluster, and InnoDB ReplicaSet 内容,选择不创建自包含目录的方式引导 MySQL Router 。
使用setupRouterAccount(user, [options])
操作创建 MySQL 用户帐户或升级现有帐户,以便 MySQL Router 可以使用该帐户在 InnoDB Cluster 或 InnoDB ReplicaSet 上运行。这是使用 InnoDB Cluster 和 InnoDB ReplicaSet 配置 MySQL Router 的推荐方法。
此方法要求使用 MySQL Shell 8.0.20 及更高版本。
执行如下命令,向 cluster 变量所引用的 InnoDB Cluster 中添加名为 myRouter1 的 MySQL Router 账户并为其设置密码。
MySQL ic-source:33060+ ssl JS > var cluster=dba.getCluster()
MySQL ic-source:33060+ ssl JS > cluster.setupRouterAccount('myRouter1')
Missing the password for new account myRouter1@%. Please provide one.
Password for new account: ************
Confirm password: ************
Creating user myRouter1@%.
Account myRouter1@% was successfully created.
在本例中,没有指定域,因此是使用通配符(%)创建帐户,这确保创建的用户可以从任何域连接。
要基于 InnoDB Cluster 或 InnoDB ReplicaSet 引导MySQL Router,需要连接到在线实例的 URI 类型连接(字符)串。使用--bootstrap=instance
运行mysqlrouter
命令(instance 是连接到在线实例的 URI 类型连接串)。 MySQL Router 连接到实例,并使用包含的元数据缓存插件来检索元数据,包括服务器实例地址及其角色的列表。
注意,下例中第一次使用操作系统root
账户引导时因未指定--user=root
选项而报错。
[root@ic-source ~]# mysqlrouter --bootstrap ic_admin@ic-source:3306 --account=myRouter1
Error: You are bootstrapping as a superuser.
This will make all the result files (config etc.) privately owned by the superuser.
Please use --user=username option to specify the user that will be running the router.
Use --user=root if this really should be the superuser.
[root@ic-source ~]# mysqlrouter --bootstrap ic_admin@ic-source:3306 --account=myRouter1 --user=root
Please enter MySQL password for ic_admin:
# Bootstrapping system MySQL Router instance...
Please enter MySQL password for myRouter1:
- Creating account(s) (only those that are needed, if any)
- Verifying account (using it to run SQL queries that would be run by Router)
- Storing account in keyring
- Adjusting permissions of generated files
- Creating configuration /etc/mysqlrouter/mysqlrouter.conf
Existing configuration backed up to '/etc/mysqlrouter/mysqlrouter.conf.bak'
# MySQL Router configured for the InnoDB Cluster 'myCluster'
After this MySQL Router has been started with the generated configuration
$ /etc/init.d/mysqlrouter restart
or
$ systemctl start mysqlrouter
or
$ mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf
InnoDB Cluster 'myCluster' can be reached by connecting to:
## MySQL Classic protocol
- Read/Write Connections: localhost:6446
- Read/Only Connections: localhost:6447
## MySQL X protocol
- Read/Write Connections: localhost:6448
- Read/Only Connections: localhost:6449
通过输出信息可知:
可能由于我的 Linux 内核版本过低,导致无法使用 systemd 提供的systemctl
命令管理 MySQL Router ,这个在后续其他文章中会加以验证。
所以我选择使用如下命令来启动 MySQL Router :
nohup mysqlrouter 2>&1 >/dev/null &
MySQL Shell 使用listRouters()
查看路由状态。
MySQL ic-source:33060+ ssl JS > cluster.listRouters()
{
"clusterName": "myCluster",
"routers": {
"source::system": {
"hostname": "source",
"lastCheckIn": "2022-12-01 23:00:47",
"roPort": "6447",
"roXPort": "6449",
"rwPort": "6446",
"rwXPort": "6448",
"version": "8.0.31"
}
}
}
在副本服务器上,连接路由器配置的端口验证路由器功能:
使用 mysql 客户端,验证使用 MySQL Classic 协议的 6446 端口可以连接到主实例的 3306 端口上:
[root@ic-replica1 ~]# mysql -u myRouter1 -p -P 6446 -h ic-source
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 275803
Server version: 8.0.31 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select @@hostname,@@port;
+------------+--------+
| @@hostname | @@port |
+------------+--------+
| ic-source | 3306 |
+------------+--------+
1 row in set (0.01 sec)
mysql> \q
Bye
可见,在副本服务器上使用路由配置的 6446 端口可以连接到主实例(原服务器)的 3306 端口。
使用 mysql 客户端,验证使用 MySQL Classic 协议的 6447 端口可以负载均衡连接到次级实例(副本服务器)的 3306 端口上:
[root@ic-replica1 ~]# mysql -u myRouter1 -p -P 6447 -h ic-source
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1081
Server version: 8.0.31 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select @@hostname,@@port;
+-------------+--------+
| @@hostname | @@port |
+-------------+--------+
| ic-replica1 | 3306 |
+-------------+--------+
1 row in set (0.00 sec)
mysql> \q
Bye
[root@ic-replica1 ~]# mysql -u myRouter1 -p -P 6447 -h ic-source
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 79
Server version: 8.0.31 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select @@hostname,@@port;
+-------------+--------+
| @@hostname | @@port |
+-------------+--------+
| ic-replica2 | 3306 |
+-------------+--------+
1 row in set (0.00 sec)
mysql> \q
Bye
使用 mysqlsh 程序,验证使用 MySQL X 协议的 6448 端口可以连接到主实例的 3306 端口上:
[root@ic-replica1 ~]# mysqlsh --sql --quiet-start=2 myRouter1@ic-source:6448
MySQL ic-source:6448+ ssl SQL > select @@hostname,@@port;
+------------+--------+
| @@hostname | @@port |
+------------+--------+
| ic-source | 3306 |
+------------+--------+
1 row in set (0.0010 sec)
MySQL ic-source:6448+ ssl SQL > \q
Bye!
使用 mysqlsh 程序,验证使用 MySQL X 协议的 6449 端口可以负载均衡连接到次级实例(副本服务器)的 3306 端口上:
[root@ic-replica1 ~]# mysqlsh --sql --quiet-start=2 myRouter1@ic-source:6449
MySQL ic-source:6449+ ssl SQL > select @@hostname,@@port;
+-------------+--------+
| @@hostname | @@port |
+-------------+--------+
| ic-replica1 | 3306 |
+-------------+--------+
1 row in set (0.0011 sec)
MySQL ic-source:6449+ ssl SQL > \q
Bye!
[root@ic-replica1 ~]# mysqlsh --sql --quiet-start=2 myRouter1@ic-source:6449
MySQL ic-source:6449+ ssl SQL > select @@hostname,@@port;
+-------------+--------+
| @@hostname | @@port |
+-------------+--------+
| ic-replica2 | 3306 |
+-------------+--------+
1 row in set (0.0023 sec)
MySQL ic-source:6449+ ssl SQL > \q
Bye!
以上便是在 InnoDB Cluster 上简易安装、部署 MySQL Router 的过程。这仅是一个测试用例,在生产环境部署时,需要根据需求做相应调整,比如网络域名、安全认证插件等。
此外,MySQL Shell 的 AdminAPI 提供了沙盒功能用于极简测试环境。沙盒功能仅使用一台服务器就可以部署一个 InnoDB Cluster 集群实例。有关内容,将在后续文章介绍。