MyCAT 数据分片入门实战

Posted iitren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyCAT 数据分片入门实战相关的知识,希望对你有一定的参考价值。



等你点蓝字关注都等出蜘蛛网了


近日尝试了关于Mycat分表分库的特性,这里做一些整理,作为入门的参考。

本文不对Mycat配置的每一项都进行详细解释,这些内容在其官方的权威指南中都有介绍,这里阐述部署mycat的实际操作过程,也算是对文档没有交代部分的一个补充吧。


一、方案规划

部署模型如图

MyCAT 数据分片入门实战

其中,有两台虚拟机:192.168.1.21和192.168.1.22,前者用于部署Mycat-server服务和1个mysql实例,后者部署2个mysql实例,这里为了简化部署模型,未考虑mysql的主从复制,3个实例均独立。

现在假设系统的数据库为messagedb,里面只有2张表,一张表为消息表:message,一张表示消息来源的字典表:source,本案实现的是按自然月分片的规则,因此上述3个mysql实例各自需要创建4个数据库,即:

MyCAT 数据分片入门实战

说明:如果是刚接触Mycat的小伙伴对分片不太理解,简单地说,对于Mycat,一个分片表示某一个MySQL实例上的某一个数据库,即schema@host,于是当我们原先的一张大表需要分片的时候,mycat就会按照我们设定的规则,把这张大表中的数据分散到各个分片上,即所谓的分表分库,因此我们需要在每个对应的分片上创建相同名称的数据库,相同结构的表。


 二、环境准备

首先部署mysql实例,假设mysql的安装包已经下载完成,放置在/application/tools目录下,部署的工作用脚本实现:

MyCAT 数据分片入门实战
MyCAT 数据分片入门实战
MyCAT 数据分片入门实战

在脚本中,我们为每个mysql实例配置了一个管理脚本:mysql.sh,代码如下:

MyCAT 数据分片入门实战
MyCAT 数据分片入门实战

原理很简单,即使用mysqld_safe启动服务,使用mysqladmin停止服务。

将所有实例都启动起来之后,就可以开始创建数据库了,因为都是相同的数据库名和表结构,所以依然用一段脚本来完成工作:

MyCAT 数据分片入门实战

其中tb.sql的内容如下:

MyCAT 数据分片入门实战

在message表中,总共有4个字段:

  • id:主键

  • content:消息的内容

  • create_time:创建时间,这也是mycat进行分片时的参考字段

  • source_id:source表的外键

另外,我们在source表插入了5条记录,用于测试。到这里,后端数据库的环境就搭建完成了。


三、安装和配置Mycat

安装完之后,简单地看一下mycat目录结构:


MyCAT 数据分片入门实战

其中,9066端口是管理端口,提供查看当前系统节点的情况,报告心跳状态等相关系统监控的功能,8066是数据端口,相当于数据库的访问端口。我们可以使用mysql命令访问这里两个端口:

MyCAT 数据分片入门实战

那么mycat_user和mycat_passwd是如何配置呢,下面就需要介绍mycat中最主要的3个配置文件:server.xml,schema.xml和rule.xml。

3.1 server.xml

该配置文件是用于配置mycat的系统信息,主要有两个标签:system和user。这里的user就是上述访问mycat服务的用户,不是后端数据库的用户。如果我们使用默认的配置,server.xml大概是这样的:

MyCAT 数据分片入门实战

user标签下schemas属性表示该用户可以访问的数据库,可以定义多个数据库,用英文逗号隔开。schemas定义的数据库,一定要配置在后面的schema.xml文件对应的逻辑库,否则会提示无法访问。

system标签暂时使用默认的配置,不做过多的讨论。总之,先让你的猫先跑起来再考虑其他玩法。

3.2 schema.xml

schema配置文件比较复杂,也是最关键的一个配置文件,定义了mycat中的逻辑库、逻辑表,和分片的相关信息。配置如下:

MyCAT 数据分片入门实战

