MaxScale 读写分离配置核心在于正确设置监控模块与路由模块,适用于主从复制架构的 MariaDB 或 MySQL 集群,主要风险边界在于事务一致性和主从延迟导致的读取旧数据。
先说结论:MaxScale 读写分离适合读多写少且能接受最终一致性的业务场景,配置前需确保主从复制状态正常。
- 适合:主从架构清晰、读负载高于写负载的应用
- 先准备:独立的监控账号、开放必要端口、备份配置文件
- 验收:通过 maxctrl 检查服务状态、验证读写请求路由路径
命令速用版
以下是基于 MaxScale 2.5 及以上版本的模块化配置核心片段,用于定义监控器与读写分离服务。
[mariadbmon]
type=monitor
module=mariadbmon
servers=server1,server2
user=monitor_user
password=monitor_password
[readwritesplit]
type=service
module=readwritesplit
servers=server1,server2
router_options=transaction_replay=true
[listener]
type=listener
service=readwritesplit
protocol=MySQLListener
port=3306为什么会这样
MaxScale 通过解析 SQL 语句类型自动分发请求,写操作强制路由至主库,读操作按需分发至从库。
作为数据库中间件,MaxScale 位于应用与数据库之间,内置的路由模块(如 readwritesplit)会识别 SQL 是 SELECT 还是 INSERT/UPDATE/DELETE。监控模块(monitor)实时探测后端节点状态,确保主库故障时能切换路由。这种机制对应用透明,但依赖主从复制的实时性,若复制延迟过高,读请求可能获取不到最新写入的数据。
分步处理
配置过程分为安装、账号准备、配置文件修改、服务启动四个阶段,每一步需确认状态后再继续。
1. 准备数据库账号
在后端 MariaDB 主库创建监控账号,需授予 REPLICATION CLIENT 权限,否则 MaxScale 无法判断主从状态。
CREATE USER 'monitor_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION CLIENT ON *.* TO 'monitor_user'@'%';2. 配置 maxscale.cnf
编辑配置文件,定义后端服务器节点、监控器、服务和监听器。确保 server 段落中正确标记 master 和 slave 角色,或依赖监控器自动识别。
3. 启动与启用服务
启动 MaxScale 服务后,使用 maxctrl 工具启用监控器和服务,确保状态为 Running。
maxctrl enable monitor mariadbmon
maxctrl enable service readwritesplit4. 配置防火墙
开放 MaxScale 监听端口(默认 3306)及管理端口(默认 8989),确保应用服务器能连通。
怎么验证是否生效
通过 maxctrl 命令查看服务状态,并在应用端执行读写测试确认路由路径。
1. 检查服务状态
执行 maxctrl list services,确认 readwritesplit 服务状态为 Running,且后端服务器连接数正常。
2. 验证读写路由
连接 MaxScale 端口,执行 SELECT @@server_id 多次,观察返回 ID 是否在不同从库间变化;执行 INSERT 语句后立刻查询,确认数据可见性。
3. 查看日志
检查 /var/log/maxscale/maxscale.log,确认无 Authentication failed 或 Replication lag warning 等报错信息。
常见坑
配置过程中容易忽略事务一致性处理和监控账号权限不足,导致读写分离失效或数据错误。
- 事务内读请求:默认情况下,事务内的读请求会被路由到主库以保证一致性,若配置错误可能导致事务报错。
- 监控权限缺失:监控账号缺少 REPLICATION CLIENT 权限会导致 MaxScale 无法识别主库,所有请求可能失败。
- 复制延迟风险:业务若强依赖刚写入的数据立刻可读,需关闭读写分离或设置路由策略为“主库读”。
- 用户同步问题:后端数据库的用户账号和权限需保持一致,否则路由到从库时可能报 Access denied。
常见问题
读写分离会影响事务一致性吗?
默认配置下事务内的读请求会路由到主库,保证一致性,但事务外的读请求可能读到旧数据。
主库故障后 MaxScale 能自动切换吗?
配置了高可用监控模块(如 mariadbmon)后可以自动切换,但需确保参数 auto_failover 已启用。
应用端需要修改代码吗?
不需要修改业务代码,只需将数据库连接地址改为 MaxScale 的 IP 和端口即可。
参考来源
- MariaDB Official Documentation, "MaxScale Documentation", https://mariadb.com/docs/server/maxscale/
- MariaDB Knowledge Base, "Configuring MaxScale for Read/Write Splitting", https://mariadb.com/kb/en/maxscale-read-write-splitting/