• GreatSQL社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。

[toc]

本文介绍如何在MGR集群前端部署MySQL Router以实现读写拆散、读负载平衡,以及故障主动转移。

MySQL Router是一个轻量级的中间件,它采纳多端口的计划实现读写拆散以及读负载平衡,而且同时反对mysql和mysql x协定。

倡议把MySQL Router部署在应用服务器上,每个应用服务器都部署一套,这样应用程序能够间接连贯本机IP,连贯的效率更高,而且后端数据库发生变化时,程序端也无需批改IP配置。

1. 部署MySQL Router

MySQL Router第一次启动时要先初始化:

##参数解释# 参数 --bootstrap 示意开始初始化# 参数 GreatSQL@172.16.16.10:3306 是MGR服务专用账号# --user=mysqlrouter 是运行mysqlrouter过程的零碎用户名#$ mysqlrouter --bootstrap GreatSQL@172.16.16.10:3306 --user=mysqlrouterPlease enter MySQL password for GreatSQL:   <-- 输出明码# 而后mysqlrouter开始主动进行初始化# 它会主动读取MGR的元数据信息,主动生成配置文件Please enter MySQL password for GreatSQL:# Bootstrapping system MySQL Router instance...- Creating account(s) (only those that are needed, if any)- Using existing certificates from the '/var/lib/mysqlrouter' directory- 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# MySQL Router configured for the InnoDB Cluster 'MGR1'After this MySQL Router has been started with the generated configuration    $ /etc/init.d/mysqlrouter restartor    $ systemctl start mysqlrouteror    $ mysqlrouter -c /etc/mysqlrouter/mysqlrouter.confthe cluster 'MGR1' can be reached by connecting to:## MySQL Classic protocol  <-- MySQL协定的两个端口- Read/Write Connections: localhost:6446- Read/Only Connections:  localhost:6447## MySQL X protocol  <-- MySQL X协定的两个端口- Read/Write Connections: localhost:6448- Read/Only Connections:  localhost:6449

如果想自定义名字和目录,还能够在初始化时自行指定 --name--directory 选项,这样能够实现在同一个服务器上部署多个Router实例,参考这篇文章:MySQL Router能够在同一个零碎环境下跑多实例吗

2. 启动mysqlrouter服务

这就初始化结束了,依照下面的提醒,间接启动 mysqlrouter 服务即可:

[root@greatsql]# systemctl start mysqlrouter[root@greatsql]# ps -ef | grep -v grep | grep mysqlroutermysqlro+  6026     1  5 09:28 ?        00:00:00 /usr/bin/mysqlrouter[root@greatsql]# netstat -lntp | grep mysqlroutertcp        0      0 0.0.0.0:6446            0.0.0.0:*               LISTEN      6026/mysqlroutertcp        0      0 0.0.0.0:6447            0.0.0.0:*               LISTEN      6026/mysqlroutertcp        0      0 0.0.0.0:6448            0.0.0.0:*               LISTEN      6026/mysqlroutertcp        0      0 0.0.0.0:6449            0.0.0.0:*               LISTEN      6026/mysqlroutertcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      6026/mysqlrouter

能够看到 mysqlrouter 服务失常启动了。

mysqlrouter 初始化时主动生成的配置文件是 /etc/mysqlrouter/mysqlrouter.conf,次要是对于R/W、RO不同端口的配置,例如:

[routing:greatsqlMGR_rw]bind_address=0.0.0.0bind_port=6446destinations=metadata-cache://greatsqlMGR/?role=PRIMARYrouting_strategy=first-availableprotocol=classic

能够依据须要自行批改绑定的IP地址和端口,也能够在初始化时指定 --conf-base-port 选项自定义初始端口号。

3. 确认读写拆散成果

当初,用客户端连贯到6446(读写)端口,确认连贯的是PRIMARY节点:

$ mysql -h172.16.16.10 -u GreatSQL -p -P6446Enter password:...#记住上面几个 MEMBER_IDmysql> select MEMBER_ID,MEMBER_ROLE from performance_schema.replication_group_members;+--------------------------------------+-------------+| MEMBER_ID                            | MEMBER_ROLE |+--------------------------------------+-------------+| 4ebd3504-11d9-11ec-8f92-70b5e873a570 | PRIMARY     || 549b92bf-11d9-11ec-88e1-70b5e873a570 | SECONDARY   || 5596116c-11d9-11ec-8624-70b5e873a570 | SECONDARY   |+--------------------------------------+-------------+mysql> select @@server_uuid;+--------------------------------------+| @@server_uuid                        |+--------------------------------------+| 4ebd3504-11d9-11ec-8f92-70b5e873a570 |+--------------------------------------+# 的确是连贯的PRIMARY节点

同样地,连贯6447(只读)端口,确认连贯的是SECONDARY节点:

