Mycat 一、Mycat介绍
一、 Mycat介绍
1、 是什么
1.1、 数据库中间件
前身是阿里的cobar
2、 干什么的
2.1、 读写分离
2.2、 数据分片
垂直拆分
水平拆分
垂直+水平拆分
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)修改配置文件xmlBalance——负载均衡类型,目前的取值有4 种:
- balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
- balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
- balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
- 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、 数据库方式
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来生成序列。
-