【MySQL】——mysql 中间件mysql-router

一、前言

       MySQL Router最早是作为MySQL-Proxy的替代方案出现的。作为一个轻量级中间件,MySQL Router可在应用程序和后端MySQL服务器之间提供透明路由和负载均衡,从而有效提高MySQL数据库服务的高可用性与可伸缩行。MySQL Router 2.0是其初始版本,适用于MySQL Fabric用户,但已被弃用,不再支持。MySQL Router 2.1为支持MySQL InnoDB Cluster而引入,MySQL Router 8.0则是MySQL Router 2.1上的扩展,版本号与MySQL服务器版本号保持一致。即Router 2.1.5作为Router 8.0.3(以及MySQL Server 8.0.3)发布,2.1.x分支被8.0.x取代。这两个分支完全兼容。当前最新版本为8.0.17,MySQL强烈建议使用Router 8与MySQL Server 8和5.7一起使用。

较之以前2.x版本,MySQL Router 8.0新增了如下主要功能:

  • 添加了可选的routing_strategy配置选项。可用值为first-available、next-available、round-robin和round-robin-with-fallback。以前版本中,这些策略对应mode选项中的调度模式,其中read-write对应first-available,而read-only对应round-robin。它们保留了这些模式的先前行为。
  • 添加了--ssl-key和--ssl-cert命令行选项,指定客户端证书和私钥以方便客户端身份验证。用于使用REQUIRE X509创建root帐户时。
  • 添加了connect_timeout和read_timeout元数据配置文件选项。它们在[DEFAULT]命名空间下定义,并影响元数据服务器连接等内部操作。
  • Bootstrap接受InnoDB Cluster的任何成员,并自动查找并重新连接到可写服务器。以前只接受主库。
  • Bootstrap接受--config选项并读取[logger]级别选项的定义。
  • 最大并发客户端连接数从500增加到5000。
  • 添加了一个新的mysqlrouter_plugin_info实用程序来帮助调试MySQL Router插件。

二、mysql router架构

  • MySQL Router是处于应用client和dbserver之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给client。是mysql-proxy的一个替代品。
  • Router实现读写分离,程序不是直接连接数据库IP,而是固定连接到mysql router。MySQL Router对前端应用是透明的。应用程序把MySQL Router当作是普通的mysql实例,把查询发给MySQL Router,而MySQL Router会把查询结果返回给前端的应用程序。
  • 从数据库服务器故障,业务可以正常运行。由MySQL Router来进行自动下线不可用服务器。程序配置不需要任何修改。
  • 主数据库故障,由MySQL Router来决定主从自动切换,业务可以正常访问。程序配置不需要做任何修改。
  • MySQL Router接受前端应用程序请求后,根据不同的端口来区分读写,把连接读写端口的所有查询发往主库,把连接只读端口的select查询以轮询方式发往多个从库,从而实现读写分离的目的。读写返回的结果会交给MySQL Router,由MySQL Router返回给客户端的应用程序。

 三、mysql 功能

1. 透明路由

        MySQL Router通过智能地将客户端连接路由到MySQL服务器来简化应用程序开发。MySQL使用组复制在多个服务器之间复制数据,当服务器发生故障时执行自动故障转移,基于paxos协议在剩余实例中选举一个新的主库。这里存在一个问题,如果应用程序直连主库,当发生主库切换时可用的数据库IP地址发生变化,客户端应用程序必须自行修改它的连接配置。这种方案极不现实,因为需要应用程序了解组复制的拓扑结构并知道哪个MySQL实例是主库,对于应用程序显然是强人所难,这些处理逻辑本应对应用透明。而这正是MySQL Router的用武之地。当与InnoDB Cluster一起使用时,MySQL Router充当代理,向应用程序隐藏网络上的多个MySQL实例,并将数据请求映射到其中一个集群实例。只要有足够的在线副本并且组件之间的通信完好无损,客户端就能够连接其中一个实例,保持对外服务的连续性。应用程序要做的只是连接到Router,而不是直连MySQL数据库实例,其它的交给Router处理即可。

       MySQL Router的推荐部署模型是与InnoDB Cluster集成,其中Router与应用程序最好位于同一主机上。

