mysql router 是轻量级路由进程,非代理或数据库,必须配合 innodb cluster 或 group replication 使用;其核心能力(如自动故障转移、元数据感知)仅在 mysql 8.0.19+ 集群环境下有效,单实例或普通主从中仅支持静态转发。

mysqlrouter 不是代理服务,也不是数据库,它是个轻量级路由进程,必须和 MySQL 实例(尤其是 InnoDB Cluster 或 Group Replication)配合使用。直接在应用服务器上装完就跑,大概率连不上——关键不在安装,而在「能否正确发现并连接后端集群」。
安装前先确认 MySQL 版本和拓扑结构
8.0.x 版本的 mysqlrouter 只支持 MySQL 5.7+,但真正稳定对接的是 MySQL 8.0.19+ 的 InnoDB Cluster。如果你后端是单主从、甚至只是独立实例,mysqlrouter 的自动故障转移和元数据感知能力基本失效,只能当静态端口转发用。
常见踩坑点:
- 用
mysqlrouter --bootstrap连接一个普通主从库(非集群),会报错Failed to fetch cluster metadata - MySQL 用户没开
replication_client和cluster_admin权限,--bootstrap直接失败 - 防火墙或 SELinux 拦了
mysqlrouter访问 MySQL 的 3306 端口,日志里只显示Connection refused,不提示具体原因
--bootstrap 要带对用户和地址
运行 mysqlrouter --bootstrap 不是随便填个 IP 就行。它需要连接到集群的「种子节点」(通常是当前 primary),且该节点必须已启用 Group Replication 或 InnoDB Cluster。
实操建议:
- 用有
replication_client、cluster_admin权限的账户,比如clusteradmin@'%',不能只给SELECT权限 - 地址写集群中任意一个在线节点的
host:port,例如:mysqlrouter --bootstrap clusteradmin:pass@192.168.1.100:3306 - 加
--conf-use-sockets参数可避免 TCP 绑定冲突(尤其在 Docker 或多实例共存时) - 生成的配置默认放
/etc/mysqlrouter/mysqlrouter.conf,但权限常为 root-only,记得chown mysqlrouter:mysqlrouter /etc/mysqlrouter
配置文件里最容易改错的三个参数
mysqlrouter.conf 看似简单,但三处写错会导致整个路由失效:
-
bind_address:设成127.0.0.1后,应用服务器上的其他容器或进程连不到mysqlrouter;生产环境应设为0.0.0.0或具体内网 IP -
routing_strategy:读写分离用first-available,只读用round-robin;误写成round_robin(下划线)会静默忽略,回退到默认策略 -
destinations列表必须和实际集群节点完全一致,包括端口;少写一个从库 IP,那部分读流量就直接 503
示例片段:
[routing:read_write] bind_port = 6446 destinations = 192.168.1.100:3306 routing_strategy = first-available [routing:read_only] bind_port = 6447 destinations = 192.168.1.101:3306,192.168.1.102:3306 routing_strategy = round-robin
启动后必须验证的两件事
启动 mysqlrouter 服务后,别急着改应用连接串。先做两件事:
- 执行
mysql -h 127.0.0.1 -P 6446 -u user -p测试写端口是否通;再换-P 6447测试读端口。不通就看journalctl -u mysqlrouter,重点搜error和failed - 查
mysqlrouter日志目录(默认/var/log/mysqlrouter/mysqlrouter.log),确认有没有Connected to metadata server,没有说明元数据同步失败,--bootstrap没生效
很多线上问题不是配置写错,而是 mysqlrouter 启动时后端集群刚好处于 reconfiguring 状态,它尝试连接失败后不会重试,得手动 systemctl restart mysqlrouter。











