MyCat

什么是 MyCat

MyCat 是目前最流行的基于 java 语言编写的数据库中间件,是一个实现了 MySQL 协议的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分库分表。配合数据库的主从模式还可实现读写分离。

MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得 MyCat 变得非常的强大。

MyCat 发展到目前的版本,已经不是一个单纯的 MySQL 代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库,也支持 MongoDB 这种新型NoSQL 方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在 MyCat 里,都是一个传统的数据库表,支持标准的 SQL 语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

MyCat 官网:http://www.mycat.io/

MyCat_第1张图片

使用 Mycat 的优势

数据量级

单一的 MySQL 其数据存储量级和操作量级有限.

Mycat 可以管理若干 MySQL 数据库,同时实现数据的存储和操作

开源性质

Mycat 是 java 编写的中间件. 开源,免费.有非常多的人和组织对
Mycat 实行开发,维护,管理,更新.
Mycat 版本提升较快,可以跟随环境发展.如果有问题,可以快速解决.
Mycat 有开源网站和开源社区.且有官方发布的电子书籍.
Mycat 是阿里原应用 corba 转型而来

市场应用

2015 年左右,Mycat 在互联网应用中占比非常高


MyCat 中的概念

切分

逻辑上的切分. 在物理层面,是使用多库[database],多表[table]实现的切分.

纵向切分/垂直切分

        就是把原本存储于一个库的数据存储到多个库上。
        由于对数据库的读写都是对同一个库进行操作,所以单库并不能解决大规模并发写入的问题。

        例如:我们会建立定义数据库 workDB、商品数据库 payDB、用户数据库 userDB、日志数据库 logDB 等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。

优点:
1)减少增量数据写入时的锁对查询的影响。
2)由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查询所需的检索行数变少,减少了磁盘 IO,时延变短。
缺点:无法解决单表数据量太大的问题。

横向切分/水平切分

把原本存储于一个表的数据分块存储到多个表上。当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,进行划分,然后存储到多个结构相同的表,和不同的库上。
例如,我们 userDB 中的 userTable 中数据量很大,那么可以把 userDB 切分为结构相同的多个 userDB:part0DB、part1DB 等,再将 userDB 上的 userTable,切分为很多 userTable:userTable0、userTable1 等,然后将这些表按照一定的规则存储到多个 userDB 上。

优点:
1)单表的并发能力提高了,磁盘 I/O 性能也提高了。
2)如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。
缺点:无法实现表连接查询

逻辑库-Schema

Mycat 中定义的 database.是逻辑上存在的.但是物理上是不存在的.主要是针对纵向切分提供的概念.

逻辑表-table

Mycat 中定义的 table.是逻辑上存在,物理上是不存在的.主要是针对横向切分提供的概念

默认端口

Mycat 默认端口是 8066

数据主机 - dataHost

物理 MySQL 存放的主机地址.可以使用主机名,IP,域名定义

数据节点 - dataNode

配置物理的 database. 数据保存的物理节点.就是 database

分片规则

当控制数据的时候,如何访问物理 database 和 table.就是访问 dataHost 和 dataNode 的算法.
在 Mycat 处理具体的数据 CRUD 的时候,如何访问 dataHost 和 dataNode 的算法.如:哈希算法,crc32 算法等


MyCat 的使用

读写分离

