第3章部署MySQL路由器
目录
3.1引导MySQL路由器
3.2在沙盒中试用MySQL路由器
3.3基本连接路由
绩效建议
为了获得最佳性能,MySQL路由器通常与使用它的应用程序安装在同一主机上。可能的原因包括:
允许本地UNIX域套接字连接到应用程序,而不是TCP / IP。
注意
Unix域套接字可以与连接到MySQL路由器的应用程序一起使用,但不适用于连接到MySQL服务器的MySQL路由器。
减少网络延迟。
允许MySQL路由器连接到MySQL,而不需要为路由器的主机提供额外的帐户,对于专门为应用程序主机创建的MySQL帐户,例如 myapp@198.51.100.45而不是像myapp @%这样的值 。
通常,应用程序服务器最容易扩展。
您可以在网络上运行多个MySQL路由器实例,而无需将MySQL路由器隔离到单个计算机上。这是因为MySQL路由器对任何特定服务器或主机都没有亲和力。
图3.1 MySQL路由器部署示例
示例部署显示了一个中央组复制和高可用性设置,其中有三个实体指向或连接到它:MySQL Shell和两个堆栈,每个堆栈包括MySQL路由器,MySQL连接器和应用程序。
3.2在沙盒中试用MySQL路由器
通过使用InnoDB集群设置路由器沙箱来测试MySQL路由器安装。在这种情况下,路由器充当中间节点,将客户端连接重定向到服务器列表。如果一台服务器出现故障,客户端将重定向到列表中的下一个可用服务器。
设置MySQL服务器沙箱
首先启动三个MySQL服务器。您可以通过多种方式执行此操作,包括:
使用InnoDB集群提供的MySQL Shell AdminAPI接口。这是推荐且最简单的方法,本节将对此进行介绍。有关其他信息,请参阅 InnoDB Cluster。
有关脚本方法,请参阅 Scripting AdminAPI或 https://github.com/mattlord/D...。
通过在三个不同的主机上或在同一主机上安装三个MySQL Server实例。
使用mysql-test-run.plMySQL Test Suite框架中的脚本。有关其他信息,请参阅MySQL测试套件。
使用mysqlcloneserver MySQL实用程序。
以下示例使用AdminAPI方法设置我们的群集沙箱。这是一个简要的概述,请参阅 InnoDB集群手册中的InnoDB Cluster的Sandbox部署以获取更多详细信息。以下假设您安装了当前版本的MySQL Shell,MySQL Server和MySQL Router。
部署沙箱群集
此示例使用MySQL Shell AdminAPI来设置具有三个MySQL实例(一个主要和两个辅助实例)的InnoDB集群,以及带有生成配置文件的自举独立MySQL路由器。使用“......”缩短输出。
shell> 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": "localhost:3310", "ssl": "REQUIRED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "localhost:3310": { "address": "localhost:3310", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "localhost:3320": { "address": "localhost:3320", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "localhost:3330": { "address": "localhost:3330", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } }, "groupInformationSourceMember": "mysql://root@localhost:3310" } mysql-js> q Bye!
设置路由器
接下来,设置MySQL Router以重定向到这些MySQL实例。我们将使用bootstrapping(using --bootstrap),并使用 创建一个独立的MySQL路由器安装 --directory。这使用元数据缓存插件来安全地存储凭据。
shell> mysqlrouter --bootstrap root@localhost:3310 --directory /tmp/myrouter
Please enter MySQL password for root:
Bootstrapping MySQL Router instance at '/tmp/mysqlrouter'...
MySQL Router has now been configured for the InnoDB cluster 'myCluster'.
The following connection information can be used to connect to the cluster.
Classic MySQL protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:6446
- Read/Only Connections: localhost:6447
X protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:64460
- Read/Only Connections: localhost:64470
shell> cd /tmp/myrouter
shell> ./start.sh
MySQL路由器现已配置并运行,并且正在使用我们之前设置的 myCluster集群。
测试路由器
现在通过连接到配置的MySQL路由器端口,像连接任何其他MySQL服务器一样连接到
MySQL路由器。
以下示例连接到端口6446上的MySQL路由器,我们为读写连接配置的端口:
shell> mysql -u root -h 127.0.0.1 -P 6446 -p
mysql> SELECT @@port;
@@port |
3310 |
如图所示,我们使用端口6446连接到MySQL路由器,但是看到我们连接到端口3310(我们的PRIMARY)上的MySQL实例。接下来让我们连接到一个只读的MySQL实例:
shell> mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
@@port |
3320 |
如图所示,我们使用端口6447连接到MySQL路由器,但是看到我们连接到端口3320(我们的辅助设备之一)上的MySQL实例。只读模式默认为循环策略,其中下一个连接引用不同的辅助:
shell> mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
@@port |
3330 |
如图所示,我们与端口6447的第二个只读连接连接到不同的MySQL辅助节点,在这种情况下连接到端口3330而不是3320。
现在通过首先杀死我们连接到上面的主MySQL实例(端口3310)来测试故障转移。
shell> mysqlsh --uri root@127.0.0.1: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客户端示例:
shell> mysql -u root -h 127.0.0.1 -P 6446 -p
mysql> SELECT @@port;
@@port |
3320 |
shell> mysql -u root -h 127.0.0.1 -P 6447 -p
mysql> SELECT @@port;
@@port |
3330 |
如图所示,尽管连接到相同的端口(主端口为6446,辅助端口为6447),但底层端口已更改。我们的新主服务器从端口3310更改为3320,而我们的辅助服务器从3320更改为3330。
我们现在已经演示了MySQL路由器执行简单的重定向到主要和次要MySQL实例的列表。
3.3基本连接路由
该连接路由插件执行基于连接的路由,这意味着它的数据包转发到服务器,而不检查它们。这是一种提供高吞吐量的简单方法。有关连接路由的其他常规信息,请参见 第1.3节“连接路由”。
一个简单的基于连接的路由设置如下所示。第4.3.2节“配置文件选项”中介绍了这些和其他选项 。
[logger] level = INFO [routing:secondary] bind_address = localhost bind_port = 7001 destinations = foo.example.org:3306,bar.example.org:3306,baz.example.org:3306 routing_strategy = round-robin [routing:primary] bind_address = localhost bind_port = 7002 destinations = foo.example.org:3306,bar.example.org:3306 routing_strategy = first-available
在这里,我们使用连接路由来循环MySQL连接到端口7001上的三个MySQL服务器,如循环法 所定义 routing_strategy。此示例还使用端口7002为两个服务器配置第一个可用策略。第一个可用策略使用目标列表中的第一个可用服务器。分配给每个实例的MySQL实例数 destinations取决于您,因为这只是一个示例。路由器不会检查数据包,也不会根据分配的策略或模式限制连接,因此应用程序可以确定在何处发送读取和写入请求,在我们的示例中为端口7001或7002。
注意在MySQL Router 8.0之前,使用了现已弃用的 mode选项,而不是routing_strategy MySQL Router 8.0中添加的选项。
假设所有三个MySQL实例都在运行,接下来通过传入配置文件启动MySQL路由器:
shell> ./bin/mysqlrouter -config=/etc/mysqlrouter-config.conf
现在,MySQL路由器正在侦听端口7001和7002,并将请求发送到适当的MySQL实例。例如:
shell> ./bin/mysql --user=root --port 7001 --protocol=TCP
首先连接到foo.example.org,然后是bar.example.org,然后是baz.example.org,第四个调用将返回foo.example.org。相反,我们以不同方式配置端口7002的行为:
shell> ./bin/mysql --user=root --port 7002 --protocol=TCP
首先连接到foo.example.org,其他请求将继续连接到foo.example.org,直到出现故障,此时bar.example.org现在被使用。有关此行为的其他信息,请参阅 mode。