简介
MySQL Router是MySQL官方提供的一个轻量级中间件,可以在应用程序与MySQL服务器之间提供透明的路由方式。主要用以解决MySQL主从库集群的高可用、负载均衡、易扩展等问题。
官方文档
关键特性
- router是一个流量转发层,其功能角色,类似于Nginx、LVS
- router本身不会对请求“拆包”,所以我们无法在Router中间件上实现比如“SQL审计”、“隔离”、“限流”、“分库分表”等。但是router提供了plugin机制,你可以开发自己的plugin来扩展router的额外特性(C语言)
总结上述两点得知:
- router以路由的方式,支持读写分离
- router支持读、写负载均衡
- router支持只读服务的健康监测
- router不支持mysql server 的master、slave探测及自动切换
详细说明
从router的配置说起
[mysql@hdp2~]$more /etc/mysqlrouter.conf
[DEFAULT]
# 日志路径
logging_folder = /home/mysql/mysql-router-2.1.6/log
# 插件路径
plugin_folder = /home/mysql/mysql-router-2.1.6/lib/mysqlrouter
# 配置路径
config_folder = /home/mysql/mysql-router-2.1.6/config
# 运行时状态路径
runtime_folder = /home/mysql/mysql-router-2.1.6/run
# 数据文件路径
data_folder = /home/mysql/mysql-router-2.1.6/data
[logger]
# 日志级别
level = INFO
# 以下选项可用于路由标识的策略部分
[routing:basic_failover]
# Router地址
bind_address = 172.16.1.125
# Router端口
bind_port = 7001
# 读写模式
mode = read-write
# 目标服务器
destinations = 172.16.1.126:3306,172.16.1.127:3306
[routing:load_balance]
bind_address = 172.16.1.125
bind_port = 7002
mode = read-only
destinations = 172.16.1.126:3306,172.16.1.127:3306
[mysql@hdp2~]$
这里值得一提的是mode
参数,该参数可选值为read-write、read-only
,但实际作用并不是字面含义所示。
-
read-write模式,将采用“首个可用”算法,优先使用第一个server,当第一个server(即172.16.1.126:3306)不可达时,将会Failover到第二个server(172.16.1.127:3306),依次进行。如果都不可达,那么此端口上的请求将会被中断,此端口将不能提供服务,且此时所属的路由策略将不可用。需要注意,此算法只遍历一次列表,即逐个验证destinations中的Server,不会循环。一旦所有的Servers依次验证且不可用后,本条路由策略将不能继续服务,内置状态设定为aborted,即使此后Servers恢复上线,也不能继续对Client提供服务,因为它不会与Servers保持心跳检测。对于Router而言,直接拒绝Client连接请求,只有重启Router节点才能解决。
-
read-only模式:将采用“轮询”算法,依次选择Server新建连接,如果某个Server不可达,将会重试下一个Server,如果所有的Server都不可达,那么此端口上的请求将中断,即读写操作将不可用。同时Router将会持续与每个Server保持心跳探测,当恢复后重新加入Active列表,此后那些新建连接请求将可以分发给此Server。
因为Router不会对TPC拆包,所有“read-write”、“read-only”并不会干扰实际的SQL执行。严格来说,这两种mode映射两种“路由算法”:“首个可用”、“轮询”;除此之外,再无特殊含义。因此,我们只能在应用的配置文件中,分别为读、写设定不同的配置,使用不同的绑定端口。
网友评论