原理:需要搭建主从模式,让主数据库(master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(slave)处理 SELECT 查询操作。
Mycat 配合数据库本身的复制功能,可以解决读写分离的问题

主从备份概念

什么是主从备份: 就是一种主备模式的数据库应用.
主库(Master)数据与备库(Slave)数据完全一致.
实现数据的多重备份, 保证数据的安全.
可以在 Master[InnoDB]和 Slave[MyISAM]中使用不同的数据库引擎,实现读写的分离

MySQL5.5, 5.6 版本后本身支持主从备份

在老旧版本的 MySQL 数据库系统中,不支持主从备份,需要安装额外的 RPM 包.如果需要安装 RPM,只能在一个位置节点安装

主从备份目的:

实现主备模式
保证数据的安全. 尽量避免数据丢失的可能

实现读写分离
使用不同的数据库引擎,实现读写分离.提高所有的操作效率.InnoDB 使用 DML 语法操作. MyISAM 使用 DQL 语法操作.

主从备份效果

主库操作同步到备库

所有对 Master 的操作,都会同步到 Slave 中.如果 Master 和 Salve 天生上环境不同,那么对 Master 的操作,可能会在 Slave 中出现错误如: 在创建主从模式之前,Master 有 database : db1, db2, db3. Slave 有 database: db1,db2.

创建主从模式.现在的情况 Master 和 Slave 天生不同.
主从模式创建成功后,在 Master 中 drop database db3. Slave 中抛出数据库 SQL 异常.后续所有的命令不能同步.一旦出现错误. 只能重新实现主从模式

MyCat_第2张图片
主从模式下的逻辑图

MySql 的主从模式搭建

使用两个虚拟机模拟搭建两个虚拟机都进行安装 MySQL

主库:192.168.1.19

编辑/etc/my.cnf文件,

配置server_id,主库的server_id任意配置,只要是数字即可serverid Master 唯一标识数字必须小于 Slave 唯一标识;

配置log_bin开启;变量的值就是日志文件名称.是日志文件名称的主体.MySQL 数据库自动增加文件名后缀和文件类型.

MyCat_第3张图片

配置完成后,重启mysql服务,然后为从库创建用户:

在 MySQL 数据库中,为不存在的用户授权,就是同步创建用户并授权.
此用户是从库访问主库使用的用户
ip 地址不能写为%. 因为主从备份中,当前创建的用户,是给从库 Slave 访问主库 Master
使用的.用户必须有指定的访问地址.不能是通用地址

grant all privileges on *.* to ‘username’@’ip’ identified by ‘password’ with grant option; flush privileges;

创建完成后,刷新用户,使用命令:flush privilege

MyCat_第4张图片
添加从库用户并指定ip

然后查询用户,查看是否添加成功

MyCat_第5张图片

查看 Master 信息

show master status;

MyCat_第6张图片
显示图片内容,表示配置完成

从库:192.168.70.149

编辑/etc/my.cnf文件,

配置server_id,从库的server_id任意配置,但是要大于主库的数字,然后重启mysql服务

MyCat_第7张图片

配置 Slave,首先需要连接到从库,然后停止 Slave 功能使用命令:stop slave

配置主库信息

需要修改的数据是依据 Master 信息修改的. ip 是 Master 所在物理机 IP. 用户名和密码是

Master 提供的 Slave 访问用户名和密码. 日志文件是在 Master 中查看的主库信息提供的.在

Master 中使用命令 show master status 查看日志文件名称.

change master to master_host=’ip’, master_user=’username’, master_password=’password’,master_log_file=’log_file_name’;

MyCat_第8张图片

启动 Slave 功能 命令: start slave;

查看 Slave 配置 命令:show slave status \G;

MyCat_第9张图片

至此主从库都配置完成;可以进行测试,在主库中创建数据库,表,和插入数据,从库中会自动同步相同的;


安装 MyCat

 MyCat依赖依赖于JDK,需要先安装配置JDK;

JDK安装配置完成后,只需从把从的压缩包解压即可

MyCat 目录介绍

bin 目录里是启动脚本
conf 目录里是配置文件
catlet 为 Mycat 的一个扩展功能
lib 目录里是 Mycat 和它的依赖 jar
logs 目录里是 console.log 用来保存控制台日志,和 mycat.log 用来保存 mycat 的 log4j日志

MyCat_第10张图片

MyCat 配置文件

Mycat 的架构其实很好理解,Mycat 是代理,Mycat 后面就是物理数据库。和 Web 服务器的 Nginx 类似。对于使用者来说,访问的都是 Mycat,不会接触到后端的数据库。我们现在做一个主从、读写分离。结构如下:

MyCat_第11张图片
MyCat_第12张图片

server.xml 常见修改内容:


MyCat_第13张图片
MyCat_第14张图片

schema.xml

schema.xml 是最主要的配置文件,默认的配置文件:

MyCat_第15张图片
MyCat_第16张图片

(1) 节点的作用是什么?
逻辑库配置
(2) 中name属性的作用是什么?
逻辑库的名称
(3) 中checkSQLschema属性的作用是什么?
是否检测 SQL 语法中的 schema 信息.
(4) 中sqlMaxLimit属性的作用是什么?
SQL查询的默认的分页单位
(5) 

节点的作用是什么?
定义逻辑表
(6) 
中name属性的作用是什么?
逻辑表名称
(7) 
中dataNode属性的作用是什么?
数据节点名称. 即物理数据库中的 database 名称.多个名称使用逗号
(8) 
中rule属性的作用是什么?
分片规则名称.具体的规则名称参考 rule.xml 配置文件
(9) 节点的作用是什么?
定义数据节点的标签
(10) 中name属性的作用是什么?
数据节点名称, 是定义的逻辑名称,对应具体的物理数据库 database
(11) 中dataHost属性的作用是什么?
定义数据主机的标签
(12) 中database属性的作用是什么?
在 dataHost 物理机中,具体的物理数据库 database 名称.
(13) 节点的作用是什么?
定义数据主机的标签
(14) 中name属性的作用是什么?
定义逻辑上的数据的主机名称
(15) 中maxCon/minCon属性的作用是什么?
定义最大/小的连接数
(16) 中dbType属性的作用是什么?
定义数据库的类型
(17) 中dbDriver属性的作用是什么?
定义数据库的驱动, native,表示使用mycat 提供的本地驱
(18) 节点的作用是什么?
写数据的数据库定义标签. 实现读写分离
(19) 中host属性的作用是什么?
自定义数据库的名
(20) 中url属性的作用是什么?
数据库的连接地址和端口
(21) 中user属性的作用是什么?
连接数据库使用的账户名
(22) 中password属性的作用是什么?
连接数据库使用的密码
(23) 节点的作用是什么?
只读数据库的定义标签
(24) 中host属性的作用是什么?
自定义数据库的名
(25) 中url属性的作用是什么?
数据库的连接地址和端口
(26) 中user属性的作用是什么?
连接数据库使用的账户名
(27) 中password属性的作用是什么?
连接数据库使用的密码

rule.xml

用于定义分片规则的配置文件.

mycat 默认的分片规则: 以 500 万为单位,实现分片规则.
逻辑库 A 对应 dataNode - db1 和 db2. 1-500 万保存在 db1 中, 500 万零 1 到 1000 万保存
在 db2 中,1000 万零 1 到 1500 万保存在 db1 中.依次类推.

MyCat_第17张图片
MyCat_第18张图片

MyCat读写分离及分库分片的示例:

MyCat_第19张图片

常用的分片规则

uto-sharding-long的分片规则

以 500 万为单位,实现分片规则.
逻辑库 A 对应 dataNode - db1 和 db2. 1-500 万保存在 db1 中, 500 万零 1 到 1000 万保存在 db2 中,1000 万零 1 到 1500 万保存在 db1 中.依次类推

crc32slot的分片规则

在 CRUD 操作时,根据具体数据的 crc32 算法计算,数据应该保存在哪一个 dataNode 中

配置时需要注意的

1)id中推荐配置主键列
2)所有的 tableRule 只能使用一次。如果需要为多个表配置相同的分片规则,那么需要在此重新定义该规则。
3)在 crc32Slot 算法中的分片数量一旦给定,MyCat 会将该分片数量和 slor 的取值范围保存到文件中。在次修改分片数量时是不会生效的,需要将该文件删除。文件位置位于 conf
4)使用 MyCat 实现分库时,先在 MyCat 中定义逻辑库与逻辑表,然后在 MyCat 的链接中执行创建表的命令必须要在 MyCat 中运行。因为 MyCat 在创建表时,会在表中添加一个新的列,列名为_slot。
5)使用 MyCat 插入数据时,语句中必须要指定所有的列。即便是一个完全项插入也不允许省略列

你可能感兴趣的:(MyCat)