宝塔面板本身不提供读写分离功能,必须依赖Atlas或MyCat等中间件实现;所有关键配置均在中间件侧,主从复制需手动配置,应用连接须指向中间件端口而非直连MySQL。

宝塔面板本身不提供读写分离功能,必须靠 Atlas 或 MyCat 这类中间件实现;直接在宝塔里点几下是没用的,所有关键配置都在中间件侧。
Atlas 启动失败或连接被拒绝的常见原因
Atlas 是轻量级代理,但默认配置极容易出问题。它不兼容 MySQL 8.0+ 的默认认证插件 caching_sha2_password,启动时日志里常出现 ERROR 1045 (28000): Access denied for user 或直接静默退出。
- 主库用户必须显式指定为
mysql_native_password认证:执行ALTER USER 'atlas_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES; - 配置文件
/usr/local/mysql-proxy/conf/test.cnf中的pwds字段必须 Base64 编码密码,不能明文写;可用echo -n "your_pass" | base64生成 - Atlas 默认监听
127.0.0.1:1234,应用连不上——得改成0.0.0.0:1234,且宝塔防火墙要放行该端口 - 启动命令必须带完整路径:
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf,直接运行mysql-proxy会加载错配置
MyCat 配置中 writeHost/readHost 不生效的典型场景
很多人照着文档填了 schema.xml,但所有 SELECT 请求仍打到主库,balance="1" 像摆设。根本原因是路由规则未触发或数据源未激活。
-
节点里的writeHost必须指向主库真实 IP 和端口(如192.168.1.10:3306),不能写localhost或127.0.0.1(MyCat 容器或远程部署时会连不通) -
readHost必须和writeHost在同一下,且不能只配一个——哪怕只有一个从库,也要写成 - 检查
server.xml中段是否启用了readOnly="false"(写用户)和readOnly="true"(读用户),否则 MyCat 会把所有请求都当写处理 - 应用连接字符串必须用 MyCat 的端口(如
127.0.0.1:8066),且数据库名必须匹配schema.xml中定义的logicalTable名,大小写敏感
为什么 SHOW SLAVE STATUS 显示正常,但 MyCat/Atlas 仍读不到从库数据
这不是中间件问题,而是主从复制本身存在隐性断点:比如主库开了 binlog_ignore_db 却漏配系统库,或从库 SQL 线程卡在某个 DDL 上(Slave_SQL_Running_State 显示 Waiting for table metadata lock)。
- 执行
SHOW SLAVE STATUS\G后,重点看Seconds_Behind_Master是否持续 > 0,以及Exec_Master_Log_Pos是否停滞不动 - 检查从库错误日志:
tail -f /www/server/mysql/data/*.err,常见报错如Could not execute Write_rows_v1 event on table xxx; Error_code: 1032; handler error HA_ERR_END_OF_FILE,说明主从表结构已不一致 - MyCat 日志(
logs/mycat.log)里搜can't get connection或connection refused,确认它是否真连上了从库的 IP:PORT - 用
mysql -h 192.168.1.11 -P 3306 -u readonly -p手动连从库测试 SELECT,排除网络和账号权限问题
真正难的不是配通,而是让读流量稳定落到从库、同时避开主从延迟导致的脏读。业务代码里“写完立刻查”的逻辑,必须绕过中间件走主库直连,这个控制点不在宝塔也不在 MyCat 配置里,而在你自己的 DAO 层。











