✅ 一、MySQL Router 到底干什么?
一句话:它就是个“交通警察”,站在应用程序和一堆 MySQL 服务器之间,专门指挥连接该往哪儿走。
写操作 → 送到主库
读操作 → 平均地送到各个从库(负载均衡)
主库挂了 → 自动把写流量切到新主库,程序不用改代码、不用重启
✅ 二、为什么要用它?
没有 Router | 有 Router |
---|---|
程序直连 MySQL,主库换了 IP 就得改配置 | 程序只连 Router,Router 负责找主库 |
读写都打到主库,主库压力大 | 读写分离,主库轻松,从库也干活 |
主库挂了业务中断 | Router 自动切流,业务几乎无感知 |
✅ 三、怎么部署?(一步一步来)
1️⃣ 准备机器
MySQL 实例:3 台(172.25.254.10 / 20 / 30)
Router 节点:单独 1 台(172.25.254.40)
2️⃣ 安装 Router(在 40 这台)
rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm
3️⃣ 配置文件
编辑 /etc/mysqlrouter/mysqlrouter.conf
[routing:ro] # 只读端口
bind_address = 0.0.0.0
bind_port = 7001 # 应用连 7001 就是读请求
destinations = 192.168.65.174:3306,192.168.65.173:3306,192.168.65.172:3306
routing_strategy = round-robin # 轮询分发
[routing:rw] # 读写端口
bind_address = 0.0.0.0
bind_port = 7002 # 应用连 7002 就是写请求
destinations = 192.168.65.172:3306,192.168.65.173:3306,192.168.65.174:3306
routing_strategy = first-available # 谁活着就用谁
4️⃣ 启动 Router
systemctl start mysqlrouter.service
✅ 四、测试效果
① 在 MySQL 主库上建用户
CREATE USER 'root'@'%' IDENTIFIED BY 'lee';
GRANT ALL ON root *.* TO 'lee'@'%';
② 从任意客户端连 Router
# 读请求(会轮询到 174/173/172 三台)
mysql -uroot -plee -h 192.168.65.175 -P 7001
# 写请求(只会落到 172,除非 172 挂了才切到 173)
mysql -ulee -plee -h 192.168.65.175 -P 7002
③ 实时验证
在 172/173/174上开 watch -n1 lsof -i :3306
就能看到连接被轮流或优先地打到不同机器。
✅ 五、注意坑
坑 | 说明 |
---|---|
Router 不会限制 SQL 类型 | 你往 7001 写也能成功,只是通常约定 7001 只读 |
Router 不解析 SQL | 只做“连接级”路由,性能高但功能简单 |
主从复制必须健康 | 如果从库延迟大,读可能读到旧数据 |
✅ 一句话总结
MySQL Router = 轻量级、官方出品、免费、读写分离 + 故障转移
适合不想改代码、又想提升 MySQL 可用性和性能的场景。