鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

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作为从节点,跟随新的主节点,重新配置主从同步。