1. MySQL Router 基础认知与核心价值
MySQL Router 是 Oracle 官方推出的轻量级中间件,作为连接客户端与 MySQL 服务器的"智能交通警察"。我在实际部署中发现,它最核心的价值在于实现了三个自动化:自动请求路由、自动故障转移、自动负载均衡。当你的应用需要对接 MySQL InnoDB Cluster 或 Group Replication 时,Router 能显著降低应用层的复杂度。
与传统的直接连接方式相比,Router 提供了几个关键特性:
- 读写分离:自动将写请求导向主节点,读请求分发到从节点
- 高可用:在主节点故障时自动切换到新主节点(平均切换时间<2秒)
- 连接池管理:维持与后端MySQL服务器的长连接,降低连接建立开销
最新版本的 Router(8.0.34)在 Kubernetes 环境支持上有显著增强,这也是为什么越来越多的云原生方案开始集成它。不过要注意,Router 本身不存储数据,只是路由代理,这点和 ProxySQL 等工具有本质区别。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与安装部署
2.1 系统兼容性检查
在开始前,建议先确认你的操作系统版本是否受支持。我曾在 Ubuntu 22.04 上遇到 glibc 版本冲突问题,后来发现官方文档明确标注了兼容矩阵。以下是主流系统的支持情况:
| 操作系统 | 支持版本 | 已知问题 |
|---|---|---|
| RHEL/CentOS | 7.4+ / 8.x | SELinux 策略需调整 |
| Ubuntu | 20.04 LTS+ | AppArmor 默认配置需修改 |
| Windows Server | 2016/2019/2022 | 性能比Linux低约15% |
| macOS | 10.15+ | 仅限开发环境使用 |
提示:生产环境强烈建议使用 Linux 发行版,Windows 版本在高并发场景下会出现端口耗尽问题。
2.2 三种安装方式对比
根据你的使用场景,可以选择不同的安装方式:
- 官方仓库安装(推荐)
bash复制# Ubuntu/Debian
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb
sudo apt update
sudo apt install mysql-router
# RHEL/CentOS
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
sudo yum install mysql-router
- 二进制包安装
bash复制wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.0.34-linux-glibc2.12-x86_64.tar.xz
tar xvf mysql-router-8.0.34-*.tar.xz
sudo mv mysql-router-8.0.34 /usr/local/mysqlrouter
- Docker 方式
dockerfile复制docker run -d --name=mysqlrouter \
-e MYSQL_HOST=your_mysql_host \
-e MYSQL_PORT=3306 \
-e MYSQL_USER=router \
-e MYSQL_PASSWORD=securepassword \
-p 6446:6446 -p 6447:6447 -p 6448:6448 \
mysql/mysql-router:8.0
实测发现,二进制包安装的性能最好,但管理起来稍麻烦。我现在的标准做法是:开发环境用Docker,生产环境用官方仓库安装+自定义systemd服务。
3. 核心配置文件详解
3.1 主配置文件结构
安装完成后,默认配置文件通常位于 /etc/mysqlrouter/mysqlrouter.conf。这个文件采用INI格式,包含几个关键部分:
ini复制[DEFAULT]
logging_folder = /var/log/mysqlrouter
plugin_folder = /usr/lib64/mysqlrouter
runtime_folder = /var/run/mysqlrouter
config_folder = /etc/mysqlrouter
[logger]
level = INFO
[metadata_cache:prod_cluster]
router_id=1
bootstrap_server_addresses=mysql1:3306,mysql2:3306,mysql3:3306
user=router_user
metadata_cluster=prod_cluster
ttl=5
[routing:primary]
bind_addre
