通过设置一个带有 InnoDB Cluster 的 Router 沙箱来测试 MySQL Router 安装。在这种情况下,Router 充当中间节点,将客户端连接重定向到服务器列表。如果一个服务器出现故障,客户端将被重定向到列表中的下一个可用服务器。
首先启动三个 MySQL Server。您可以通过多种方式执行此操作,包括
-
使用 InnoDB Cluster 提供的 MySQL Shell AdminAPI 接口。这是推荐的也是最简单的方法,在本节中进行了说明。有关更多信息,请参见 MySQL AdminAPI。
对于脚本方法,请参见 脚本 AdminAPI。
通过在三个不同的主机上或同一个主机上安装三个 MySQL Server 实例。
使用
mysql-test-run.pl
脚本,该脚本是 MySQL 测试套件框架的一部分。有关更多信息,请参见 MySQL 测试套件。
以下示例使用 AdminAPI 方法来设置我们的集群沙箱。这是一个简短的概述,因此请参见 InnoDB Cluster 手册中的 MySQL InnoDB Cluster 以获取更多详细信息。以下假设您已安装当前版本的 MySQL Shell、MySQL Server 和 MySQL Router。
部署沙箱集群
此示例使用 MySQL Shell AdminAPI 来设置一个带有三个 MySQL 实例(一个主实例和两个从实例)的 InnoDB Cluster,以及一个使用生成的配置文件引导的独立 MySQL Router。输出已使用“...”缩短。
$> mysqlsh
mysql-js> dba.deploySandboxInstance(3310)
...
mysql-js> dba.deploySandboxInstance(3320)
...
mysql-js> dba.deploySandboxInstance(3330)
...
mysql-js> \connect root@localhost:3310
...
mysql-js> cluster = dba.createCluster("myCluster")
...
mysql-js> cluster.addInstance("root@localhost:3320")
...
mysql-js> cluster.addInstance("root@localhost:3330")
...
mysql-js> cluster.status()
{
"clusterName": "myCluster",
"defaultReplicaSet": {
"name": "default",
"primary": "127.0.0.1:3310",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"127.0.0.1:3310": {
"address": "127.0.0.1:3310",
"memberRole": "PRIMARY",
"mode": "R/W",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.27"
},
"127.0.0.1:3320": {
"address": "127.0.0.1:3320",
"memberRole": "SECONDARY",
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.27"
},
"127.0.0.1:3330": {
"address": "127.0.0.1:3330",
"memberRole": "SECONDARY",
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.27"
}
},
"topologyMode": "Single-Primary"
},
"groupInformationSourceMember": "127.0.0.1:3310"
}
mysql-js> \q
Bye!
接下来,设置 MySQL Router 以重定向到这些 MySQL 实例。我们将使用引导(使用 --bootstrap
),并使用 --directory
创建一个自包含的 MySQL Router 安装。这使用元数据缓存插件来安全地存储凭据。
$> mysqlrouter --bootstrap root@localhost:3310 --directory /tmp/router
Please enter MySQL password for root:
# Bootstrapping MySQL Router instance at '/tmp/router'...
- 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 /tmp/router/mysqlrouter.conf
# MySQL Router configured for the InnoDB Cluster 'myCluster'
After this MySQL Router has been started with the generated configuration
$ mysqlrouter -c /tmp/router/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
$> cd /tmp/router
$> ./start.sh
MySQL Router 现在已配置并正在运行,并使用我们之前设置的 myCluster 集群。
现在像连接到任何其他 MySQL Server 一样连接到 MySQL Router,方法是连接到配置的 MySQL Router 端口。
以下示例连接到端口 6446 上的 MySQL Router,这是我们为读写连接配置的端口
$> mysql -u root -h 127.0.0.1 -P 6446 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3310 |
+--------+
如上所示,我们使用端口 6446 连接到 MySQL Router,但看到我们连接到端口 3310 上的 MySQL 实例(我们的主实例)。接下来,让我们连接到一个只读 MySQL 实例
$> mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3320 |
+--------+
如上所示,我们使用端口 6447 连接到 MySQL Router,但连接到端口 3320 上的 MySQL 实例,即一个从实例。只读模式默认使用循环策略,其中下一个连接将引用一个不同的从实例
$> mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3330 |
+--------+
如上所示,我们的第二个对端口 6447 的只读连接连接到不同的 MySQL 从实例,在这种情况下连接到端口 3330 而不是 3320。
现在通过首先杀死我们上面连接到的主 MySQL 实例(端口 3310)来测试故障转移。
$> mysqlsh --uri [email protected]:6446
mysql-js> dba.killSandboxInstance(3310)
The MySQL sandbox instance on this host in
/home/philip/mysql-sandboxes/3310 will be killed
Killing MySQL instance...
Instance localhost:3310 successfully killed.
您可以继续使用 MySQL Shell 来检查连接,但让我们使用上面相同的 mysql 客户端示例
$> mysql -u root -h 127.0.0.1 -P 6446 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3320 |
+--------+
$> mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
+--------+
| @@port |
+--------+
| 3330 |
+--------+
如上所示,尽管连接到相同的端口(6446 用于主实例,6447 用于从实例),但底层端口发生了变化。我们的新主服务器已从端口 3310 更改为 3320,而我们的从服务器已从 3320 更改为 3330。
我们现在已证明 MySQL Router 执行对主和从 MySQL 实例列表的简单重定向。
Router 还默认在引导时在生成的 mysqlrouter.conf
中启用 REST API,默认情况下,以下 URL 将显示您本地设置的 swagger.json
:https://127.0.0.1:8443/api/20190715/swagger.json
。另请参见 第 6 章,MySQL Router REST API。