Mycat总结

mycat简介

基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。

MYCAT背后有一支强大的技术团队,其参与者都是5年以上资深软件工程师、架构师、DBA等,优秀的技术团队保证了MYCAT的产品质量。

MYCAT并不依托于任何一个商业公司,因此不像某些开源项目,将一些重要的特性封闭在其商业产品中,使得开源项目成了一个摆设

最新可下载的release版本是1.6-RELEASE
未来规划(mycat2.x)
* 完全实现分布式事务,完全的支持分布式。
* 通过Mycat web(eye)完成可视化配置,及智能监控,自动运维。
* 通过mysql 本地节点,完整的解决数据扩容难度,实现自动扩容机制,解决扩容难点。
* 支持基于zookeeper的主从切换及Mycat集群化管理。
* 通过Mycat Balance 替代第三方的Haproxy,LVS等第三方高可用,完整的兼容Mycat集群节点的动态上下线。
* 接入Spark等第三方工具,解决数据分析及大数据聚合的业务场景。
* 通过Mycat智能优化,分析分片热点,提供合理的分片建议,索引建议,及数据切分实时业务建议

关键特性

  • 支持SQL92标准
  • 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
  • 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
  • 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
  • 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
  • 基于Nio实现,有效管理线程,解决高并发问题。
  • 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
  • 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
  • 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
  • 支持多租户方案。
  • 支持分布式事务(弱xa)。
  • 支持XA分布式事务(1.6.5)。
  • 支持全局序列号,解决分布式下的主键生成问题。
  • 分片规则丰富,插件化开发,易于扩展。
  • 强大的web,命令行监控。
  • 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
  • 支持密码加密
  • 支持服务降级
  • 支持IP白名单
  • 支持SQL黑名单、sql注入攻击拦截
  • 支持prepare预编译指令(1.6)
  • 支持非堆内存(Direct Memory)聚合计算(1.6)
  • 支持PostgreSQL的native协议(1.6)
  • 支持mysql和oracle存储过程,out参数、多结果集返回(1.6)
  • 支持zookeeper协调主从切换、zk序列、配置zk化(1.6)
  • 支持库内分表(1.6)
  • 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。

适用场景

  • 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换
  • 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片
  • 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化
  • 报表系统,借助于Mycat的分表能力,处理大规模报表的统计
  • 替代Hbase,分析大数据
  • 作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择

案例

Mycat总结_第1张图片

竞品对比

属性 Mycat Sharding-jdbc
所属公司 基于阿里Cobar二次开发,社区维护 当当
活跃度 社区活跃度很高,一些公司已在使用 未找到相关社区、Q群
资料 资料多,github、官网、Q群、书籍 资料少,github、官网
数据库支持 Oracle、 SQL Server、 Mysql、PG,DB2、mongodb 任意
ORM支持 任意 任意
事务 完全支持 XA 分布式强事务 自带弱XA,最大努力送达型柔性事务
读写分离 支持 支持
分库 支持 支持
分表 支持 支持
开发 开发成本小,代码入侵极小 开发成本高,代码入侵大
运维 维护成本高 维护成本低
监控
限制 SQL语句限制 部分JDBC方法不支持、SQL语句限制

mycat入门

核心概念

  1. 逻辑库(schema)
    在云计算时代,数据库中间件可以当做一个或多个数据库集群构成的逻辑库
  2. 逻辑表(table)
    在分布式数据库中,对于应用来说,读写数据的表就是逻辑表.
    1. 分片表
      分片表是将数据量很大的表切分到多个数据库实例中
    2. 非分片表
      并非所有表在数据量很大时都需要进行分片,某些表可以不用分片
    3. ER表
      关系型数据库是基于实体关系模型的,Mycat中的ER表便来源于此,Mycat提出了基于E-R关系的数据分片策略,子表的记录与其所关联的父表的记录存放在同一个数据分片上,即字表依赖于父表,通过表分组保证数据关联查询不会垮库操作.
    4. 全局表
      在一个真实的业务场景中往往存在大量类似的字典表,这些字典表中的数据变动不频繁,而且数据规模不大,很少超过数十万条的记录,全局表会保证所有分片都复制一份相同的数据.
  3. 分片节点
    将数据切分后,一个大表被分到不同的分片数据库上,每个分片所在的数据库就是分片节点
  4. 节点主机
    将数据切分后,每个分片节点不一定会独占一台机器,同一台机器上可以有多个分片数据库,这样一个活多个分片节点所在的机器就是节点主机.

