Mycat 一、Mycat介绍

一、 Mycat介绍

1、 是什么

1.1、 数据库中间件

前身是阿里的cobar

2、 干什么的

2.1、 读写分离

2.2、 数据分片

垂直拆分

水平拆分

垂直+水平拆分

1.1、 多数据源整合

1、 原理

  1.  

2.1、 “拦截”

Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了

一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,

并将返回的结果做适当的处理,最终再返回给用户

这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用mycat还是mysql。

二、 安装启动

1、 安装解压

解压缩文件拷贝到linux下 /usr/local/

2、 配置文件介绍

  • xml

定义逻辑库,表、分片节点等内容

  • xml

定义分片规则

  • xml

定义用户以及系统相关变量,如端口等

3、 配置文件修改

  • 修改配置文件xml(2)修改配置文件xml

    5、 启动程序

    • 控制台启动 :去mycat/bin 目录下 mycat console
    • 后台启动 :去mycat/bin 目录下 mycat start

    6、 启动时问题解决

           (1)问题:域名解析失败

    三、 读写分离

    1、 配置文件修改

    (1)修改配置文件xml

    Balance——负载均衡类型,目前的取值有4 种:

    1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
    2. balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
    3. balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
    4. balance="3",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力

      2、 重启Mycat

      重启Mycat,让新配置生效

       

      3、 验证

      (1)创建表

    3、 重启Mycat

    重启Mycat,让新配置生效

    4、 验证

    • 连接Mycat执行4个表的建表语句
    • 执行成功后,分别去两个数据库查看,客户表在一个库,订单相关3张表在另一个库

      五、 水平分表

      1、 选择水平分表

      • 订单表orders表已经有600万数据超过MySQL单表数据瓶颈,需要进行水平分表
      • 鉴于订单表特性,无论是按照id、时间进行分表均不合适,应该保证每个人的订单在同一张表里。所以应该按照客户id(customer_id)进行分表,具体做法:按照客户id取模平均分配到两张表里。

      2、 配置文件修改

        • 1、 本地文件方式

          不推荐,如在Mycat主机中用本地文件方式创建全局序列,当这台机器宕机时会出现,序列文件丢失,造成序列冲突问题

           

          2、 数据库方式

          1.  
          2.  

          2.1、 原理

          验证修改配置文件xml(2)执行成功后,分别去两个数据库查看,两个客户的订单已分到两个表里。

          六、 跨库关联查询

          1、 ER表

          为了相关联的表的行尽量分在一个库下,订单详情表(orders_detail)与订单表紧密关联,订单表分表,为保证关联查询结果正确,必须对订单详情表进行分表,用ER表的方式参考订单表的分表进行分表。

          (1)修改配置文件xml

          执行成功后,分别去两个数据库查看,两个客户的订单详情已分到两个表里。可以把订单表和订单详情表关联查询,可以查询到正确结果。

           

          2、 全局表

          设定为全局的表,会直接复制给每个数据库一份,所有写操作也会同步给多个库。

          所以全局表一般不能是大数据表或者更新频繁的表。

          一般是字典表或者系统表为宜。

          (1)修改配置文件xml
          • 重启Mycat

          先在另一个库里创建订单状态字典表,之后重启Mycat,让新配置生效

          • 验证

          连接Mycat向订单状态字典表插入数据

          执行成功后,分别去两个数据库查看,两个订单状态字典表都有全量数据.

           全局序列

          1、 本地文件方

          不推荐,如在Mycat主机中用本地文件方式创建全局序列,当这台机器宕机时会出现,序列文件丢失,造成序列冲突问题

          2、 数据库方式

          2.1、 原理

          利用数据库一个表 来进行计数累加。但是并不是每次生成序列都读写数据库,这样效率太低mycat会预加载一部分号段到mycat的内存中,这样大部分读写序列都是在内存中完成的。如果内存中的号段用完了 mycat会再向数据库要一次。

           

          问题:那如果mycat崩溃了 ,那内存中的序列岂不是都没了?

          是的。如果是这样,那么mycat启动后会向数据库申请新的号段,原有号段会弃用。也就是说如果mycat重启,那么损失是当前的号段没用完的号码,但是不会因此出现主键重复。

          2.1、 创建脚本

          2.3、 修改配置

          • 修改配置文件properties

            3、 时间戳方式

            用时间戳方式不会出现冲突问题,但长度有18位,比较长

             

            4、 自主生成

            可以根据业务逻辑组合,或者可以利用 redis的单线程原子性 incr来生成序列。