宝塔面板本身不提供读写分离功能,所有路由逻辑必须由中间件(如MyCat、ProxySQL)或应用代码承担;主从复制未配稳则中间件无效,常见卡点包括Slave_IO_Running或Slave_SQL_Running为No、主库未开log-bin、server-id重复、从库未设read_only=1、binlog_format为STATEMENT导致数据不一致等。

宝塔面板本身不提供读写分离功能,所有路由逻辑必须由中间件或应用代码承担;直接在宝塔里点几下就生效的方案不存在。
主从复制没配稳,中间件全是摆设
MyCat、ProxySQL 或 PHP 框架的读写分离都依赖底层 MySQL 主从同步正常。常见卡点:
-
SHOW SLAVE STATUS\G中Slave_IO_Running或Slave_SQL_Running任一为No,说明复制中断,后续所有读请求都会查到过期数据 - 主库未开启
log-bin,或server-id为 0 / 重复,从库START SLAVE会直接报错 - 从库没设
read_only=1,应用误连从库执行UPDATE会导致主从数据 divergence - 主库
binlog_format是STATEMENT,某些函数(如NOW()、UUID())在从库重放时结果不一致
用 MyCat 代理时,端口和连接地址最容易填错
宝塔只负责部署环境,MyCat 运行、配置、端口暴露全靠手动。关键动作:
- 必须在宝塔【安全】页面放行
8066(MyCat 默认端口),不能只开3306 -
schema.xml里<writehost></writehost>和<readhost></readhost>的host填的是 MySQL 实际 IP + 端口(如192.168.1.10:3306),不是localhost—— 容器或跨服务器部署时尤其容易错 - PHP 应用连接字符串必须指向
127.0.0.1:8066(或服务器公网IP:8066),不是原来的localhost:3306;否则请求绕过 MyCat 直达主库 - 如果用了 Nginx 反向代理数据库(极不推荐),别把
proxy_pass指向127.0.0.1:3306,那是 MySQL 本体,不是 MyCat
PHP 框架内原生读写分离,read/write 配置项必须结构完整
Laravel、ThinkPHP 等支持声明式读写分离,但字段名、嵌套层级稍错就退化为单库连接:
- Laravel 的
config/database.php中,'mysql'驱动下必须同时存在'read'和'write'键,且值为数组:'read' => ['host' => ['192.168.1.11', '192.168.1.12']],不能只写'host' - ThinkPHP 的
database.php要启用'deploy' => 1并明确指定'rw_separate' => true,否则read_host和write_host不生效 - 所有从库连接账号必须只有
SELECT权限,主库账号不能在从库上执行INSERT/UPDATE—— 框架不会帮你校验权限,只管发请求 - 框架不自动处理“写后立即读”场景,比如
Order::create(...)后立刻Order::find(),仍可能从从库读不到,得手动切回主库连接
别忽略主从延迟导致的脏读,这是 MySQL 复制机制决定的
哪怕 Seconds_Behind_Master 显示为 0,网络抖动、大事务、从库负载高都会造成瞬时延迟。业务层必须有兜底:
- 用户提交表单后跳转详情页这类强一致性场景,不要依赖框架自动路由,显式用
$master_db->query("SELECT ...")查主库 - 缓存(Redis)比从库更适合作为读热点数据的出口:写主库 → 写缓存 → 读缓存,绕过从库延迟
- MyCat 的
sqlRouter或 ProxySQL 的apply_mysql_query_rules_on_hostgroup无法消除物理延迟,它们只是 SQL 分类器,不是时间机器
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











