MySQL主从复制架构下,读写分离可以有效分担主库压力,提升整体数据库性能,而MaxScale作为MariaDB官方推出的数据库代理中间件,能够自动识别读写请求并转发到对应的主从节点,是实现读写分离的高效工具。

环境准备
首先需要准备好基础环境,假设我们有1个MySQL主库和2个MySQL从库,节点信息如下:
| 节点角色 | IP地址 | 端口 | 账号权限 |
|---|---|---|---|
| 主库 | 192.168.0.10 | 3306 | 有复制权限和读写权限 |
| 从库1 | 192.168.0.11 | 3306 | 有只读权限 |
| 从库2 | 192.168.0.12 | 3306 | 有只读权限 |
所有节点需要提前完成MySQL主从复制配置,确保从库能够正常同步主库数据,同时需要准备一个用于MaxScale连接数据库的统一账号,这里创建账号maxscale_user,密码为maxscale_pwd,赋予所有节点的SELECT, INSERT, UPDATE, DELETE, REPLICATION SLAVE, REPLICATION CLIENT权限。
安装MaxScale
这里以CentOS系统为例,先下载对应版本的MaxScale安装包,安装完成后启动服务并设置开机自启:
# 下载MaxScale安装包,这里以2.5版本为例 wget https://dlm.mariadb.com/browse/mariadb_maxscale/2.5/centos/7/x86_64/rpms/maxscale-2.5.20-1.centos.7.x86_64.rpm # 安装依赖 yum install -y libaio # 安装MaxScale rpm -ivh maxscale-2.5.20-1.centos.7.x86_64.rpm # 启动MaxScale服务 systemctl start maxscale # 设置开机自启 systemctl enable maxscale
配置MaxScale实现读写分离转发
MaxScale的配置文件路径为/etc/maxscale.cnf,我们需要修改配置文件定义服务器、监控模块、路由模块和服务端口。
定义后端MySQL服务器
首先在配置文件中添加所有MySQL节点的定义:
# 定义主库节点 [server1] type=server address=192.168.0.10 port=3306 protocol=MariaDBBackend # 定义从库1节点 [server2] type=server address=192.168.0.11 port=3306 protocol=MariaDBBackend # 定义从库2节点 [server3] type=server address=192.168.0.12 port=3306 protocol=MariaDBBackend
配置监控模块
监控模块用于检测MySQL节点的状态,识别主从角色,这里使用mariadbmon监控模块:
[MySQL-Monitor] type=monitor module=mariadbmon servers=server1,server2,server3 user=maxscale_user password=maxscale_pwd monitor_interval=2000 # 自动处理主从切换 auto_failover=true auto_rejoin=true
配置读写分离路由模块
路由模块负责将读写请求转发到对应的节点,使用readwritesplit路由模块实现读写分离:
[Read-Write-Service] type=service router=readwritesplit servers=server1,server2,server3 user=maxscale_user password=maxscale_pwd # 读请求负载均衡到所有从库 slave_selection_criteria=LEAST_GLOBAL_CONNECTIONS # 事务内的请求都发往主库 transaction_replay=true
配置监听端口
最后定义MaxScale对外提供服务的监听端口,客户端通过此端口访问数据库:
[Read-Write-Listener] type=listener service=Read-Write-Service protocol=MariaDBClient port=4006
配置完成后重启MaxScale服务使配置生效:
systemctl restart maxscale
验证读写分离转发效果
我们可以通过以下步骤验证MaxScale是否正常工作:
- 查看MaxScale状态,确认所有节点都被正确识别:
maxctrl list servers
如果输出中主库状态为Master,从库状态为Slave,说明监控模块工作正常。
- 使用MySQL客户端连接MaxScale的监听端口,执行读写操作验证转发:
# 连接MaxScale代理端口
mysql -h 127.0.0.1 -P 4006 -u maxscale_user -p
# 输入密码后执行写操作
INSERT INTO test_db.test_table (name) VALUES ('test_write');
# 执行读操作
SELECT * FROM test_db.test_table;
可以开启MySQL的通用日志,查看写操作是否记录在主库日志中,读操作是否记录在从库日志中,确认读写分离转发生效。
注意事项
配置过程中需要注意,MaxScale连接数据库的账号需要有足够的权限,否则无法正确识别主从状态。如果主从复制出现延迟,读请求可能会获取到旧数据,需要根据业务场景设置合理的延迟阈值。另外生产环境中建议对MaxScale做高可用部署,避免单点故障影响数据库访问。