共计 5896 个字符,预计需要花费 15 分钟才能阅读完成。
- 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=mysqlrouter
Please 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 restart
or
$ systemctl start mysqlrouter
or
$ mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf
the 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 mysqlrouter
mysqlro+ 6026 1 5 09:28 ? 00:00:00 /usr/bin/mysqlrouter
[root@greatsql]# netstat -lntp | grep mysqlrouter
tcp 0 0 0.0.0.0:6446 0.0.0.0:* LISTEN 6026/mysqlrouter
tcp 0 0 0.0.0.0:6447 0.0.0.0:* LISTEN 6026/mysqlrouter
tcp 0 0 0.0.0.0:6448 0.0.0.0:* LISTEN 6026/mysqlrouter
tcp 0 0 0.0.0.0:6449 0.0.0.0:* LISTEN 6026/mysqlrouter
tcp 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.0
bind_port=6446
destinations=metadata-cache://greatsqlMGR/?role=PRIMARY
routing_strategy=first-available
protocol=classic
能够依据须要自行批改绑定的 IP 地址和端口,也能够在初始化时指定 --conf-base-port
选项自定义初始端口号。
3. 确认读写拆散成果
当初,用客户端连贯到 6446(读写)端口,确认连贯的是 PRIMARY 节点:
$ mysql -h172.16.16.10 -u GreatSQL -p -P6446
Enter password:
...
#记住上面几个 MEMBER_ID
mysql> 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 -P6447
Enter 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 到 SECONDARY
Instance '172.16.16.11:3306' was switched from SECONDARY to PRIMARY. <-- 切换了,从 SECONDARY 到 PRIMARY
Instance '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 query
mysql> select @@server_uuid;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 157990
Current 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 公布!