MySQL Router是MySQL Proxy的替代方案,MySQL官方不建议将MySQL Proxy用于生产环境,并且已经不提供MySQL Proxy的下载。在后期的使用中,没有出色的表现,因为proxy除了读写分离,没有其他作用,也无法动态更改配置。
InnoDB Cluster中MySQL Router充当代理,向应用程序隐藏网络上的多个MySQL实例,并将数据请求映射到其中一个集群实例。MySQL Router的推荐部署模型是与InnoDB Cluster集成。
功能
1.Failover
一个高可用的MySQL设置由一个主服务器和多个从服务器组成,由应用程序处理故障转移,以防MySQL主服务器变得不可用。使用MySQL路由器,应用程序连接将根据负载平衡策略透明地进行路由
2.Load Balancing
MySQL路由器通过在一个服务器池中分布数据库连接来提供额外的可伸缩性和性能。例如,如果您有一组复制的MySQL服务器,MySQL路由器可以以循环方式将应用程序连接分发给它们。
3.Pluggable Architecture:
MySQL用户提供了创建自己的定制插件的能力,从而提供了无限的可能性。MySQL路由器目前提供了一些核心插件,包括:
-
连接路由插件,它做基于连接的路由,这意味着它将MySQL数据包转发到后端服务器,而不检查或修改它们,从而提供最大的吞吐量。
-
元数据缓存插件,它提供透明的客户端负载平衡、路由和故障转移到组复制和InnoDB集群
Router中间件本身不会对请求“拆包”(unpackage),所以无法在Router中间件上实现比如“SQL审计”、“隔离”、“限流”、“分库分表”等功能。但是Router提供了plugin(C语言)机制,用户可以开发自己的plugin来扩展Router的额外特性。
原理:
Router作为一个流量转发层,位于应用与MySQL服务器之间,其功能类似于LVS。
MySQL Router的工作流程如下:
1.MySQL客户端连接到MySQL Router。
2.Router检查可用的MySQL服务器。
3.Router打开一个适用MySQL服务器的TCP连接。
4.Router在应用程序和MySQL服务器之间来回转发数据包
5.如果连接的MySQL服务器出现故障, Router将断开连接。当应用程序重试连接到Router时,Router选择另一个可用MySQL服务器。
简单理解,应用不再直连MySQL Servers,而是与Router相连,根据Router的配置,将会把应用程序的读写请求转发给MySQL Servers。当有多个MySQL Servers,无论主、从,Router可以对读写请求进行负载均衡。当某个Server失效时,Router可以将其从Active列表中移除,当其online后再次加入Active列表,即提供了Failover特性。如果使用InnoDB Cluster模式,那么Router还能基于metaCache(metaServers)机制,感知MySQL的主从切换、从库增减等集群拓扑变更,而且基于变更能够实现Master自动切换、Slaves列表自动装配等。
安装部署:
发现一个现象,router之前是2.0之后的版本下载,跟mysql版本一样,都有有小版本。有些环境下 router版本和mysql 版本不对称,出现比较严重的故障。
安装地址:https://dev.mysql.com/downloads/router/
官方说明:https://www.mysql.com/cn/products/enterprise/router.html
1.安装
[root@ss30 softwares]# tar -xvf mysql-router-8.0.19-linux-glibc2.12-x86_64.tar.xz mysql-router-8.0.19-linux-glibc2.12-x86_64/bin/mysqlrouter_keyring mysql-router-8.0.19-linux-glibc2.12-x86_64/bin/mysqlrouter mysql-router-8.0.19-linux-glibc2.12-x86_64/bin/mysqlrouter_passwd mysql-router-8.0.19-linux-glibc2.12-x86_64/bin/mysqlrouter_plugin_info mysql-router-8.0.19-linux-glibc2.12-x86_64/README.router [root@ss30 softwares]# mv mysql-router-8.0.19-linux-glibc2.12-x86_64 mysqlRouter8.0.19 [root@ss30 bin]# vi /etc/profile #MySQLRouter8.0.19 export PATH=/opt/idc/softwares/mysqlRouter8.0.19/bin:$PATH [root@ss30 bin]# source /etc/profile
复制
2.创建目录
[root@ss30 mysqlrouter]# mkdir -p /opt/mysqlrouter/data [root@ss30 mysqlrouter]# mkdir -p /opt/mysqlrouter/log [root@ss30 mysqlrouter]# mkdir -p /opt/mysqlrouter/run [root@ss30 mysqlrouter]# mkdir -p /opt/mysqlrouter/config [root@ss30 mysqlrouter]# cp /opt/idc/softwares/mysqlRouter8.0.19/share/doc/mysqlrouter/sample_mysqlrouter.conf /opt/mysqlrouter/config/mysqlrouter.conf
复制
读写分离配置
配置信息:
[root@ss30 mysqlrouter]# vi /opt/mysqlrouter/config/mysqlrouter.conf [DEFAULT] logging_folder = /opt/mysqlrouter/log plugin_folder = /opt/idc/softwares/mysqlRouter8.0.19/lib/mysqlrouter config_folder = /opt/mysqlrouter/config runtime_folder = /opt/mysqlrouter/run data_folder = /opt/mysqlrouter/data client_connect_timeout = 2 connect_timeout = 2 read_timeout = 30 max_connections = 2048 # keyring_path = /var/lib/keyring-data # master_key_path = /var/lib/keyring-key [logger] level = DEBUG timestamp_precision = second [routing:primary] # To be more transparent, use MySQL Server port 3306 bind_address = 0.0.0.0 bind_port = 7001 routing_strategy = first-available mode = read-write destinations = 192.168.244.130:3410 [routing:secondary] # To be more transparent, use MySQL Server port 3306 bind_address = 0.0.0.0 bind_port = 7002 routing_strategy = round-robin mode = read-only destinations = 192.168.244.144:4310,192.168.244.130:3410 # If no plugin is configured which starts a service, keepalive # will make sure MySQL Router will not immediately exit. It is # safe to remove once Router is configured. [keepalive] interval = 60
复制
启动
[root@ss30 mysqlrouter]# mysqlrouter -c /opt/mysqlrouter/config/mysqlrouter.conf &
复制
从安装到部署,非常简单。涉及的参数也少。
MGR节点
配置信息:通过命令 相关的配置信息会自动生成
[root@ss30 mysqlrouter]# mysqlrouter --bootstrap root@192.168.244.129:3380 --directory /opt/mysqlrouter/mgr --user=root
复制
目录结构
mysqlrouter.conf配置文件
# File automatically generated during MySQL Router bootstrap [DEFAULT] user=root logging_folder=/opt/mysqlrouter/mgr/log runtime_folder=/opt/mysqlrouter/mgr/run data_folder=/opt/mysqlrouter/mgr/data keyring_path=/opt/mysqlrouter/mgr/data/keyring master_key_path=/opt/mysqlrouter/mgr/mysqlrouter.key connect_timeout=15 read_timeout=30 dynamic_state=/opt/mysqlrouter/mgr/data/state.json [logger] level = INFO [metadata_cache:mgrCluster] cluster_type=gr router_id=1 user=mysql_router1_zesa3g471bns metadata_cluster=mgrCluster ttl=0.5 use_gr_notifications=0 [routing:mgrCluster_rw] bind_address=0.0.0.0 bind_port=6446 destinations=metadata-cache://mgrCluster/?role=PRIMARY routing_strategy=first-available protocol=classic [routing:mgrCluster_ro] bind_address=0.0.0.0 bind_port=6447 destinations=metadata-cache://mgrCluster/?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=classic [routing:mgrCluster_x_rw] bind_address=0.0.0.0 bind_port=64460 destinations=metadata-cache://mgrCluster/?role=PRIMARY routing_strategy=first-available protocol=x [routing:mgrCluster_x_ro] bind_address=0.0.0.0 bind_port=64470 destinations=metadata-cache://mgrCluster/?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=x
复制
mgr,router集群创建构成中,创建的账号
备份账号,元数据账号:
链接测试
[root@ss30 config]# mysql -h192.168.244.130 -P6447 -udbadmin -p ##mysql -h192.168.244.130 -P6447 -udbadmin -p123456 --protocol=TCP -N -r -B -e"select @@hostname;show variables like 'server_uuid';"
复制
注意:
- mysql_innodb_cluster_metadata是shell命令自动生成库
- Innodb cluter 结合mysql router使用必须借助于mysql shell实现
参数
抽取了几个重要的参数,进行说明
官网地址:https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-conf-options.html
基础参数
- connect_timeout:连接到MySQLrouter服务器时超时值。默认值是30秒。
路由参数
- max_connections:每条路由都可以限制路由或连接的数量。一种可能的用途是帮助防止可能的拒绝服务(DOS)攻击。默认值是512,有效范围是1到65536。
- thread_stack_size:为每个线程分配的堆栈大小。单位是kb,默认为64。
- read_timeout:从MySQL元数据服务器读取时,MySQL路由器使用的超时值。默认值是30秒。
- mode : read-write ,read-only
- routing_strategy:负载模式
1.first-available 新连接选择列表路由到第一个可用的服务器。如果出现故障,则使用下一个可用的服务器。这个循环一直持续到所有服务器都不可用为止。
2.next-available 新连接选择列表路由到第一个可用的服务器。如果出现故障,则使用下一个可用的服务器。这个循环一直持续到所有服务器都不可用为止。
与first-available不同的是,如果一个服务器被标记为不可到达,那么它将被丢弃,并且再也不会使用
3.round-robin 每个新连接都以循环方式连接到下一个可用的服务器。
4.round-robin-with-fallback 每个新连接都以循环方式连接到下一个可用的辅助服务器。如果辅助服务器不可用,则以循环方式使用主列表中的服务器
默认:PRIMARY,SECONDARY,PRIMARY_AND_SECONDARY round-robin is default
元数据缓存
- bootstrap_server_addresses:指向可以连接到的具有元数据的MySQL服务器列表。在访问元数据之后,元数据缓存切换到主副本集中的服务器来获取元数据。它们也被称为引导服务器。此选项在MySQL路由器8.0.14中被弃用,不再由引导进程生成。相反,添加了dynamic_state选项作为替代。
- dynamic_state:跟踪和存储活动的MySQL InnoDB集群元数据服务器地址,并在路由器重启时加载它们。这个功能是由bootstrap激活的
MySQL Router的常见问题。
个人实际经验中总结。
1.MySQL Router 安装在哪里?
建议主要出于性能考虑。每当在网络中引入通信组件时,都会产生一定的开销,一般在与应用程序相同的主机上安装并运行MySQL Router。但实际使用情况下,单独部署。现在的微服务架构下,不适合跟应用一起部署。
个人建议,能单独安装在数据库区域是最好的选择。
2.单台服务器,可以运行多个MySQL Router实例吗?
可以。
3.MySQL Router检查数据包吗?
不
4.MySQL Router影响性能吗?
无论何时在通信流中引入组件,都会产生一定的开销,并受到工作负载的严重影响。与直接连接数据库相比较,MySQL Router会产生大约1%的影响。
5.MySQL Router的版本有2.xx和8.xx,该使用哪个版本?
使用8.xx版本,2.xx版本是为了与早期产品兼容。
6.每个MySQL Router实例支持多少并发连接?
根据操作系统的poll()限制,在MySQL路由器2.1.5和8.0.4中,支持5000,而在早期版本中,由于内部使用select()而不是poll(),支持500。
总结
总的来说,MySQL Router从原理、安装、配置到部署使用都是如此轻而易举,可满足简单高可用应用场景的需求。Mgr配置无法手动进行,因为元数据mysql_innodb_cluster_metadata数据库上。现阶段不支持一些动态加载参数。其实这部分功能是非常实用的。
希望官方考虑把这部分容纳进去。