2. 元数据缓存

      MySQL Router处于应用程序和MySQL服务器之间。当应用程序连接到Router时,Router从其候选池中选择合适的MySQL服务器连接,此后Router转发应用程序和MySQL之间的所有往返网络流量。MySQL Router保留在线MySQL服务器的缓存列表,或配置的InnoDB Cluster的拓扑和状态。Router启动时,列表从Router的配置文件加载。当使用--bootstrap选项引导Router时,此列表由InnoDB群集服务器生成。为了更新缓存,Router元数据缓存组件与包含元数据的InnoDB Cluster服务器之一保持连接,通过从该MySQL实例的performance_schema库表查询元数据和实时状态信息来实现。每当修改InnoDB集群时都会更改集群元数据,并且只要检测到集群状态更改,就会通过MySQL服务器的Group Replication插件实时更新performance_schema库表。

当Router检测到连接的MySQL服务器关闭时,它会尝试连接到不同的MySQL服务器以从新的服务器获取元数据和InnoDB Cluster状态。关闭的MySQL服务器的应用程序连接会自动关闭。应用程序必须重新连接到Router,这要求应用程序实现重连机制。Router将它们重定向到在线MySQL服务器。

3. 简单重定向

      Router将MySQL连接重定向到可用的MySQL服务器,这意味着数据包是在未经检查的情况下整体路由的。如果连接失败,应用程序须要重试连接,MySQL Router在尝试连接失败后选择新的MySQL服务器。这被称为简单重定向连接路由,因为它需要应用程序重试连接。也就是说,如果从MySQL Router到MySQL服务器的连接中断,则应用程序会遇到连接失败,但新的连接尝试会触发Router查找并连接到另一台MySQL服务器。路由连接的服务器和路由策略在配置文件中定义。使用MySQL Router不需要特定的库或接口,与不使用Router相比,应用程序所感知的唯一区别是如何建立与MySQL服务器的连接。因为MySQL Router在尝试连接时只是单纯重定向,并不读取数据包或执行分析,所以应用程序需要捕获连接错误并重试连接到Router。

使用MySQL Router的工作流程如下:

  1. MySQL客户端连接到MySQL Router。
  2. Router检查可用的MySQL服务器。
  3. Router打开一个适用MySQL服务器的连接。
  4. Router在应用程序和MySQL服务器之间来回转发数据包
  5. 如果连接的MySQL服务器出现故障, Router将断开连接。当应用程序重试连接到Router时,Router选择另一个可用MySQL服务器。

部署MySQL Router时建议但不强制遵循两点:

  • 在与应用程序相同的主机上安装并运行MySQL Router。
  • 使用配置文件中的bind_port = 127.0.0.1:<port>将 Router绑定到localhost,或者禁用TCP连接(--conf-skip-tcp)并将其限制为仅使用Unix套接字连接(--conf-use-sockets)。

建议主要出于性能考虑。每当在网络中引入通信组件时,都会产生一定的开销,并且会受到工作负载的严重影响。幸运的是,MySQL Router的性能影响非常小。官方文档显示,当前版本的简单重定向连接路由,其速度与直连数据库相比仅慢约1%。

四、mysql router使用

1、配置请参考博文链接

2、配置完成后登陆数据库查看mysql_innodb_cluster_metadata这个库的数据

mysql> use mysql_innodb_cluster_metadata;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------------------------------+
| Tables_in_mysql_innodb_cluster_metadata |
+-----------------------------------------+
| clusters                                |
| hosts                                   |
| instances                               |
| replicasets                             |
| routers                                 |
| schema_version                          |
+-----------------------------------------+
6 rows in set (0.00 sec)

mysql> select * from hosts;
+---------+------------------------------+------------+-------------------+----------+------------------------------------+--------------------+
| host_id | host_name                    | ip_address | public_ip_address | location | attributes                         | admin_user_account |
+---------+------------------------------+------------+-------------------+----------+------------------------------------+--------------------+
|       7 | npgam-0.npgam-gvr.276        |            | NULL              |          | NULL                               | NULL               |
|      14 | npgam-1.npgam-gvr.276        |            | NULL              |          | NULL                               | NULL               |
|      21 | npgam-2.npgam-gvr.276        |            | NULL              |          | NULL                               | NULL               |
|      28 | npgam-router-7f76cff56-xj7xl | NULL       | NULL              |          | {"registeredFrom": "mysql-router"} | NULL               |
+---------+------------------------------+------------+-------------------+----------+------------------------------------+--------------------+
4 rows in set (0.00 sec)

