这里主要介绍mycat的使用,通过mycat搭建mysql分布式架构。除了mycat,类似的产品还有sharding-jdbc。知乎上对mycat的评价并不高,所以后续也要学习下sharding-jdbc。

来自B站课程

mycat介绍

mycat是数据库的中间件,连接Java应用和数据库。

类似的产品:

  • cobar,停止维护了
  • oneproxy,收费的
  • kingshard
  • vitess,不支持mysql原生协议
  • atlas,360开发
  • mysqlroute
  • sharding-jdbc

mycat的功能:

  • 读写分离。读写分离依赖主从复制。主库负责数据更新和实时查询,从库负责非实时查询。
  • 数据分片。分库分表,表的垂直拆分和水平拆分。
  • 多数据源整合。

mycat工作原理:

Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用Mycat还是MySQL。

16294226861.png

mycat安装启动

剩下的部分看附件吧,课程的讲义比较完整了。

ps:
sharding-jdbc是client方式的中间件(可以理解为增强版的jdbc),mycat是server端,通过proxy提供服务的中间件。
数据库架构一般是一个进化的过程:刚开始是单库,压力大一些了,搞个读写分离,压力又大了,就拆分吧,最开始可能都是垂直拆分,垂直拆分就像微服务一样,用户表放在一个server上,订单表放到另一个server上。还有一种是水平拆分,水平拆分就是server1上有用户表1、订单表1,server2上有用户表2、订单表2.垂直拆分能解决表和表之间的资源竞争问题,但不能解决单表数据增加过快的问题,单表几千万时,查询肯定慢,这是可以引入水平拆分。

常用分片算法:

  • 范围分片。比如id为1-10000的分布到t1,10001-20000分布到t2,以此类推。
  • 取模分片。取模分片需要根据规划的表的数量来实现,例如需要分成4个表,可以使用id%4来分配,当id位数比较长时,可以只用id后四位来取模。
  • hash分片。可以通过某个字段进行hash,还有一致性hash可以解决数据扩容问题。
  • 时间分片。可以按照年月来分,数据量大甚至可以一天分一个表。

分布式主键:

  • UUID。足够简单,但是长度较长,不适合存储和查询,且没有自增特性。
  • 基于数据库的自增id。简单,但是数据库有性能瓶颈,无法保证高并发场景。
  • 基于redis的incr。需要考虑redis持久化问题,若使用RDB快照持久化,可以出现id重复;若使用AOF对每条命令进行持久化,由于incr命令的特殊性,会导致redis重启恢复数据的时间过长。
  • 基于雪花算法,snowflake。