---
title: Mycat原理
description: "Mycat的原理中最重要的一个动词是“拦截”，它拦截了用户发送过来的SQL语句，首先对SQL语句做了一些特定的分析：如分片分析、路由分析、读写分离分析、缓存分析等，然后将此SQL发往后端的真实数据库，并将返回的结果做适当的处理，最终再返回给用户。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmycat_03_0005.html
sourcePath: /source/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengmycat_03_0005.html
indexId: 69db1067e0315d7db1c0ff94f3e7440695a39016d47a7c5fe88dbcf7f05cb77669
---
# Mycat原理

Mycat的原理中最重要的一个动词是“拦截”，它拦截了用户发送过来的SQL语句，首先对SQL语句做了一些特定的分析：如分片分析、路由分析、读写分离分析、缓存分析等，然后将此SQL发往后端的真实数据库，并将返回的结果做适当的处理，最终再返回给用户。

Mycat收到一个SQL时，会先解析这个SQL，查找涉及到的表，然后看此表的定义，如果有分片规则，则获取到SQL里分片字段的值，并匹配分片函数，得到该SQL对应的分片列表，然后将SQL发往这些分片去执行，最后收集和处理所有分片返回的结果数据，并输出到客户端。

以select * from Orders where prov=?语句为例，查询到prov=wuhan时，按照分片函数，wuhan返回dn1，于是SQL就发给了MySQL，去取DB1上的查询结果，并返回给用户。

Mycat作为一个开源的分布式数据库中间件，旨在增强和扩展MySQL数据库的功能。通过Mycat，可以实现MySQL数据库的读写分离策略。Mycat还能够检测后端MySQL数据库的状态，并支持故障转移机制来保证MySQL服务的高可用性。

#### Mycat for MySQL读写分离

Mycat的读写分离依赖于MySQL的主从复制架构，在Mycat的读写分离配置中，writeHost表示主节点，readHost表示从节点，正常情况下，Mycat会将第一个writeHost作为写节点，所有的DML SQL会发送给此节点，此节点写入数据后，通过主从复制，主节点和从节点的数据保持一致。若Mycat开启了读写分离，则Select SQL会根据读写分离策略发往readHost执行。

图1 Mycat for MySQL读写分离


#### Mycat for MySQL高可用

Mycat作为一个代理层中间件，Mycat系统的高可用涉及到Mycat本身的高可用以及后端MySQL的高可用。MySQL高可用方案都可以在此用来确保Mycat所连接的后端MySQL服务的高可用性，在大多数情况下，建议采用标准的MySQL主从复制高可用性配置并交付给Mycat来完成后端MySQL节点的主从自动切换。

图2 Mycat for MySQL高可用

如上图所示，writeHost表示主节点，readHost表示从节点，同时Mycat内部定期对一个dataHost里的所有writeHost与readHost节点发起心跳检测，当一个dataHost里面配置了多个writeHost时，如果第一个writeHost宕机，则Mycat会在默认的3次心跳检查失败后，自动切换到下一个可用的writeHost，并在conf/dnindex.properties文件里记录当前所用的writeHost的index。Mycat只负责SQL语句的分发，数据源的主动同步依赖MySQL数据库自身的功能，如果对数据一致性比较高的环境，建议将switchType设置2，保证数据的一致性。当原来配置的MySQL writeHost宕机恢复以后，重新加入Mycat，恢复后的MySQL writeHost作为从节点，跟随新的主节点，重新配置主从同步。
