MyCat读写分离需正确配置schema.xml中dataHost的balance值:balance="0"表示所有读走主库,balance="1"或"3"才启用读写分离;ProxySQL则依赖mysql_query_rules正则匹配SELECT语句并路由至从库组,且须配置max_replication_lag规避延迟问题。

MyCat配置读写分离时,schema.xml里balance值必须设对
MyCat本身不自动识别SQL是读还是写,它靠schema.xml中dataHost节点的balance参数决定读请求怎么分发。设错就等于没做读写分离。
常见错误是把balance="0"当成“关闭”,其实它表示「所有读都发给写节点」——也就是全走主库,完全失去分流意义。真正启用读写分离得用balance="1"(读请求在所有readHost和备用writeHost间轮询)或balance="3"(只发给readHost,不碰备用主库)。
-
writeType="0":写操作只发给第一个writeHost,这是安全做法;设成1会尝试多主写,但MyCat不支持真正的多主同步,容易丢数据 -
switchType="1":主库宕机时自动切到从库(需配合heartbeat检测);设成-1就彻底不切换,主挂了整个写链路就断 - 每个
readHost必须显式配置weight,否则默认为1,无法做读负载倾斜
ProxySQL路由规则要匹配SELECT开头的语句,不能只靠注释
ProxySQL默认不解析SQL语义,它靠正则匹配来判断读写。很多人误以为加/*+ read_from_slave */注释就能走从库,但若没在mysql_query_rules表里配对应规则,注释会被直接忽略。
实际生效的关键是插入一条明确的match_pattern规则:
INSERT INTO mysql_query_rules (active, match_pattern, destination_hostgroup, apply) VALUES (1, '^SELECT.*', 2, 1);
其中destination_hostgroup=2必须指向你预先定义好的从库组(mysql_servers里hostgroup_id=2的节点)。注意:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 正则开头用
^SELECT,不是select——ProxySQL默认区分大小写 - 如果应用用了ORM(如MyBatis),生成的SQL可能带换行或空格,建议用
^[\s]*SELECT更鲁棒 - 写操作不需要显式规则,默认落到
hostgroup_id=1(主库组),但得确保mysql_replication_hostgroups里已声明主从关系,否则健康检查失败会导致路由异常
主从延迟导致“写后立即读不到”,MyCat和ProxySQL处理方式完全不同
主从同步有毫秒级延迟,用户刚插入数据马上查,从库还没同步完,就会查不到。MyCat对此无内置缓解机制,只能靠业务层加/*#mycat:db_type=master*/强制走主库,或者手动sleep——这违背了中间件透明性原则。
ProxySQL则可通过mysql_servers表的max_replication_lag字段控制:设为100(单位毫秒),当从库延迟超过100ms,ProxySQL会自动把它从hostgroup_id=2中踢出,后续读请求不会发过去。但这只是规避,不是解决。
- 真正解法在应用侧:涉及“写后必读”的场景(如注册后查用户信息),应统一走主库,不要依赖中间件自动识别
- ProxySQL的
max_replication_lag检测依赖show slave status里的Seconds_Behind_Master,MySQL 8.0.22+才支持基于GTID的更精准延迟计算 - MyCat的
heartbeat只检查连通性,不查复制延迟,所以它无法动态下线延迟大的从库
部署后必须验证mysql_server状态和查询日志,不能只看连接成功
连上MyCat或ProxySQL端口不代表读写分离生效。MyCat要查@@datasource确认当前连接的数据源名;ProxySQL则必须查stats_mysql_query_digest看实际执行的hostgroup是否符合预期。
最容易被忽略的是权限问题:
- MyCat连接后端MySQL时,用的是
server.xml里配置的账号,该账号必须在主从库都有同名同密权限,且REPLICATION SLAVE权限仅需在主库授予,但从库账号也得能连上(否则心跳失败) - ProxySQL自身需要
SELECT权限访问performance_schema.replication_connection_status(MySQL 8.0+)或SHOW SLAVE STATUS(MySQL 5.7),否则max_replication_lag功能失效 - Docker部署时,宿主机时间不同步会导致
Seconds_Behind_Master显示负值,ProxySQL会误判从库异常——务必先校准容器内时间

















