暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

测试:MySQL Router与InnoDB群集一起使用

原创 徐佩怡 2020-08-05
2454

MySQL Router

在上一篇文章中(Mysql shell建立innodb cluster - 墨天轮),介绍了通过沙箱在一个主机上安装innodb cluster进行模拟,接着上一篇文章这里继续配置MySQL Router,完成数据库集群和路由的集成测试。

在配置好一个innodb cluster集群后,就可以配置MySQL路由器以提供高可用性。

    无论是否部署了沙箱集群或生产集群,MySQL路由器都可以使用该 —bootstrap选项基于InnoDB Cluster的元数据进行自我配置 。这将自动配置MySQL路由器,以将连接路由到群集的服务器实例。客户端应用程序连接到MySQL路由器提供的端口,而无需了解InnoDB Cluster拓扑。万一发生意外故障,InnoDB Cluster会自动进行自我调整,并且MySQL Router会检测到更改。这消除了您的客户端应用程序处理故障转移的需要。

截屏20200804 下午6.20.19.png

   建议的MySQL Router部署与应用程序位于同一主机上。使用沙箱部署时,所有内容都在单个主机上运行, 因此,您将MySQL Router部署到同一主机上。使用生产部署时,建议将一个MySQL路由器实例部署到用于承载一个客户端应用程序的每台计算机上。也可以将MySQL路由器部署到应用程序实例通过其连接的通用计算机上。
生成的MySQL路由器配置将创建用于连接到群集的TCP端口。默认情况下,将创建用于使用经典MySQL协议和X协议与集群通信的端口。要使用X协议,服务器实例必须安装并配置了X插件,这是MySQL 8.0及更高版本的默认设置。默认的可用TCP端口为:
6446 -对于经典的MySQL协议读写会话,MySQL路由器将传入的连接重定向到主服务器实例。
6447 -对于经典的MySQL协议只读会话,MySQL路由器将传入的连接重定向到辅助服务器实例之一。
64460 -对于X协议读写会话,MySQL路由器将传入的连接重定向到主服务器实例。
64470 -对于X协议只读会话,MySQL路由器将传入的连接重定向到辅助服务器实例之一。
 根据您的MySQL路由器配置,端口号可能与上述端口号不同。例如,如果您使用 --conf-base-port选项或  group_replication_single_primary_mode变量。启动MySQL Router时,将列出确切的端口。

   传入连接的重定向方式取决于所使用的群集类型。当使用单主群集时,默认情况下,MySQL路由器发布一个X协议和一个经典的MySQL协议端口,客户端连接到该端口进行读写会话,然后重定向到群集的单主群集。对于多主群集,读写会话将以循环方式重定向到主实例之一。

1.配置MySQL Router

配置MySQL Router的启动节点为端口3310的实例:
mysqlrouter --bootstrap root@localhost:3310 —user=mysql
截屏20200804 下午6.35.02.png
输入密码,成功之后,这个绑定就打通了。
可以看出分配的读写端口为6446,只读端口6447,X协议的连接端口64460和64470。

这个引导过程将生成配置文件,如下:

[root@balabala mysql-sandboxes]# cat /etc/mysqlrouter/mysqlrouter.conf
# File automatically generated during MySQL Router bootstrap
[DEFAULT]
name=system
user=mysql
keyring_path=/var/lib/mysqlrouter/keyring
master_key_path=/etc/mysqlrouter/mysqlrouter.key
connect_timeout=15
read_timeout=30
dynamic_state=/var/lib/mysqlrouter/state.json

[logger]
level = INFO

[metadata_cache:testCluster]
cluster_type=gr
router_id=1
user=mysql_router1_fnnf8sgw2ksb
metadata_cluster=testCluster
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2
use_gr_notifications=0

