文件生成于:2019-09-13(修订:63490)html
MySQL 路由器是 InnoDB 集群的一部分,是轻量级中间件,可在应用程序和后端 MySQL 服务器之间提供透明路由。它可用于各类用例,例如经过有效地将数据库流量路由到适当的后端 MySQL 服务器来提供高可用性和可伸缩性。可插拔架构还使开发人员可以针对自定义用例扩展 MySQL 路由器。有关用 MySQL 路由器如何构建 InnoDB 群集的其余详细信息,请参阅 InnoDB群集。mysql
强烈建议 MySQL Router 8.0 与 MySQL Server 8.0 或 5.7 版一块儿使用。git
有关详细说明每一个版本中的更改的说明,请参阅 MySQL Router发行说明。github
若是您还没有安装 MySQL Router,请从 下载站点下载。sql
有关使用MySQL的帮助,请访问 MySQL论坛,在那里您能够与其余MySQL用户讨论您的问题。shell
MySQL Router 分商业版本和社区版本,许可信息不太同样。数据库
目录bootstrap
1.1 MySQL InnoDB集群的路由
1.2集群元数据和状态
1.3链接路由
1.4应用注意事项
1.5 MySQL Router 8.0的新功能
MySQL路由器是高可用性(HA)解决方案的构建块。它经过智能地将链接路由到MySQL服务器来简化应用程序开发,从而提升性能和可靠性。后端
MySQL Router 8 彻底支持 MySQL 5.7 和 MySQL 8,它取代了MySQL Router 2.x系列。若是您当前使用的是Router 2.0或2.1,那么咱们建议您将安装升级到MySQL Router 8。缓存
MySQL路由器是InnoDB集群的一部分,是轻量级中间件,可在应用程序和后端MySQL服务器之间提供透明路由。它用于各类用例,例如经过将数据库流量路由到适当的后端MySQL服务器来提供高可用性和可伸缩性。可插拔架构还使开发人员可以针对自定义用例扩展MySQL路由器。
有关Router如何成为InnoDB集群的其余详细信息,请参阅InnoDB集群。
对于客户端应用程序来处理故障转移,他们须要了解InnoDB集群拓扑并知道哪一个MySQL实例是PRIMARY。虽然应用程序能够实现该逻辑,但MySQL路由器能够为您提供和处理此功能。
MySQL使用组复制在多个服务器之间复制数据库,同时在服务器发生故障时执行自动故障转移。当与MySQL InnoDB集群一块儿使用时,MySQL路由器充当代理,以隐藏网络上的多个MySQL实例,并将数据请求映射到其中一个集群实例。只要有足够的在线副本而且组件之间的通讯无缺无损,应用程序就可以联系其中一个。MySQL路由器也可让应用程序链接到MySQL路由器而不是直接链接到MySQL。
使用MySQL InnoDB集群部署路由器
MySQL路由器的推荐部署模型是InnoDB集群,其中Router与应用程序位于同一主机上。
配置集群后,使用InnoDB集群部署MySQL路由器的步骤以下:
Bootstrap InnoDB集群,并进行测试。
Bootstrapping经过使用--bootstrap和其余命令行选项自动为现有InnoDB集群配置MySQL路由器 。在引导期间,路由器链接到群集,获取其元数据,并配置本身使用。Bootstrapping是可选的。
有关其余信息,请参阅 第3章,部署MySQL路由器。
设置MySQL路由器以实现自动启动。
将系统配置为在从新引导主机时自动启动MySQL路由器,该过程相似于MySQL服务器配置为自动启动的过程。有关其余详细信息,请参见 第5.1节“启动MySQL路由器”。
例如,在建立MySQL InnoDB集群后,您可使用如下命令配置MySQL路由器:
shell> mysqlrouter --bootstrap localhost:3310 --directory /opt/myrouter --user snoopy
此示例将MySQL路由器引导至现有的InnoDB集群,其中:
localhost:3310 是InnoDB集群的成员,PRIMARY或引导程序将重定向到集群中的PRIMARY。
因为使用了可选的 --directory引导选项,所以本示例建立一个包含全部生成的目录和文件的自包含安装 /opt/myrouter/。这些文件包括 start.sh,stop.sh, log/,和一个全功能的MySQL路由器配置文件名为 mysqlrouter.conf。
只有主机的系统用户snoopy 才能访问/opt/myrouter/*。
有关--bootstrap修改引导程序配置过程的方法,请参阅相关选项。例如,传入 --conf-use-sockets启用Unix域套接字链接,由于默认状况下仅启用TCP / IP链接。
MySQL路由器经过坐在应用程序和MySQL服务器之间工做。应用程序一般链接到路由器,就好像它们链接到普通的MySQL服务器同样。每当应用程序链接到路由器时,路由器从其知道的候选池中选择合适的MySQL服务器,而后链接到它。从那一刻开始,Router转发应用程序和MySQL之间的全部网络流量,包括从它返回的响应。
MySQL路由器保留在线MySQL服务器的缓存列表,或配置的InnoDB集群的拓扑和状态。最初,当路由器启动时,列表从路由器的配置文件加载。当使用该--bootstrap选项引导路由器时,此列表是使用InnoDB群集服务器生成的 。
为了更新缓存,元数据缓存组件与包含元数据的InnoDB集群服务器之一保持开放链接。它经过从MySQL的性能模式查询元数据数据库和实时状态信息来实现。每当修改InnoDB集群时都会更改集群元数据,例如使用MySQL Shell添加或删除MySQL服务器,而且只要检测到集群状态更改,就会经过MySQL服务器的Group Replication插件实时更新performance_schema表。例如,若是其中一个MySQL服务器出现意外关闭。
当路由器检测到链接的MySQL服务器关闭时,例如由于元数据缓存已丢失其链接而没法再次链接,它会尝试链接到不一样的MySQL服务器以重新的MySQL服务器获取元数据和InnoDB集群状态。
关闭的MySQL服务器的应用程序链接会自动关闭。而后,他们必须从新链接到Router,后者将它们重定向到在线MySQL服务器。
链接路由意味着将MySQL链接重定向到可用的MySQL服务器。MySQL数据包完整路由,无需检查。有关使用基本链接路由的示例部署,请参见 第3.3节“基本链接路由”。
应用程序链接到MySQL路由器而不是直接链接到MySQL服务器,若是链接失败,则应用程序将重试链接,由于MySQL路由器在尝试失败后选择新的MySQL服务器。这也称为简单重定向链接路由,由于它须要应用程序重试链接。也就是说,若是从MySQL路由器到MySQL服务器的链接中断,则应用程序遇到链接失败。可是,新的链接尝试会触发路由器查找并链接到另外一台MySQL服务器。
路由服务器和路由策略在配置文件中定义。例如,如下部分告诉MySQL路由器监听localhost的端口7002上的链接,而后将这些链接重定向到由该destinations选项定义的MySQL实例,包括在本地主机上运行的服务器侦听端口3306,3307和3308。咱们还使用该 routing_strategy选项来使用循环形式的负载平衡。有关其余信息,请参见 第4.3节“配置选项”
[routing:simple_redirect] bind_port = 7002 routing_strategy = round-robin destinations = localhost:3306,localhost:3307,localhost:3308
此示例部分标题为 routing:simple_redirect。第一部分 routing是内部使用的部分名称,用于肯定要加载的插件。第二部分 simple_redirect是可选的部分键,用于区分其余路由策略。
当服务器再也不可访问时,MySQL路由器将移动到列表中的下一个服务器目标,若是列表按照循环策略耗尽,则循环回第一个服务器目标。
注意
在MySQL Router 8.0以前,使用了现已弃用的 mode选项,而不是routing_strategy MySQL Router 8.0中添加的选项。
MySQL路由器使用不须要特定的库或接口。除了管理MySQL路由器实例以外,编写应用程序就像MySQL路由器是典型的MySQL实例同样。
使用MySQL路由器的惟一区别是如何创建与MySQL服务器的链接。必须更新在启动时使用单个MySQL链接而不测试链接错误的应用程序。这是由于MySQL路由器在尝试链接时重定向链接,而且不读取数据包或执行分析。若是MySQL服务器出现故障,Router会将链接错误返回给应用程序。
出于这些缘由,应编写应用程序以测试链接错误,若是遇到,则重试链接。若是在您的应用程序中使用此技术或相似技术,那么使用MySQL路由器将不须要任何额外的努力。
如下内容更好地说明了为何您可能但愿使用MySQL路由器并从应用程序的角度研究它的使用方式。
MySQL路由器有几种可能的场景,包括:
做为开发人员,我但愿个人应用程序链接到服务,以便默认状况下链接到组复制集群的当前主服务器。
做为管理员,我想设置多个服务,以便MySQL路由器在每一个高可用副本集的不一样端口上进行侦听。
做为管理员,我但愿可以在端口3306上运行链接路由服务,以使其对用户或应用程序更加透明。
做为管理员,我想为每一个链接路由服务配置一个模式,以便指定是返回主服务器仍是辅助服务器。
MySQL路由器的工做流程
使用MySQL路由器的工做流程以下:
路由器检查可用的MySQL服务器。
应用程序链接到MySQL路由器,路由器将应用程序链接到可用的MySQL服务器。
此示例演示链接是否透明地链接到其中一个InnoDB集群实例。由于此示例使用沙盒InnoDB集群,其中全部实例都在同一主机上运行,因此咱们检查port 状态变量以查看链接了哪一个MySQL实例。
使用MySQL客户端链接MySQL路由器,例如:
shell> mysql -u root -h 127.0.0.1 -P 6446 -p
这些端口号取决于您的配置,但在此示例中比较端口:
mysql> select @@port; +--------+ | @@port | +--------+ | 3310 | +--------+ 1 row in set (0.00 sec)
总而言之,客户端(应用程序)链接到端口6446但链接到端口3310上的MySQL实例。
如下是使用MySQL路由器的建议。
在与应用程序相同的主机上安装并运行MySQL Router。有关缘由的列表,请参阅 第3章,部署MySQL路由器。
bind_port = 127.0.0.1:<port>在配置文件中 使用路由器绑定到localhost 。或者,在Linux上,禁用TCP链接(请参阅参考资料 --conf-skip-tcp)并将其限制为仅使用Unix套接字链接(请参阅参考资料 --conf-use-sockets)。
本节总结了MySQL Router 8.0中添加的许多与MySQL Router 2.1相关的新功能。
MySQL Router 8.0.3是第一个使用新编号的8.0.x版本,是MySQL Router 2.1.4的后续版本。
MySQL链接器和其余MySQL客户端工具和应用程序如今将其版本号的第一个数字与它们支持的(最高)MySQL服务器版本同步。此更改使您能够轻松直观地肯定要将哪一个客户端版本用于哪一个服务器版本。一样,MySQL路由器如今使用与MySQL服务器相同的版本号。
routing_strategy 添加了 可选 配置选项。可用的值是 first-available, next-available, round-robin,和 round-robin-with-fallback。
之前,这些策略经过mode配置选项描述为调度模式,其中读写模式默认为第一个可用策略,而只读模式默认为循环策略。这保留了这些模式的先前行为。
在--ssl-key和 --ssl-cert可选的引导命令行选项添加。他们直接使用MySQL客户端的对应方,并指定客户端证书和私钥以方便客户端身份验证。当在引导期间使用的root账户是使用REQUIRE X509建立时,这颇有用,这须要客户端在登陆时进行身份验证。
添加了 新的 connect_timeout 和 read_timeout元数据配置文件选项。它们在[DEFAULT]命名空间下定义,并影响内部操做,例如元数据服务器链接。
Bootstrap如今接受InnoDB集群的任何成员,并自动查找并从新链接到可写主服务器。之前,只接受了初级。
Bootstrap如今接受该 --config选项并读取[logger] level 选项的定义。
最大并发客户端链接数从大约500增长到超过5000,这个限制如今取决于操做系统。为此,基于select()的fd事件调用被poll()(或Windows上的WSAPoll())取代。
添加了 一个新的mysqlrouter_plugin_info实用程序来帮助调试MySQL路由器插件。它提供了诸如插件版本,描述,ABI版本,要求和函数指针之类的信息。
有关MySQL Router 8.0中引入的全部更改的完整列表,请参阅 MySQL Router 8.0发行说明
2.1在Linux上安装MySQL路由器
2.2在macOS上安装MySQL路由器
2.3在Windows上安装MySQL路由器
2.4从源代码安装MySQL路由器
本章介绍如何获取和安装MySQL路由器。可从 下载站点下载。
MySQL路由器的二进制发行版可用于几种Linux版本,包括Fedora,Oracle Linux,Red Hat和Ubuntu。
安装选项包括:
官方MySQL Yum或APT存储库包:这些二进制文件由MySQL Release团队构建。有关安装这些的详细信息,请参阅使用 Yum 或 APT安装它们的快速指南 。
下载官方MySQL软件包:可从 https://dev.mysql.com/downloa... 。使用首选软件包管理器下载并安装。
或者,从MySQL路由器8.0.13开始,MySQL路由器包含在MySQL服务器的源和单片二进制包中。
下载源代码并自行编译:源代码可在 https://dev.mysql.com/downloa... tar.gzRPM或RPM包的形式得到。或者,源代码也 能够在GitHub上得到。
有关编译MySQL路由器的信息,请参阅 从源代码安装MySQL路由器。
在Linux上安装的过程取决于您的Linux发行版。
使用官方DEB或RPM软件包安装MySQL路由器会在MySQL路由器默认运行的主机上建立一个名为“mysqlrouter”的本地系统用户和组。有关其余信息,请参阅系统 user的配置选项。
安装DEB包
在Ubuntu和其余使用Debian软件包方案的系统上,您能够下载并安装.deb软件包或使用APT软件包管理器。
使用APT包管理器
按照MySQL APT Repository文档中的描述安装MySQL APT存储 库。例如:
注意
从这里下载APT配置包 。
shell> sudo dpkg -i mysql-apt-config_0.8.8-1_all.deb
在配置屏幕上启用“MySQL工具和链接器”。
更新您的APT存储库:
shell> sudo apt-get update
安装MySQL路由器。例如:
shell> sudo apt-get install mysql-router
手动安装包
您也能够下载.deb软件包并从命令行安装它
shell> sudo dpkg -i package.deb
package.deb是MySQL路由器包名称; 例如, MySQL路由器版本号在哪里。 mysql-router-version-1ubu1604-amd64.debversion
安装RPM包
在基于RPM的系统上,您能够下载并安装RPM软件包,也可使用Yum软件包管理器。
使用Yum Package Manager
首先,按照MySQL Yum Repository文档中的描述安装MySQL Yum存储 库。例如:
注意
从这里下载Yum配置包 。
shell> sudo rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
接下来,安装MySQL路由器。例如:
shell> sudo yum install mysql-router
手动安装RPM包
shell> sudo rpm -i package.rpm
package.rpm是MySQL路由器包名称; 例如, MySQL路由器版本号在哪里。 mysql-router-version-el7.x86_64.rpmversion
卸载
在Linux上卸载MySQL路由器的过程取决于您使用的软件包。
卸载DEB包
要卸载Debian软件包,请使用如下命令:
shell> sudo dpkg -r mysql-router
此命令不会删除配置文件。要删除它们和数据目录,请使用:
shell> sudo dpkg --purge mysql-router
注意
或者,使用apt-get remove mysql-router或apt-get purge mysql-router。
卸载RPM包
要卸载RPM软件包,请使用如下命令:
shell> sudo rpm -e mysql-router
注意
一样,使用yum remove mysql-router。
此命令不会删除配置文件。
什么不被删除
不清除时,卸载过程不会删除配置文件。在Debian系统上,这可能包括如下文件:
/etc/init.d/mysqlrouter /etc/mysqlrouter/mysqlrouter.conf /etc/apparmor.d/usr.sbin.mysqlrouter
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链接器和应用程序。
经过使用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':
X protocol connections to cluster 'myCluster':
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实例的列表。
该链接路由插件执行基于链接的路由,这意味着它的数据包转发到服务器,而不检查它们。这是一种提供高吞吐量的简单方法。有关链接路由的其余常规信息,请参见 第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。