Mycat介绍:是什么:
* 数据库中间件,前身是阿里的cobar;
作用:
- 读写分离
- 数据分片 垂直拆分 水平拆分 垂直加水平拆分
- 多数据源整合
垂直加水平拆分结构图:
原理:
1. Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,
2. 首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,
3. 然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户;
效果作用:
* 这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用mycat还是mysql。
读写分离:
原理图:
配置步骤图:
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 不负担读压力
分库:
原理图:
配置步骤图:
分表:
原理图:
配置步骤图:
ER表:
* 为了相关联的表的行尽量分在一个库下;
全局表:
* 设定为全局的表,会直接复制给每个数据库一份,所有写操作也会同步给多个库。
* 所以全局表一般不能是大数据表或者更新频繁的表;
* 一般是字典表或者系统表为宜。
全局序列(三种方式):
1. 本地文件(不推荐)
2. 数据库序列方式(推荐)
3. 时间戳方式(不推荐,18位id较长,占内存)
4. 自主生成
* 根据业务逻辑组合;
* 可以利用 redis的单线程原子性 incr来生成序列;
数据库序列方式原理:
* 利用数据库中的一个表 来进行计数累加。
* 但是并不是每次生成序列都读写数据库,这样效率太低
* mycat会预加载一部分号段到mycat的内存中,这样大部分读写序列都是在内存中完成的。
* 如果内存中的号段用完了 mycat会再向数据库要一次。
问:那如果mycat崩溃了 ,那内存中的序列岂不是都没了?
* 是的。如果是这样,那么mycat从新启动后会向数据库申请新的号段,原有号段会弃用。
* 也就是说如果mycat重启,那么损失是当前的号段没用完的号码,但是不会因此出现主键重复。