mysql> select * from replicasets;
+---------------+------------+-----------------+---------------+-----------------+--------+------------------------------------------------------------------------------------------+-------------+
| replicaset_id | cluster_id | replicaset_type | topology_type | replicaset_name | active | attributes                                                                               | description |
+---------------+------------+-----------------+---------------+-----------------+--------+------------------------------------------------------------------------------------------+-------------+
|             7 |          7 | gr              | pm            | default         |      1 | {"adopted": "1", "group_replication_group_name": "f76fc779-12fe-4a3f-97c8-f51bcb332069"} | NULL        |
+---------------+------------+-----------------+---------------+-----------------+--------+------------------------------------------------------------------------------------------+-------------+
1 row in set (0.00 sec)

mysql> select * from routers;
+-----------+-------------+---------+------------+
| router_id | router_name | host_id | attributes |
+-----------+-------------+---------+------------+
|         7 |             |      28 | NULL       |
+-----------+-------------+---------+------------+
1 row in set (0.00 sec)

mysql> select * from clusters;
+------------+--------------+--------------------+-----------------+---------------------+---------+-------------------+
| cluster_id | cluster_name | default_replicaset | description     | mysql_user_accounts | options | attributes        |
+------------+--------------+--------------------+-----------------+---------------------+---------+-------------------+
|          7 | npgam        |                  7 | Default Cluster | NULL                | null    | {"default": true} |
+------------+--------------+--------------------+-----------------+---------------------+---------+-------------------+
1 row in set (0.00 sec)

mysql>

三、配置

        MySQL Router启动时可以从配置文件、扩展配置文件、命令行选项三个地方获取配置信息。本节说明MySQL Router配置文件的位置、配置文件语法和配置选项。

1. 配置文件位置

(1)缺省配置文件
        MySQL Router在启动时扫描缺省配置文件,并可选择在运行时从命令行加载用户定义的配置文件。默认情况下,MySQL Router扫描依赖于操作系统的特定位置以查找配置文件。执行mysqlrouter --help可以查看系统上的缺省配置文件位置:

[mysql@hdp1~]$mysqlrouter --help | more
MySQL Router  Ver 8.0.17 for linux-glibc2.12 on x86_64 (MySQL Community - GPL)
Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Configuration read from the following files in the given order (enclosed
in parentheses means not available for reading):
  (/home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/.././mysqlrouter.conf)
  (/home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/.././mysqlrouter.ini)
  /home/mysql/.mysqlrouter.conf
  (/home/mysql/.mysqlrouter.ini)
Plugins Path:
  /home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/lib/mysqlrouter
 
Default Log Directory:
  /home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64
 
Default Persistent Data Directory:
  /home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/../var/lib/mysqlrouter
 
Default Runtime State Directory:
  /home/mysql/mysql-router-8.0.17-linux-glibc2.12-x86_64/bin/../run
 
...

        从帮助信息的开始部分可以看到MySQL Router查找的缺省配置文件和查找顺序。括号中的文件不可用,这里只有/home/mysql/.mysqlrouter.conf一个可用缺省配置文件。注意,如果使用-c或--config选项传入用户定义的配置文件,则不会加载缺省配置文件。

(2)用户定义和扩展配置文件
        用户定义配置文件由-c或--config命令行选项指定,扩展配置文件由-a或--extra-config命令行选项指定。从缺省配置文件或使用--config选项指定的文件读取配置后,读取扩展配置文件:

shell> mysqlrouter --config /custom/path/to/router.conf --extra-config /another/config.conf

可以传入多个扩展配置选项,并按照输入的顺序加载文件:

shell> mysqlrouter --config b.conf --extra-config a.conf --extra-config c.conf

在上面的示例中,首先加载b.conf,然后按顺序加载a.conf和c.conf。此外由于使用了--config,不会加载缺省配置文件。每个加载的配置文件都会覆盖先前读取的配置文件中的设置。

