利用mysqlrouter构建读写分离mgr集群(代码片段)

GreatSQL GreatSQL     2022-10-20     675

关键词:

  • 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

ansible一键安装greatsql并构建mgr集群(代码片段)

...ts设置正确的主机名5.2下载GreatSQL-ansible安装包并解压缩5.3利用ansible安装GreatSQL5 查看详情

clickhouse读写分离方案

...读的时候,就会自动把读请求分发到第一个replica上,再利用复制特性把数据同步到自己replica上。通过这样子的设计,使得读请求与写请求分开。2、优点(1)相比之前的普通集群配置,等于把空闲的资源利用起来,提供了集群... 查看详情

一周碎碎念,2021.11.7,两个mgr集群间还可以构建传统的主从复制通道吗(代码片段)

...编译环境的Dockerfile发现几个小瑕疵,于是更新了下。利用Docker环境来编译GreatSQL显然更方便,一次构建即可多次使用,非常推荐这种方式。有兴趣的 戳此查看最新Dockerfile(https://gitee.com/Great 查看详情

oneproxy构建

 OneProxy的主要功能有:1.垂直分库2.水平分表3.Proxy集群4.读高可用5.读写分离(master不参与读)6.读写分离(master参与读)7.写高可用8.读写随机一、重要概念ServerGroup 在OneProxy中,一组主从复制的MySQL集群被称为ServerGroup。... 查看详情

《叶问》37期,三节点的mgr集群关掉两个节点后还能继续读写吗(代码片段)

...叶问』正轨。1.三节点的MGR集群关掉两个节点后还能继续读写吗这里要先明确一个前提,两个节点是正常关闭MGR服务,还是异常宕机。如果两个节点是手动执行 stopgroup_replication 关闭的话,那仅剩的一个节点(会... 查看详情

作业帮多云部署多主模式mgr集群实战

...认启动时通过cetus配置本地MGR节点为rw);读请求会根据cetus读写分离策略路由到不同的云的MGR节点当本地MGR节点故障,则cetus会自动检测配置中的后端MGR节点,选取一个新的存活节点作为rw节点。此时业务跨云读写。当单个云整体故障... 查看详情

作业帮多云部署多主模式mgr集群实战

...认启动时通过cetus配置本地MGR节点为rw);读请求会根据cetus读写分离策略路由到不同的云的MGR节点当本地MGR节点故障,则cetus会自动检测配置中的后端MGR节点,选取一个新的存活节点作为rw节点。此时业务跨云读写。当单个云整体故障... 查看详情

gtid+mgr+atlas读写分离以及负载均衡高可用架构(代码片段)

MySQL5.7.24Gtid+MGR+atlas读写分离以及负载均衡高可用架构一.服务器环境介绍:腾讯云的云主机安装360开源的mysql中间键Atlas腾讯云机器的外网ip:119.29.97.131沧州233测试物理机器的外网ip192.168.1.233(安全起见故意写成内网的ip,其实是外... 查看详情

kylin跨集群配置实现读写分离

社区提供的读写分离架构图如下:通过架构图可以看到Kylin会访问两个集群的HDFS,建议两个集群的NameService务必不能相同,尤其是集群启用NameNodeHA时,相同的NameService会导致组件在跨集群访问HDFS时因无法区分NameService而出现问题... 查看详情

数据库双重负载均衡读写分离及双活集群

双重负载均衡读写分离及双活集群---数据库性能和容灾一体化解决方案说明:1.第一重负载均衡读写分离:节点DB-A和DB-B之间负载均衡和读写分离,数据同步方式为同步模式。2.第二重负载均衡读写分离:节点DB-C执行报表、OLAP查... 查看详情

mysql集群读写分离(amoeba)

实验环境Master、Amoeba--IP:192.168.1.5Slave---IP:192.168.1.10安装JDKJDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html[[email protected]~]#mkdir/usr/local/JDF[[e 查看详情

mycat学习第二天之性能监控,读写分离,集群搭建(代码片段)

...监控1.4Mycat-web之MySQL性能监控指标1.5Mycat-web之SQL监控2.MyCat读写分离搭建2.1MySQL主从复制原理2.2MySQL一主一从搭建2.3MyCat一主一从读写分离2.4MySQL双主双从搭建2.5MyCat双主双从读写分离3.Mycat集群搭建 查看详情

redis-集群主从复制,读写分离;哨兵模式;消息订阅发布(代码片段)

一、Redis集群、主从复制,读写分离redis的主从复制:主少从多、主写从读、读写分离、主写同步复制到从搭建一主二从redis集群1、搭建三台redis服务:使用一个redis模拟三台redis服务提供三分redis配置文件:redis6379.... 查看详情

想玩集群?读写分离?你要先懂这个!

答案是:Mysql主从同步,集群,读写分离,都会涉及数据的数据同步,所以想玩哪些东西,我们还是要把这个数据同步的基础学会之后我们才能玩其他的,今天呢思梦PHP就给大家带来了这个小案例,亲测,没毛病!以下案例是测... 查看详情

想玩集群?读写分离?你要先懂这个!

答案是:Mysql主从同步,集群,读写分离,都会涉及数据的数据同步,所以想玩哪些东西,我们还是要把这个数据同步的基础学会之后我们才能玩其他的,今天呢思梦PHP就给大家带来了这个小案例,亲测,没毛病!以下案例是测... 查看详情

《叶问》38期,mgr整个集群挂掉后,如何才能自动选主,不用手动干预(代码片段)

...启动MGR服务这是个来自群友的问题。首先,MySQL服务利用 systemd 即可实现故障后自启动,注意下面这个配置即可:[root@GreatSQL~]#cat/usr/lib/systemd/system/greatsql.service...Restart=on-failure其次,mysqld进程启动后,... 查看详情

数据库应用——atlas代理mysql集群实现读写分离(代码片段)

Atlas代理MySQL集群实现读写分离一、Atlas简介和架构1.1环境准备1.2配置时间服务器二、主服务器配置2.1master节点1的配置2.2master节点2的配置2.3主服务器配置完成后的测试三、从服务器配置3.1slave节点1的配置3.1slave节点2的配置3.3从服... 查看详情

mycat实现mysql读写分离,热切换,集群

在互联网时代,实现mysql读写分离,热切换,集群能大大提高mysql数据库访问压力,防止数据丢失,使用mycat能帮我们实现这些。我们要实现的是这种架构。1、Mycat能实现数据库的垂直切分和水平切分,这里... 查看详情