Mycat 入门应用

1. Mycat 介绍;

分布式数据库系统中间层

  • 实现数据库读写分离、读负载均衡、数据库延迟等功能
  • 通常情况下,如果开发 Java 程序,每个 Java 应用都会实现自己独立的数据库链接池,如果对同一个应用启用多个实例的话,那就会有多个数据库连接池,这样并不能很好的起到控制数据库连接的作用。当引入了数据库中间层之后,可以统一的控制数据库连接数量
  • 另外数据库中间层还可以屏蔽后端数据库的一些变更,比如如果对数据库进行了拆分、水平或者垂直的切分之后,可以通过数据库中间层来屏蔽一些逻辑的变更,使得对应用造成的影响最小化
  • Mycat 除了原生实现了 MySQL 的通讯协议之外,还支持通过 JDBC 连接其它的关系型数据库产品比如 Oracle、MSSQL 等,同时还能连接非关系型数据库如 MongoDB。可以通过同样的方式对后端的关系型、非关系型数据库来进行相同的操作

数据库的读写分离

  • 读写分离是数据库中间件最常被使用到的一个功能
  • 前端应用通过向 Mycat 这样的数据库中间件产品对后端的一个主从复制集群的数据库进行读写分离,就是把数据库写操作在主数据库上进行执行,而把读操作在从数据库上执行
  • Mycat 在支持数据库读写分离的同时、还支持读数据库的负载均衡,这种场景较多出现在一主多从的架构上,可以把读负载在多个从服务器之间进行负载均衡
  • Mycat 还支持后端数据库主从复制集群的高可用。这里的高可用并不同于 MHA、MMM 方式实现的复制架构的高可用。在 MHA、MMM 架构中,当主节点宕机后,是可以自动的从多个从节点中选取一个新的主,并且将其它的从节点对这个新的主节点重新同步。但是 Mycat 中不具备这样的功能,它的高可用指的是可以在配置的时候除了主节点之外,再指定一台从节点也可以支持写的功能。当主节点宕机之后,Mycat 就会把写 SQL 录入到配置的时候指定的从节点上,并不支持把其它的从节点对新的主节点进行主从同步

数据库的垂直拆分

  • 回顾读写分离架构:App 通过 Mycat 读写后端的 MySQL 主从复制集群数据库。在主从复制集群中,只有一台数据库负责写操作。这种架构只能分担数据库的只读负载
  • 如果写负载已经大到一台数据库服务器无法承担的时候,这时候就需要对数据库进行垂直拆分或者水平重启拆分
  • 数据库的垂直拆分也可以称为纵向的切分。可以把数据库想象成一个大蛋糕,垂直拆分就是把蛋糕从上到下来切成几块。放到数据库系统中来说,可以把一个数据库中的表按一定规则分摊到多个数据库实例上去。拿电商实例来说,包括了用户模块、订单模块、支付模块三个模块。本来这三个模块都集中在单 DB 中,数据库垂直拆分就可以把这三个并不影响的模块拆分出来,分别形成用户库、订单库、支付库,然后通过 Mycat 来访问这三个数据库。对于前端应用来说,可以把它抽象成一个数据库来使用。通过数据库中间层极大的简化了前端应用在数据库拆分之后所做的变更
    在这里插入图片描述

数据库的水平拆分

  • 数据库的水平拆分也就是分库分表。在经历了垂直拆分后,如果业务量持续的发展壮大,用户达到了上千亿规模,这时候就要通过一定的规则进行水平拆分
  • 继续拿蛋糕举例,水平拆分会把这个蛋糕从左到右边水平的来切分。水平切分就是把原来的一个用户库拆成多个用户库,通过一定的规则来进行切分。并且这多个库中的表结构是完全一样的。前端应用就通过 Mycat 以及切分规则来对后端拆分后的数据库来进行访问。Mycat 可以统一实现切分逻辑,而不用在前端应用上来分别实现切分逻辑

在这里插入图片描述

应用场景

  • 需要进行读写分离的场景:在往一台数据库服务器上进行读写混合操作的时候感到数据库的性能大幅下降,并且读负载明显高于写负载的时候。Mycat 支持多种后端的 MySQL集群方案来进行读写分离,比如一主一从、一主多从、主主复制、PXC 集群等
  • 需要分库分表的场景:Mycat 支持对超过 1000 万的表进行分片、支持 1000 亿的单表分片量级
  • 多租户场景:这是一种稳定架构,它的主要目的是在多用户的环境下、使用不同的数据库系统的组件,仍可以确保各个用户之间具有一定的数据隔离性,每一个应用可以访问用户、但应用程序只连接 Mycat,不用改造程序本身。最常见的就是云服务
  • 数据库统计系统:Mycat 的分表能力、处理大规模的报表的系统和统计可以并发的对后端数据库中数据进行汇总、然后再进行合并,在报表系统中非常适用。同时也可以作为海量数据实时查询的简单有效的方式
  • HBASE 的一种替代方案。HBASE 是一款基于 Hadoop 的分布式列存储数据库。常用的关系型数据库比如 MySQL 都是行存储,这里就可以运用 Mycat 的水平和垂直切分的一种特性来实现对数据库的一种分布式存储,后端的存储还是 MySQL、是行存储方案。可以近似的用 Mycat 来模拟一种基于 MySQL 的分布式存储的一种解决方案
  • 需要使用同样的方式查询多种数据库的场景。Mycat 除了原生支持 MySQL 之外,还可以通过 JDBC 来连接多种关系型数据库和非关系型数据库比如 MongoDB,这样对于前端应用来说就可以隐藏后端数据库的种类,以及通过同样的方式来使用多种数据库