2. 配置文件语法

        MySQL Router配置文件格式类似于MySQL服务器的配置文件,符合传统INI文件格式,其中包含多个段,每个段中包含多个选项。选项中的目录支持支持正斜杠和反斜杠,反斜杠无条件复制而不是转义字符。配置文件可以包含注释行,注释行以井号(#)或分号(;)开头,并继续到行尾。注意只支持整行注释,不支持行中、行尾注释。(1)段
每个配置文件都包含一个配置段列表,其中每个段包含一系列配置选项,每个配置选项都有名称和值,例如:

[section name]
option = value
option = value
option = value
 
[section name:optional section key]
option = value
option = value
option = value

        中括号中的是段名和可选的段键,段名与段键之间用冒号(:)分隔。段名和段键的组合对于配置是唯一的,中括号内不能有首尾空格。段名与段键由一个或多个字母、数字或下划线(_)的序列组成,不允许使用其它字符。

        段类似于命名空间。例如user选项,其含义取决于其关联的段。[DEFAULT]段中的user指的是运行MySQL Router的系统用户,该用户也受--user命令行选项控制。[metadata_cache]段中定义的user,指的是访问MySQL服务器元数据的MySQL用户。

        下面列举几个主要的段:

  • [DEFAULT]:DEFAULT是一个特殊的段,用于选项缺省值,在该段中查找其它段中没出现的选项,通常配置扩展配置文件的目录、日志的目录、MySQL Router运行时的目录(如pid文件)等。DEFAULT段不接受段键。
  • [logger]:logger段只有一个选项,设置日志的记录级别。
  • [routing:NAME]:该段是MySQL Router主要配置部分,设置不同的路由实例,其中NAME是自定义的段键名。

(2)选项

        在段名之后,可以有一个零或多个选项行,其中每个选项行的形式如下:

name = value

        处理之前将删除选项名称或选项值上的任何首尾空格。选项名称不区分大小写。选项值支持在大括号中引用选项名称,作为变量插入值。变量引用值是在检索选项值时完成的,而不是在读取配置文件时。如果变量未定义,则不进行替换,并按字面读取选项值。考虑下面的示例配置文件:

[DEFAULT]
prefix = /usr/
 
[sample]
bin = {prefix}bin/{name}
lib = {prefix}lib/{name}
name = magic
directory = /data/{mysqlrouterdata}

这里bin的值是“/usr/bin/magic”,lib的值是“/usr/lib/magic”。由于未定义名为“{mysqlrouterdata}”的变量,directory的值是“/data/{mysqlrouterdata}”。

        MySQL Router定义了配置文件可用的如下预定义变量。变量使用大括号,例如{program}作为Router可执行程序预定义变量。

  • program:程序的名称,通常是mysqlrouter。
  • origin:二进制文件所在目录。
  • logging_folder:日志文件所在目录。
  • plugin_folder:插件文件所在目录。
  • runtime_folder:运行时数据文件所在目录。
  • config_folder:配置文件所在目录。

3. 配置文件示例

        启动时,MySQL Router会读取配置文件列表,这些配置文件一起构成Router的配置。至少需要一个配置文件,否则启动Router时会报 Error: No valid configuration file available 错误。下面是一个名为mycluster的MySQL InnoDB cluster的基本连接路由示例,读写流量发送到6446端口,只读访问使用6447端口。

[DEFAULT]
logging_folder=/opt/routers/myrouter/log
runtime_folder=/opt/routers/myrouter/run
data_folder=/opt/routers/myrouter/data
connect_timeout=30
read_timeout=30
 
[logger]
level = INFO
 
[metadata_cache:mycluster]
router_id=5
bootstrap_server_addresses=mysql://localhost:3310,mysql://localhost:3320,mysql://localhost:3330
user=mysql_router
metadata_cluster=mycluster
ttl=5
 
[routing:mycluster_default_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://mycluster/default?role=PRIMARY
routing_strategy=round-robin
 
[routing:mycluster_default_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://mycluster/default?role=SECONDARY
routing_strategy=round-robin

        该配置中定义了五个段:

  • [DEFAULT]中定义了数据文件目录、日志文件目录、运行时文件目录的位置,以及连接和读取MySQL元数据服务器的超时时间为30秒。
  • [logger]中定义日志级别为info,可选值有info、debug、warning、error、fatal,不区分大小写。
  • [metadata_cache:mycluster]中定义MySQL服务器元数据访问信息:router_id是整型的路由ID。bootstrap_server_addresses是逗号分隔的InnoDB cluster中的MySQL实例。user定义访问元数据的用户。metadata_cluster定义InnoDB cluster名称。ttl定义缓存时间为5秒。
  • [routing:mycluster_default_rw]和[routing:mycluster_default_ro]分别定义读写路由和只读路由。bind_address指定路由使用本机IP地址。配置文件中的bind_address选项只接受一个地址,但是可以使用bind_addres = 0.0.0.0绑定到localhost上的所有地址。bind_port指定客户端连接Router使用的端口。destinations引用由metadata-cache定义的目标地址,以利用InnoDB Cluster的元数据缓存来动态配置主机信息。如果不使用InnoDB Cluster,destinations可以指定为逗号分隔的IP:port地址,但bind_address中的地址不能出现在destinations列表中。routing_strategy定义路由策略,本例中读写和只读均为循环访问三个节点。

        配置选项的完整说明,参见https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-conf-options.html

五、参考资料

【1】官方文档

【2】博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值