几点要说明一下:

  • schema标签定义逻辑库,其下table子标签定义逻辑表,datanode属性定义该逻辑表需要分布到哪几个分片上,rule属性表示使用何种分片规则,这里我们选择sharding-by-month,这个规则的名称是自定义的,只要和后面的rule.xml对应起来即可

  • source表是一张全局表,这里需要使用type=”global”来定义,这样mycat就可以帮我们在指定的分片上克隆相同的数据,这对join查询是非常有好处的。

  • datanode标签定义了分片,datahost是主机名,对应dataHost标签的name属性值,database定义该主机数据库实例上的具体数据库名。

  • dataHost标签定义数据库实例,其下heartbeart标签表示心跳检测所使用的方法,writeHost标签定义写数据的实例,另外还有readHost标签可以定义读数据的实例,这里不考虑读写分离,仅使用写实例,因此需要把balance属性设置为0

  • 其他属性可以自行查阅官方权威指南

  • 最后,出于规范和安全考虑,最好不使用数据库的root用户,而是另外再创建一个用于mycat访问的用户。

3.3 rule.xml

rule.xml中定义了很多分片的规则,具体规则的算法可以参考官方权威指南,这里我们直接使用默认的就可以了,其中按自然月的分片规则配置如下:

MyCAT 数据分片入门实战

tableRule标签定义分片规则的,其下columns标签表示对数据库表中的哪个字段应用规则,algorithm指定实现算法的名称,对应的是function标签中的name属性值

  • function标签定义对应的实现类,以及参数,包括dateFormat(日期格式)和sBeginDate(起始日期)

  • 说明:起始日期是用来计算数据所在的分片位置,例如2016年1月的message就会找到第1个分片,即dn1,2016年12月的message就会找到第12个分片,即dn12,但是如果出现了2017年1月的message,mycat就会去找第13个分片,但是配置文件中又没有对应的配置,那么就会抛出无法找到分片的错误。

    最后再来总结一下配置文件的关系

MyCAT 数据分片入门实战

如图所示,server.xml定义了访问mycat服务的用户,以及该用户授权的数据库(逻辑库),schema.xml定义了具体的逻辑库,逻辑表,以及分片和数据库实例的信息,rule.xml分片规则和实现类。


四、测试

到这里已经完成了mycat的配置文件,但先不急着往里面灌数据,我们先访问管理端口9066,看一下运行情况:

MyCAT 数据分片入门实战

如果看到各个节点都已经出现,并且心跳状态RS_CODE=1,则表示后端数据库连接正常。

现在我们用JDBC的方式批量插入1000万数据:

MyCAT 数据分片入门实战

如果运行的时候报错: Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage;,可以适当调大一下my.cnf下的max_binlog_cache_size参数。

最后我们来检验一下分片的结果,其中message表中的数据根据create_time的值按月进行了分片,而source表作为全局表,则其数据出现在了每个分片上,下面贴出部分结果:

MyCAT 数据分片入门实战
MyCAT 数据分片入门实战


五、总结

本文就mycat分片的特性进行一次实战操作,完成了部署mycat-server以及后端mysql数据库,并以按自然月为分片规则进行了相关的配置,最后做了一个小的测试来验证分片功能的正确性。

mycat还有其他比较强大的特性还有待进一步的研究使用,下一步的工作:

  • 完成读写分离的配置和测试

  • 整合zookeerp实现高可用集群

六、参考资料

  1. 周继峰 冯钻优 陈胜尊 左越宗. 分布式数据库架构及企业实践:基于Mycat中间件[M]. 电子工业出版社, 2016.

  2. mycat开源项目组. Mycat权威指南. http://mycat.io/document/Mycat_V1.6.0.pdf

MyCAT 数据分片入门实战

MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战

MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战 MyCAT 数据分片入门实战


加社群小助手申请入群(请注明“php”),专业交流微信群期待你的加入~

以上是关于MyCAT 数据分片入门实战的主要内容,如果未能解决你的问题,请参考以下文章

Mycat学习实战-Mycat分片

MySQL多数据源笔记4-Mycat中间件实战

Mycat快速入门教程

Mycat学习实战-Mycat初识

MyCat 的入门和放弃

数据库分库分表,分片配置轻松入门!