核心配置

  1. server.xml 配置文件
    server.xml配置文件包含了Mycat的系统配置信息.
  2. schema.xml 配置文件
    schema.xml作为Mycat中最重要的胡配置文件之一,涵盖了Mycat的逻辑库,表,分片规则,分片节点及数据源.
  3. 分片规则rule.xml文件
    定义所有拆分表的规则,可灵活配置分片算法.

分片规则

  1. 取模分片
  2. 枚举分片
  3. 范围分片
  4. 范围求模算法
  5. 固定分片hash算法
  6. 取模范围算法
  7. 字符串hash求模范围算法
  8. 应用指定的算法
  9. 字符串hash解析算法
  10. 一致性hash算法
  11. 按日期(天)分片算法
  12. 按单月小时算法
  13. 自然月分片算法
  14. 日期范围hash算法

管理命令

  1. Reload 命令
    • reload @@config 该命令用于更新配置文件,例如更新schema.xml文件后在命令行窗口中输入该命令,不用重启即可进行配置文件更新.
    • reload @@sqlstat =open/close 开启/关闭SQL监控分析功能
  2. Show 命令
    • show @@connection 获取前端连接状态 (kill @@connection id,id,id 关闭连接)
    • show @@backend 查看后端连接状态
  3. SQL 统计命令
    • show @@sql.slow 显示慢SQL语句
    • show @@sql.sum 显示SQL语句的整体执行情况

mycat 示例

单库分表

<schema name="snaker_test2" checkSQLschema="false" sqlMaxLimit="100">
    <table name="wf_hist_order" subTables="wf_hist_order$1-3" dataNode="snaker"  rule="sharding-by-month"/>
    <table name="wf_hist_task" subTables="wf_hist_task$1-3" dataNode="snaker" rule="sharding-by-month"/>
    <table name="wf_task"  dataNode="snaker"  primaryKey="id" type="global"/>
    <table name="wf_order"  dataNode="snaker"  primaryKey="id" type="global"/>
    <table name="wf_process"  dataNode="snaker"  primaryKey="id" type="global"/>
    <table name="wf_task_actor"  dataNode="snaker"  primaryKey="id" type="global" />
schema>
<dataNode name="snaker" dataHost="snaker_host" database="snaker_test2"/>
<dataHost name="snaker_host" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()heartbeat>
    <writeHost host="snaker_w" url="192.168.101.131:3306" user="xxx"
               password="xxx">
    writeHost>
dataHost>
<tableRule name="sharding-by-month">
    <rule>
        <columns>create_Timecolumns>
        <algorithm>sharding-by-monthalgorithm>
    rule>
tableRule>
<function name="sharding-by-month" class="io.mycat.route.function.PartitionByMonth">
    <property name="dateFormat">yyyy-MM-dd HH:mm:ssproperty>
    <property name="sBeginDate">2017-09-27 00:00:00property>
function>

大表分片

<schema name="mycattest" checkSQLschema="false" sqlMaxLimit="100">
    <table name="readwrite" dataNode="chenyunNode,snakerNode" rule="sharding-by-intfile"/>
schema>
<dataNode name="snakerNode" dataHost="snaker" database="snaker_test2"/>

<dataNode name="chenyunNode" dataHost="chenyun" database="mycattest"/>

<dataHost name="snaker" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()heartbeat>
    <writeHost host="snaker_w" url="192.168.101.131:3306" user="xxx"
               password="xxx"/>
dataHost>

<dataHost name="chenyun" maxCon="1000" minCon="10" balance="3"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()heartbeat>
    <writeHost host="chenyun_w1" url="127.0.0.1:3306" user="xxx"
               password="xxx">

    writeHost>
dataHost>

读写分离

<schema name="mycattest" checkSQLschema="false" sqlMaxLimit="100">
    <table name="readwrite" dataNode="chenyunNode"/>
schema>
<dataNode name="chenyunNode" dataHost="chenyun" database="mycattest"/>
<dataHost name="chenyun" maxCon="1000" minCon="10" balance="3"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()heartbeat>
    <writeHost host="chenyun_w1" url="127.0.0.1:3306" user="xxx"
               password="xxx">
        <readHost host="snaker_s" url="192.168.101.131:3306" user="xxx"
                   password="xxx"/>

    writeHost>
dataHost>

mycat集群与监控

Mycat总结_第2张图片
Mycat总结_第3张图片

mycat架构与原理

Mycat总结_第4张图片

mycat不足与补偿

  • mycat-eye 的SQL表分析读写次数统计不正确
  • 单库分表后不支持表别名

你可能感兴趣的:(mycat)