mysql router 默认按顺序查找配置文件:/etc/mysqlrouter/mysqlrouter.conf、$home/.mysqlrouter/mysqlrouter.conf、当前目录mysqlrouter.conf;生产环境应显式指定--config路径,并确保文件权限正确。

MySQL Router 配置文件位置和识别逻辑
MySQL Router 不会自动读取任意路径的配置,它只认固定位置或显式指定的 mysqlrouter.conf。默认启动时按顺序查找:/etc/mysqlrouter/mysqlrouter.conf、$HOME/.mysqlrouter/mysqlrouter.conf、当前工作目录下的 mysqlrouter.conf。迁移前必须确认目标环境用的是哪个路径,否则改了文件也无效。
- 用
mysqlrouter --help查看 “Default config file” 行,确认默认路径 - 生产环境建议统一用
--config显式指定路径,避免依赖默认查找逻辑 - 注意文件权限:Router 进程用户(如
mysqlrouter)必须有读取权限,否则启动报错Failed to open configuration file
路由策略(routing\_section)不能直接复制粘贴
MySQL Router 的 [routing] 段落看似简单,但实际生效依赖后端 MySQL 实例的拓扑状态。直接把旧配置里的 destinations 地址拷过去,如果新集群 IP/端口/角色(PRIMARY vs SECONDARY)变了,Router 启动会成功,但连接一发就失败——因为底层节点不可达或角色不匹配。
-
destinations必须指向新集群中真实存活且角色正确的实例,例如:destinations=metadata-cache://mycluster/?role=PRIMARY或destinations=10.20.30.40:3306 - 若用元数据缓存(
metadata-cache),确保[metadata_cache]段落里的bootstrap_server_addresses已更新为新集群的 InnoDB Cluster 或 Group Replication 成员地址 - 老配置里常见的
routing_strategy=round-robin-with-fallback在 8.0.22+ 已弃用,新版本应改用first-available或next-available,否则启动警告并降级为first-available
迁移时 metadata-cache 和 bootstrap 的联动关系
Router 本身不存集群拓扑,它靠启动时向 MySQL Server(InnoDB Cluster)拉取元数据来构建路由决策。所以迁移配置 ≠ 迁移拓扑信息。如果只搬 mysqlrouter.conf,但没重新运行 mysqlrouter --bootstrap,Router 仍会尝试连老集群的元数据节点,导致 Failed to fetch cluster metadata 错误。
- 必须在新环境执行完整引导:
mysqlrouter --bootstrap user@new-cluster-ip:3306 --conf-use-sockets --directory /opt/mysqlrouter -
--bootstrap会覆盖已有配置,并自动生成含正确[metadata_cache]和[routing]的文件;手动编辑前先备份原始生成结果 - 若无法直连新集群(比如网络隔离),需先在可连通机器上
--bootstrap,再把生成的mysqlrouter.conf和data/目录一起迁移到目标机
SSL 和用户权限容易被忽略的细节
Router 连接后端 MySQL 时,默认走明文,但新集群可能强制 SSL。这时配置里没开 ssl_mode=DISABLED 或没配证书路径,就会卡在连接阶段,日志只显示 Connection refused 或超时,实际是 SSL 握手失败。
- 检查新集群是否启用
require_secure_transport=ON,若是,Router 配置中对应[routing]段必须加ssl_mode=REQUIRED并设置ssl_ca、ssl_cert、ssl_key - Bootstrap 用户(如
mysql_router@%)需在新集群中存在,且拥有SELECT权限于performance_schema.replication_group_members和mysql_innodb_cluster_metadata.*(取决于集群类型) - Router 日志级别设为
level=DEBUG才能看到 SSL 握手和元数据获取的详细过程,光看 ERROR 级别日志找不到根因











