MySQL-分库分表(Mycat)
目录
1.介绍
概述
拆分策略
垂直拆分
水平拆分
实现技术
MyCat:
2.Mycat概述
环境准备
分片配置
schema.xml
server.xml
启动服务
分片测试
3.MyCat配置
schema.xml
schema标签
datanode标签
datahost标签
rule.xml
server.xml
4.垂直拆分(分库)
场景
准备
配置
schema标签
server标签
测试
多表联查
解决
5.水平拆分
6.分片规则
6.1范围分片
6.2取模分片
6.3一致性哈希
6.4枚举
6.5应用指定算法
6.6固定分片hash算法
6.7字符串哈希解析
6.8 按日期(天)分片
6.9 按日期(月)分片
7.MyCat管理与监督
1.介绍
概述
随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:
- IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。
- CPU瓶颈:排序、分组、连接查询、聚合统计等SOL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的
拆分策略
根据形式不同可以分为垂直拆分和水平拆分。
垂直相当于从中间切开,分库是把一个库中多个表拆成几份存储到不同数据库中,所以这些数据库中的库结构不一样。分表是把一个表中的各字段拆分到不同数据库,各表结构也不同。
水平就是物理切割,只是把各库中的部分数据存储到不同数据库,这些数据库结构一样。分表则把表中行部分存在不同数据库,表结构也相同。
垂直拆分

水平拆分
实现技术
shardingJDBC:
基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。
MyCat:
数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及前者。
2.Mycat概述
Mycat是开源的、活跃的、基于java语言编写的MySOL数据库中间件。可以像使用mysql一样来使用mycat,对于开发人员来说根本感觉不到mycat的存在。
环境准备
在节点主机中都新增db01的数据库,后续只对Mycat进行配置。
分片配置
schema.xml
逻辑库(Schema):逻辑库是 MyCat 中的一个虚拟数据库,它对应于 MySQL 中的
DATABASE
。逻辑库定义了包含的逻辑表和分片规则。逻辑表(Table):逻辑表是 MyCat 中的一个虚拟表,它对应于物理数据库中的实际表。逻辑表定义了数据如何分布到不同的数据节点
数据节点(DataNode):定义了数据存储的具体位置。
数据主机(DataHost):定义了数据库的连接信息和读写分离策略。
分片规则(Rule):定义了如何将数据分布到不同的数据节点。
server.xml
readyOnly:只读权限,ture则表明该用户只有读权限。
启动服务
-
-h
:指定 MySQL 服务器的主机名或 IP 地址。 -
-P
:指定 MySQL 服务器的端口号。 -
-u
:指定连接到 MySQL 服务器的用户名。 -
-p
:指定连接到 MySQL 服务器的密码。
Mycat的登录格式与MySQL类似是由于,其通过以下方式实现与 MySQL 的兼容性:
SQL 解析
MyCat 内置了 SQL 解析器,能够解析和理解 MySQL 的 SQL 语法。它会拦截和解析客户端发送的 SQL 语句,然后根据配置的分片规则和路由策略,将 SQL 语句分发到相应的物理数据库节点。
协议兼容
MyCat 实现了 MySQL 的网络协议,使得客户端可以像连接普通 MySQL 数据库一样连接 MyCat。这包括支持 MySQL 的二进制协议和文本协议。
透明代理
MyCat 作为一个透明代理,对客户端来说,它就像一个普通的 MySQL 数据库。客户端发送的 SQL 语句和数据请求都会被 MyCat 拦截和处理,然后转发到后端的物理数据库。返回的结果也会被 MyCat 处理后返回给客户端。
查看已存在schema.xml文件中配置的逻辑库与逻辑表。
分片测试
在MyCat中通过创建逻辑表该表结构会同步至节点数据库中,而往其逻辑表插入的数据会根据分片规则散落至各节点数据库。
3.MyCat配置
schema.xml
schema.xml作为MyCat中最重要的配置文件之一,涵盖了MyCat的逻辑库 、逻辑表 、分片规则、分片节点及数据源的配置。
主要包含以下三组标签:
schema标签
schema标签用于定义 MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过 schema 标签来划分不同的逻辑库。
MyCat中的逻辑库的概念 ,等同于MySQL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。
schema标签<table>标签定义了MyCat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义。
datanode标签


datahost标签

rule.xml
rule.xml中定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签:tableRule、Function。
tableRule为分片规则,Function为具体配置
server.xml
server.xml配置文件包含了MyCat的系统配置信息,主要有两个重要的标签:system、user。
system为一些系统配置的信息。
user配置用户的信息以及其可以访问的权限
4.垂直拆分(分库)
场景
主数据库中包含4种分类的各表,决定拆分成3个表。
准备
配置
schema标签
table必须包含所有需要拆分的逻辑表。
这里讲逻辑表分为3部分,从上至下,商品相关表关联分片节点dn1,订单dn2,用户dn3.
dataNode配置了分片节点关联的节点主机。
server标签
将用户可访问的数据库名称修改为创建的逻辑库名称。
由于是逻辑表还需要在MyCat中执行对应的创建表语句,才能在节点主机看到物理表结构。
测试
多表联查
联查表在同一节点主机中,查询成功
联查表在不同节点主机中,查询失败
解决
将地址信息分片到所有节点,并将type=global声明为全局表。
5.水平拆分
将一张表中的数据分片到不同节点主机中,表结构相同,内容不同。
本质一样:schema配置逻辑库ITCAST中的逻辑表tb_log数据分片在dn4,dn5,dn6的分片节点中,rule指定分片规则。 dataNode配置节点关联的节点主机。
server配置用户访问权限
使用MyCat后所有DDL,DML语句在MyCat中执行。
6.分片规则
6.1范围分片

rule引用tableRule name中的分片规则,algorithm引用funcion name中的分片算法。
6.2取模分片

6.1与6.2不适用字段值为字符串。
6.3一致性哈希
所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。
6.4枚举
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。
6.5应用指定算法
运行阶段由应用自主决定路由到那个分片,直接根据字符子串(必须是数字)计算分片号
6.6固定分片hash算法
该算法类似于十进制的求模运算,但是为二进制的操作,例如,取d的二进制低10位与 1111111111进行位&运算。
paritioncount位分片数,length为长度。 前两个分片节点长度256,第三个长度512.
6.7字符串哈希解析
截取字符串中的指定位置的子字符串,进行hash算法,算出分片。
6.8 按日期(天)分片
6.9 按日期(月)分片
7.MyCat管理与监督
MyCat对SQL语句解析解析,根据rule配置的分片规则对字段进行分片分析后决定路由给哪个节点。
MyCat对查询到的结果集再合并进行一系列处理后返回给客户端。
排序等操作都是在MyCat中执行,因为对部分数据处理无意义,采用整合后再处理。