如何使用maxscale实现mysql读写分离
在 MySQL 5.7 上使用 MaxScale 配置读写分离
以下是针对 MySQL 5.7 使用 MaxScale 实现读写分离的详细步骤,考虑了 MySQL 5.7 的特性和兼容性,确保配置稳定高效。
环境说明
- 数据库版本:MySQL 5.7.x
- 主从架构:至少一个主节点和一个或多个从节点,已配置好主从复制
- MaxScale 版本:推荐使用 MaxScale 2.5.x(稳定,兼容 MySQL 5.7)
- 操作系统:以 Ubuntu/Debian 或 CentOS 为例
1. 安装 MaxScale
选择兼容版本
MySQL 5.7 发布于 2015 年,推荐使用 MaxScale 2.5.x(如 2.5.20),避免较新版本(如 23.x)可能出现的兼容性问题。
安装步骤(以 Ubuntu 18.04 为例)
-
添加 MariaDB 仓库:
sudo apt-get install -y curl curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-maxscale-version=2.5.20
-
安装 MaxScale:
sudo apt-get update sudo apt-get install maxscale
-
验证安装:
maxscale --version
输出类似
maxscale 2.5.20
,表示安装成功。 -
启动 MaxScale:
sudo systemctl start maxscale sudo systemctl enable maxscale
CentOS 7 示例:
sudo yum install https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
sudo yum install maxscale-2.5.20
sudo systemctl start maxscale
注意:
- 如果无法获取 MaxScale 2.5,可从 MariaDB 官网 下载 RPM/DEB 包手动安装。
- 确保防火墙允许 MaxScale 监听端口(默认 3306 或自定义)。
2. 配置 MySQL 5.7 主从复制
MaxScale 的读写分离依赖于 MySQL 的主从复制。确保主从架构已正确配置。
主节点配置(/etc/my.cnf
或 /etc/mysql/my.cnf
)
[mysqld]
server-id=1
log_bin=mysql-bin
binlog_format=ROW
bind-address=0.0.0.0
从节点配置(每个从节点不同 server-id
)
[mysqld]
server-id=2
relay_log=relay-log
read_only=1
bind-address=0.0.0.0
设置主从复制
-
主节点创建复制用户:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_password'; FLUSH PRIVILEGES;
-
查看主节点状态:
SHOW MASTER STATUS;
记录
File
和Position
。 -
从节点配置主节点信息:
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=123; START SLAVE;
-
验证从节点状态:
SHOW SLAVE STATUS\G
确保
Slave_IO_Running
和Slave_SQL_Running
为Yes
。
3. 配置 MaxScale
MaxScale 使用配置文件(默认 /etc/maxscale.cnf
)定义后端服务器、监控和服务。
创建配置文件
如果 /etc/maxscale.cnf
不存在,复制模板:
sudo cp /usr/share/maxscale/maxscale.cnf.template /etc/maxscale.cnf
配置步骤
(1) 定义后端服务器
编辑 /etc/maxscale.cnf
,添加 MySQL 5.7 主从节点信息:
[maxscale]
threads=auto
log_info=true
# 主节点
[server1]
type=server
address=192.168.1.10
port=3306
protocol=MariaDBBackend
# 从节点 1
[server2]
type=server
address=192.168.1.11
port=3306
protocol=MariaDBBackend
# 从节点 2(可选)
[server3]
type=server
address=192.168.1.12
port=3306
protocol=MariaDBBackend
说明:
address
:MySQL 节点的 IP(主节点192.168.1.10
,从节点192.168.1.11
等)。protocol=MariaDBBackend
:MySQL 5.7 兼容此协议。log_info=true
:启用详细日志,便于调试。
(2) 配置监控模块
MaxScale 需要监控主从状态以分配角色。使用 mariadbmon
模块:
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3
user=monitor
password=monitor_password
monitor_interval=2000
auto_failover=false
auto_rejoin=true
说明:
module=mariadbmon
:适合 MySQL 5.7 的主从监控。servers
:列出所有后end服务器。user
和password
:MySQL 监控用户。monitor_interval
:监控频率(毫秒)。auto_failover=false
:MySQL 5.7 不建议启用自动主从切换(需 GTID)。auto_rejoin=true
:允许从节点重新加入集群。
创建监控用户(在 MySQL 主从节点上):
CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor_password';
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'monitor'@'%';
GRANT SELECT ON mysql.* TO 'monitor'@'%';
FLUSH PRIVILEGES;
注意:
- MySQL 5.7 需授予
mysql.*
表的SELECT
权限,以便mariadbmon
读取用户表。 - 确保
monitor
用户能从 MaxScale 的 IP 访问。
(3) 配置读写分离服务
添加服务以实现读写分离:
[ReadWriteService]
type=service
router=readwritesplit
servers=server1,server2,server3
user=app_user
password=app_password
max_slave_connections=100%
enable_root_user=false
说明:
router=readwritesplit
:写操作路由到主节点,读操作路由到从节点。user
和password
:应用连接 MySQL 的账户。max_slave_connections
:从节点连接分配比例(100% 表示均衡使用)。enable_root_user=false
:禁用 root 用户连接。
创建应用用户(在 MySQL 主从节点上):
CREATE USER 'app_user'@'%' IDENTIFIED BY 'app_password';
GRANT ALL ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
注意:
- MySQL 5.7 默认使用
mysql_native_password
,MaxScale 2.5 完全支持。
(4) 配置监听器
定义客户端连接的监听器:
[ReadWriteListener]
type=listener
service=ReadWriteService
protocol=MariaDBClient
port=3306
说明:
port
:MaxScale 监听端口(可自定义,如 4006)。protocol=MariaDBClient
:兼容 MySQL 5.7。
(5) 保存并重启
保存 /etc/maxscale.cnf
后,重启 MaxScale:
sudo systemctl restart maxscale
4. 验证配置
-
检查 MaxScale 状态:
maxctrl show servers
输出示例:
Server: server1 Status: Master, Running Server: server2 Status: Slave, Running Server: server3 Status: Slave, Running
-
检查监控状态:
maxctrl show monitor MariaDB-Monitor
确保状态为
Running
。 -
检查服务:
maxctrl show service ReadWriteService
5. 连接 MaxScale
应用通过 MaxScale 的监听端口连接:
连接示例:
mysql -u app_user -papp_password -h 127.0.0.1 -P3306
应用连接配置:
- 主机:MaxScale 的 IP(如
127.0.0.1
) - 端口:
3306
(或自定义端口) - 用户和密码:
app_user
/app_password
6. 测试读写分离
-
测试写操作:
USE app_db; INSERT INTO test_table (column_name) VALUES ('test');
检查主节点(
192.168.1.10
),数据应写入。 -
测试读操作:
SELECT * FROM test_table;
检查从节点(
192.168.1.11
或192.168.1.12
),请求应路由到从节点。 -
验证路由:
查看 MaxScale 日志(/var/log/maxscale/maxscale.log
)或服务统计:maxctrl show service ReadWriteService
7. 高级配置(可选)
-
控制复制延迟:
设置最大延迟:[ReadWriteService] max_replication_lag=1
-
负载均衡:
为从节点设置权重:[server2] weight=100 [server3] weight=50
-
事务一致性:
启用事务重放:[ReadWriteService] transaction_replay=true
-
高可用性:
部署多个 MaxScale 实例,使用 Keepalived 或负载均衡器。
8. MySQL 5.7 特有注意事项
-
认证插件:
- MySQL 5.7 默认使用
mysql_native_password
,MaxScale 2.5 无需额外配置。
- MySQL 5.7 默认使用
-
GTID 支持:
- MySQL 5.7 支持 GTID,但配置复杂。建议禁用:
[MariaDB-Monitor] detect_replication_lag=true gtid_compare=false
- MySQL 5.7 支持 GTID,但配置复杂。建议禁用:
-
权限问题:
- 确保
monitor
和app_user
有%
主机权限:GRANT ALL ON app_db.* TO 'app_user'@'%';
- 确保
-
日志兼容性:
- 禁用慢查询日志和一般查询日志:
[mysqld] slow_query_log=0 general_log=0
- 禁用慢查询日志和一般查询日志:
-
复制格式:
- 确保
binlog_format=ROW
。
- 确保
9. 常见问题与排查
-
连接失败:
- 检查日志:
/var/log/maxscale/maxscale.log
- 确保 MySQL 用户有
%
主机权限:SELECT User, Host FROM mysql.user;
- 验证端口:
netstat -tuln | grep 3306
- 检查日志:
-
主从角色错误:
- 检查
mariadbmon
:maxctrl show monitor MariaDB-Monitor
- 验证 MySQL 复制:
SHOW SLAVE STATUS\G
- 检查
-
读写分离不生效:
- 确认
readwritesplit
:maxctrl show service ReadWriteService
- 确认
-
复制延迟:
- 检查延迟:
maxctrl show servers
- 调整
max_replication_lag
。
- 检查延迟:
10. 总结
- MaxScale 2.5 是 MySQL 5.7 的理想代理工具,通过
readwritesplit
实现读写分离。 - 配置流程:安装 → 配置 MySQL 主从 → 定义 MaxScale 服务器、监控、服务和监听器 → 测试。
- 注意 MySQL 5.7 的认证、GTID 和权限配置。