利用MySQL Router构建读写分离MGR集群

  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。


本文介绍如何在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可以提升应用端的透明性,后端数据库发生一些变化时,应用端无需跟着频繁变更。

参考资料、文档

免责声明

因个人水平有限,专栏中难免存在错漏之处,请勿直接复制文档中的命令、方法直接应用于线上生产环境。请读者们务必先充分理解并在测试环境验证通过后方可正式实施,避免造成生产环境的破坏或损害。

Enjoy GreatSQL 😃

文章推荐:

GreatSQL季报(2021.12.26)

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

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

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

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

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

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

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

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

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

<think>好的,用户想在Ubuntu系统上安装最新版本的MySQLMySQL Shell,并配置MySQL Router。我需要根据提供的引用内容来整理步骤。首先,引用[2]提到使用MySQL APT存储库来安装MySQL 8.0,这应该是最新版本的方法。用户需要添加APT源,然后安装对应的软件包。 接下来,安装MySQL Shell应该也是通过同一个APT源,因为引用[2]中列出的组件包括MySQL Shell。所以步骤应该是添加APT仓库,更新,然后安装mysql-shell。 然后是MySQL Router的安装,引用[1]显示使用dpkg安装一个.deb包,但引用[2]中也提到MySQL Router在APT仓库中可用,所以可能更简单的方法是直接通过APT安装,这样会自动处理依赖。不过用户提供的引用中有两种方法:一个是直接使用dpkg安装下载的.deb文件,另一个是通过APT源安装。需要确认哪种方法更适合最新版本,通常推荐使用APT源,这样方便后续更新。 配置MySQL Router部分,引用[5]提到MGR集群切换主节点时,Router可以根据metadata调整路由,所以可能需要配置连接到InnoDB Cluster。需要指导用户如何生成配置文件,设置路由策略,比如读写端口和只读端口,并指定集群的元数据地址。 另外,用户可能需要初始化MySQL并设置root密码,这部分在安装后需要运行mysql_secure_installation,但引用中没有直接提到,可能需要补充这一步骤。 最后,确保服务启动并验证安装是否正确。检查MySQLMySQL Shell和Router的服务状态,确认它们正常运行。 还要考虑用户可能的后续问题,比如如何验证Router配置,如何连接到集群,或者如何进行性能优化。生成相关问题时要围绕安装后的配置和使用展开。</think>### 分步解答 #### 1. 添加MySQL官方APT仓库 通过官方APT仓库可确保安装最新版本组件: ```bash wget https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb sudo dpkg -i mysql-apt-config_0.8.28-1_all.deb ``` 安装过程中选择`MySQL Server 8.0`和`MySQL Tools`后确认[^2][^4]。 #### 2. 更新仓库并安装组件 ```bash sudo apt update sudo apt install mysql-server mysql-shell mysql-router ``` 此命令一次性安装: - `mysql-server`:MySQL数据库服务 - `mysql-shell`:支持JavaScript/Python的高级客户端 - `mysql-router`:轻量级中间件路由服务[^2][^5] #### 3. 初始化MySQL安全配置 ```bash sudo mysql_secure_installation ``` 按提示设置root密码、移除匿名用户、禁用远程root登录等。 #### 4. 配置MySQL Router 假设已部署MySQL InnoDB Cluster,编辑配置文件`/etc/mysqlrouter/mysqlrouter.conf`: ```ini [DEFAULT] logging_folder = /var/log/mysqlrouter [routing:primary] bind_address = 0.0.0.0 bind_port = 6446 destinations = metadata-cache://mycluster/?role=PRIMARY routing_strategy = first-available [routing:replica] bind_address = 0.0.0.0 bind_port = 6447 destinations = metadata-cache://mycluster/?role=SECONDARY routing_strategy = round-robin [metadata_cache:mycluster] cluster_type = gr router_id = 1 user=router_user metadata_cluster=mycluster ttl=5 ``` 需提前在MySQL Shell中创建路由专用用户并授权[^5]。 #### 5. 启动服务并验证 ```bash sudo systemctl start mysql sudo systemctl start mysqlrouter mysqlsh --uri root@localhost --sql -e "SHOW DATABASES;" ``` 检查服务状态: ```bash sudo systemctl status mysql-router ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值