Mycat 的优势

  • 基于阿里的 Cobar 系统开发
  • 开发社区活跃
  • 完全开源可以自定义开发
  • 支持多种关系型以及 NoSQL 数据库
  • 使用 JAVA 开发,可以部署在多种系统上
  • 具有在多种行业和项目中应用的成功案例

2. Mycat 基础;

2.1 基本概念;

Mycat 中的数据库:逻辑库

  • 数据库中间件的主要作用就是屏蔽了分库分表后,后端数据库的复杂性。前端应用可以像使用一个未分片的数据库一样使用一个分片的数据库。所有的分片逻辑和数据库路由都是由数据库中间件来实现的
    在这里插入图片描述
  • 逻辑库就是后端物理数据库的视图。逻辑库的名字可以和后端物理数据库是不同的
  • Mycat 中保存了逻辑库的定义、而不会保存具体的数据。具体的数据是存储在后端的物理数据库中

逻辑表

  • 和逻辑库一样,前端应用通过 Mycat 看到的表就是逻辑表。一个逻辑表可能对应后端多个物理数据库中的表
  • 如下图,前端应用通过 Mycat 可以看到 User_db 中有一张表 user_inf,实际上 user_inf 的数据存储在后端 db01 到 db03 的物理库中
  • 虚线表示逻辑库。在数据库水平切分的时候说过,水平切分后数据库的库结构和表结构是一样的。虽然数据库的名字不一样,但是物理数据库 db01 到 db03 的表名是一样的
  • 逻辑表也可以通过视图的概念理解
    在这里插入图片描述

2.2 关键特性;

支持 SQL92 标准

  • 目前大多数关系型数据库都支持的一个 SQL 标准
  • 在这个标准中定义了 SQL 语句的功能和标准的一些事务的特性,比如隔离级别等等
  • Mycat 作为中间件产品为什么要支持 SQL92 标准,是因为 Mycat 在对前端应用所提交的 SQL 语句进行分析之后才能通过分析的一些标准,比如分片的策略来对 SQL 进行路由

支持 MySQL 集群

  • 比如一主多从、一主一从、多主多从等

支持 JDBC 连接数据库

  • 可以连接除 MySQL 之外的多种的关系型数据库如 MSSQL、Oracle
  • 也支持 NoSQL 数据库比如 MongoDB 等

支持自动故障切换、高可用性 / 支持读写分离 / 支持全局表

  • 全局表就是一些比较小的字典表。这些表一般变动都会很小,并且会经常和其它一些表关联来进行使用
  • Mycat 可以把同样的一些数据自动的存储到多个分片节点上,这样就可以有效的提高这种关联的效率

支持独有的基于 ER 关系的分片策略

  • Mycat 唯一支持
  • ER 关系就是实体关系模型,这个是关系型数据库的基础
  • 这种分片策略可以把子表的记录与所关联的副表存放在同一个数据分片上,也就是说子表可以依赖于副表进行存储,这样就保证子表与副表进行关联的时候不会跨分片跨库来进行操作

支持一致性 HASH 分片

  • HASH 算法解决了分片、扩容的问题。
  • 在实际使用中建议先在同一台服务器上建立足够多的分片,当这台服务器的负载过大而不能满足业务需求时,可以把一些分片迁移到其它服务器上,这种扩容方式是最简单也是最高效的扩容方式。

多平台支持、部署简单方便 / 支持全局序列号

  • 在使用 MySQL 数据库的时候,可能会使用自增 id 来作为表的主键。一旦把数据库进行分片之后,不同的分片是在不同的数据库服务器上的,那么它的自增 id 是各自进行维护的,这会产生 id 号重复的情况。这时候如果对分片后的表进行查询就会发现相同的 id 会出现多次,这样就违反了数据库一致性的要求。所以就需要全局的序列号来对各个分片中统一来分派数据库的自增序列。
  • Mycat 提供了这么一个功能,可以管理支持全局序列号的生成。

2.3 安装 Mycat;

待续

发布了119 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/hualaoshuan/article/details/103229726