MaxScale可连接MySQL副本但无法执行查询问题求助
排查步骤与解决方案
一、只读服务路由Slave查询被拒问题
1. 核对Slave节点的MaxScale账号权限
MySQL 8.0权限机制有变化,得确保MaxScale用的账号在Slave上有全局SELECT权限,还要有REPLICATION CLIENT权限(MaxScale用来检测主从状态):
- 登录Slave执行:
SELECT user, host, select_priv FROM mysql.user WHERE user='maxscale_user'; - 确认
host是MaxScale服务器IP或者合理范围(别随便用%),select_priv为Y - 缺权限的话补一下:
GRANT SELECT, REPLICATION CLIENT ON *.* TO 'maxscale_user'@'maxscale_host'; - 刷新权限:
FLUSH PRIVILEGES;
2. 检查Slave的防火墙与监听配置
能连接但查询被拒,大概率是防火墙限制了持续会话,或者MySQL只监听本地:
- 查看Slave的
my.cnf/my.ini,确认bind-address设为0.0.0.0或者允许MaxScale的IP - 检查防火墙规则,比如
iptables -L -n或者firewall-cmd --list-all,确保MaxScale的IP能无限制访问3306端口
3. 验证SSL配置(如果启用)
要是MySQL开了SSL,MaxScale的SSL参数必须和Slave匹配:
- 登录Slave执行:
SHOW VARIABLES LIKE '%ssl%';确认SSL状态 - 检查MaxScale配置里的
ssl、ssl_cert等参数,和Slave的SSL证书路径一致 - 必要时给MaxScale账号开启SSL要求:
ALTER USER 'maxscale_user'@'maxscale_host' REQUIRE SSL;
二、读写分离服务会话挂起问题
1. 检查读写分离路由配置
确认MaxScale里readwritesplit模块的参数没毛病:
- 确保
master指向正确主库,slave指向从库,或者用server_regex自动识别主从 - 核对
max_slave_connections、transaction_support(设为true,适配MySQL 8.0事务)这些参数 - 避免因连接数限制导致挂起,
max_connections别设太小
2. 扒MaxScale日志找线索
直接看MaxScale日志(默认路径/var/log/maxscale/maxscale.log),过滤错误信息:
- 执行:
grep -i "error\|hang\|timeout" /var/log/maxscale/maxscale.log - 重点看和Slave连接相关的超时、权限报错,比如
connection refused、permission denied
3. 确认节点状态与连接池
- 用
maxadmin list servers查看所有节点状态,Slave必须是Synced状态,状态异常会导致路由崩溃 - 检查连接池的
idle_timeout参数,别让闲置连接过早被回收,导致会话挂起
三、通用排查动作
- 直接在MaxScale服务器上测试Slave连接:
- 用MySQL客户端连Slave:
mysql -h slave_ip -u maxscale_user -p,执行SELECT 1;,如果也报错,说明问题不在MaxScale,是Slave本身的问题
- 用MySQL客户端连Slave:
- 适配MySQL 8.0认证插件:
- MySQL 8.0默认用
caching_sha2_password,MaxScale 2.4及以上版本才支持,要是MaxScale版本低,要么升级,要么把账号改成旧插件:ALTER USER 'maxscale_user'@'maxscale_host' IDENTIFIED WITH mysql_native_password BY 'your_password';
- MySQL 8.0默认用
- 确保MaxScale和MySQL版本兼容:
- 尽量用最新稳定版MaxScale,避免版本不匹配导致的奇怪问题
内容的提问来源于stack exchange,提问作者Kalana Dananjaya
相关产品推荐
相关产品推荐