[routing:testCluster_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://testCluster/?role=PRIMARY
routing_strategy=first-available
protocol=classic

[routing:testCluster_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://testCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=classic

[routing:testCluster_x_rw]
bind_address=0.0.0.0
bind_port=64460
destinations=metadata-cache://testCluster/?role=PRIMARY
routing_strategy=first-available
protocol=x

[routing:testCluster_x_ro]
bind_address=0.0.0.0
bind_port=64470
destinations=metadata-cache://testCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=x

每个选项可以参考MySQL :: MySQL Router 8.0 :: 4.3.1.1 mysqlrouter — Command Line Options

2.启动MySQL Router

mysqlrouter &
截屏20200804 下午6.45.33.png

mysqlrouter的配置文件在/etc/mysqlrouter/mysqlrouter.conf
如果要指定配置文件,需要使用mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf &
可以看到其中一部分:
截屏20200804 下午6.48.42.png

此时,查看数据库可以看到如下内容:
截屏20200805 下午6.29.55.png
9CAD02BA8C8844EDBDC7E3D910761226.png

3.客户端怎么透明地连接到InnoDB Cluster实例之一?

    现在可以如上所述将MySQL客户端(例如MySQL Shell)连接到传入的MySQL路由器端口之一,并查看客户端如何透明地连接到InnoDB Cluster实例之一。

尝试6446的端口来登陆,使用MySQL Shell开启连接入口,MySQL Route进行了转接,连接到的是 读写节点 3310 :
mysqlsh --uri root@localhost:6446
截屏20200804 下午6.52.38.png
切换到sql模式,验证登录的端口号:

 MySQL  localhost:6446 ssl  JS > \sql
 MySQL  localhost:6446 ssl  SQL > show variables like '%port%';

截屏20200804 下午6.57.40.png

从8.0.19版本开始,显示所有已注册的MySQL路由器实例的列表:
MySQL localhost:6446 ssl JS > cluster.listRouters()
截屏20200805 下午5.40.51.png

4.测试高可用性

要测试高可用性是否有效,请通过杀死实例来模拟意外的停止。群集检测到实例已离开群集并重新配置自身的事实。集群本身如何真正进行重新配置取决于您使用的是单主集群还是多主集群,以及实例在集群中扮演的角色。

在单主要模式下:
1.如果当前主节点离开集群,则将辅助实例之一选作新的主实例,优先考虑最低 server_uuid的实例。MySQL Router将读写连接重定向到新选出的主数据库。
2.如果当前辅助节点离开群集,则MySQL路由器不再将只读连接重定向到该实例。

在多主要模式下:
如果当前的“ R / W”实例离开群集,则MySQL路由器会将读写连接重定向到其他主数据库。如果剩下的实例是群集中的最后一个主实例,则群集已完全消失,您将无法连接到任何MySQL路由器端口。

模拟实例意外离开集群: MySQL localhost:6446 ssl JS > dba.killSandboxInstance(3310)
截屏20200805 下午5.22.42.png
查看进程信息,已经停止:
截屏20200805 下午5.23.22.png

此时再使用6446连接数据库,可以发现已经变成3320端口了:
截屏20200805 下午5.24.20.png

5.恢复3310节点

启动3310节点:
MySQL localhost:6446 ssl JS > dba.startSandboxInstance(3310)
截屏20200805 下午5.28.23.png

查看集群状态,此时读写节点已经在3320上了:

 MySQL  localhost:6446 ssl  JS > var cluster=dba.getCluster()
 MySQL  localhost:6446 ssl  JS > cluster.status()

截屏20200805 下午5.30.03.png

集群会被自动纳入集群(将InnoDB群集配置持久保存到实例的选项文件后,它将自动重新加入群集)。
如果没有,可以执行:
cluster.rejoinInstance('root@localhost:3310')

6.删除集群,并恢复

MySQL localhost:6446 ssl JS > cluster.removeInstance('root@localhost:3310')
截屏20200805 下午6.11.01.png

此时查看mysql进程,会发现3310被清理元数据并且关闭了:
截屏20200805 下午6.11.47.png

重新加入集群:
MySQL localhost:6446 ssl JS > cluster.rescan()输入y
截屏20200805 下午6.17.18.png

检查集群状态:
截屏20200805 下午6.17.53.png

总结

MySQL Router安装很容易,可以在同一台主机上运行多个MySQL Router。
MySQL Router通过配置文件的配置自动进行读写分离,在MySQL出现问题的时候,MySQL Router能做到业务无感知的情况下切换主节点,在检测到曾经的主节点恢复的时候可以通过持久化的配置将节点自动纳入集群并成为新的备节点。

缺点是不能解析包的内容,属于静态路由。

最后修改时间:2020-08-05 23:29:51
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论