$ mysql -h172.16.16.10 -u GreatSQL -p -P6447Enter password:...mysql> select @@server_uuid;+--------------------------------------+| @@server_uuid                        |+--------------------------------------+| 549b92bf-11d9-11ec-88e1-70b5e873a570 |+--------------------------------------+# 的确是连贯的SECONDARY节点

4. 确认只读负载平衡成果

MySQL Router连贯读写节点(Primary节点)默认的策略是 first-available,即只连贯第一个可用的节点。Router连贯只读节点(Secondary节点)默认的策略是 round-robin-with-fallback,会在各个只读节点间轮询。

放弃6447端口原有的连贯不退出,持续新建到6447端口的连贯,查看 server_uuid,这时应该会发现读取到的是其余只读节点的值,因为 mysqlrouter 的读负载平衡机制是在几个只读节点间主动轮询。在默认的 round-robin-with-fallback 策略下,只有当所有只读节点都不可用时,只读申请才会打到PRIMARY节点上。

对于Router的连贯策略,能够参考 FAQ文档中的:24. MySQL Router能够配置在MGR主从节点间轮询吗,或者MySQL Router官网文档:routing_strategy参数/选项

5. 确认故障主动转移性能

接下来模仿PRIMARY节点宕机或切换时,mysqlrouter 也能实现主动故障转移。

登入MGR集群任意节点:

$ mysqlsh --uri GreatSQL@172.16.16.10:3306...MySQL  172.16.16.10:3306 ssl  JS >  var c=dba.getCluster();MySQL  172.16.16.10:3306 ssl  JS >  c.setPrimaryInstance('172.16.16.11:3306');   <-- 切换PRIMARY节点Setting instance '172.16.16.11:3306' as the primary instance of cluster 'MGR1'...Instance '172.16.16.10:3306' was switched from PRIMARY to SECONDARY.   <-- 切换了,从PRIMARY到SECONDARYInstance '172.16.16.11:3306' was switched from SECONDARY to PRIMARY.   <-- 切换了,从SECONDARY到PRIMARYInstance '172.16.16.12:3306' remains SECONDARY.   <-- 放弃不变WARNING: The cluster internal session is not the primary member anymore. For cluster management operations please obtain a fresh cluster handle using dba.getCluster().The instance '172.16.16.11:3306' was successfully elected as primary.

回到后面连贯6446端口的那个会话,再次查问 server_uuid,此时会发现连贯主动断开了:

mysql> select @@server_uuid;ERROR 2013 (HY000): Lost connection to MySQL server during querymysql> select @@server_uuid;ERROR 2006 (HY000): MySQL server has gone awayNo connection. Trying to reconnect...Connection id:    157990Current database: *** NONE ***+--------------------------------------+| @@server_uuid                        |+--------------------------------------+| 549b92bf-11d9-11ec-88e1-70b5e873a570 |   <-- 确认server_uuid变成新的+--------------------------------------+

这就实现了主动故障转移。

至此,利用MySQL Router配合GreatSQL构建一套反对读写拆散、读负载平衡以及故障主动转移的MGR集群就部署结束了。

6. 小结

本文介绍了如何利用MySQL Router实现读写拆散、读负载平衡,以及故障主动转移,利用MySQL Router能够晋升利用端的透明性,后端数据库产生一些变动时,利用端无需跟着频繁变更。

参考资料、文档

  • MySQL 8.0 Reference Manual
  • 数据库内核开发 - 温正湖
  • Group Replication原理 - 宋利兵

免责申明

因集体程度无限,专栏中不免存在错漏之处,请勿间接复制文档中的命令、办法间接利用于线上生产环境。请读者们务必先充沛了解并在测试环境验证通过前方可正式施行,防止造成生产环境的毁坏或侵害。

Enjoy GreatSQL :)

文章举荐:

GreatSQL季报(2021.12.26)

https://mp.weixin.qq.com/s/FZ...

技术分享|sysbench 压测工具用法浅析

https://mp.weixin.qq.com/s/m1...

故障剖析 | linux 磁盘io利用率高,剖析的正确姿态

https://mp.weixin.qq.com/s/7c...

技术分享|闪回在MySQL中的实现和改良

https://mp.weixin.qq.com/s/6j...

万答#20,索引下推如何进行数据过滤

https://mp.weixin.qq.com/s/pt...

对于 GreatSQL

GreatSQL是由万里数据库保护的MySQL分支,专一于晋升MGR可靠性及性能,反对InnoDB并行查问个性,是实用于金融级利用的MySQL分支版本。

Gitee:

https://gitee.com/GreatSQL/Gr...

GitHub:

https://github.com/GreatSQL/G...

Bilibili:

https://space.bilibili.com/13...

微信&QQ群:

可搜寻增加GreatSQL社区助手微信好友,发送验证信息“加群”退出GreatSQL/MGR交换微信群

QQ群:533341697

微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 公布!