一,介绍
随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:
- IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘10,效率较低。 请求数据太多,带宽不够,网络!0瓶颈。
- CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。
拆分策略:
-
垂直拆分:
垂直分库:以表为依据,根据业务将不同表拆分到不同库中。
特点:
- 每个库的表结构都不一样。
- 每个库的数据也不一样。
- 所有库的并集是全量数据。
垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。
特点:
- 每个表的结构都不一样。
- 每个表的数据也术一样,一般通过一列(主键/外键)关联。
- 所有表的并集是全量数据。
-
水平拆分:
水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。
特点:
- 每个库的表结构都一样
- 每个库的数据都不一样
- 所有库的并集是全量数据
水平分表:以字段为依据,按照一定策略,将一个表的数据拆分到多个表中。
特点:
- 每个表的结构都一样
- 每个表的数据都不一样
- 所有表的并集是全量数据
-
总结:水平是拆分数据,垂直是拆分结构。
实现技术:
shardingjDBC:基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。MyCat:数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及shardingjDBC
二,MyCat概述
Mycat是开源的、活跃的、基于java语言编写的MySQL数据库中间件。可以像使用mysql一样来使用mycat,对于开发人员来说根本感觉 不到mycat的存在。
优势:
- 性能可靠稳定
- 强大的技术团队
- 体系完善
- 社区活跃
-
下载:
-
安装:
Mycat是采用java语言开发的开源的数据库中间件,支持Windows和Linux运行环境,下面介绍MyCat的Linux中的环境搭建。我们需要在准备好的服务器中安装如下软件。
- MySQL
- JDK
- Mycat
服务器 安装软件 说明 192.168.200.210 JDK,Mycat MyCat中间件服务器 192.168.200.210 MySQL 分片服务器 192.168.200.213 MySQL 分片服务器 192.168.200.214 MySQL 分片服务器 -
Mycat目录结构
bin:存放可执行文件,用于启动停止mycat
conf:存放mycat的配置文件
lib:存放mycat的项目依赖包(jar)
logs:存放mycat的日志文件
-
进入lib目录,将mysql驱动包替换为mysql8.0的驱动包,记得改权限
核心概念介绍:
三,MyCat入门
-
**需求:**由于tb_order表中数据量很大,磁盘IO及容量都到达了瓶颈,现在需要对tb_order表进行数据分片,分为三个数据节点,每一个节点主机位于不同的服务器上,具体的结构,参考下图:
-
环境准备:
-
分配配置(
schema.xml)配置mycat的用户以及用户的权限信息(
server.xml) -
启动服务
切换到Mycat的安装目录,执行如下命令,启动Mycat
#启动 bin/mycat start #停止 bin/mycat stopmycat启动之后,占用端口号8066
查看服务是否启动成功
tail -f logs/wrapper.log #只要出现MyCat Server startup successfully代表启动成功 -
分片测试
通过如下执行,就可以连接并登录Mycat
mysql -h 192.168.200.210 - P 8066 -uroot -p123456然后就可以在MyCat中来创建表,并往表结构中插入数据,查看数据在MySQL中的分布情况。
create table TB_ORDER( id bigint(20) not null, title varchar(100) not null, primary key(id) ); insert into TB_ORDER(id,title) values(1,'goods1'); insert into TB_ORDER(id,title) values(2,'goods2'); insert into TB_ORDER(id,title) values(3,'goods3'); insert into TB_ORDER(id,title) values(10000000,'goods10000000'); insert into TB_ORDER(id,title) values(100000000,'goods100000000');
四,MyCat配置
4.1 schema.xml
schema.xml作为MyCat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表 、分片规则、分片节点及数据源的配置。
主要包含以下三组标签
- schema标签:主要配置逻辑库,逻辑表的相关信息。
- datanode标签:主要配置逻辑节点的相关信息。
- datahost标签:主要配置节点主机以及数据源的相关信息。
4.1.1 schema标签
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long"/>
</schema>
schema 标签用于定义 MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过 schema 标签来划分不同的逻辑库。
MyCat中的逻辑库的概念,等同于MySQL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。
核心属性:
name:值自定义的逻辑库名checkSQLschema:在SQL语句操作时如果指定了数据库名称,执行时是否自动去除;true自动去除,false不去除sqlMaxLimit:如果未指定limit进行查询,列表查询模式则最多查询的记录数。
table标签
-
table 标签定义了MyCat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义 。
-
核心属性:
name:定义逻辑表表名,在改逻辑库下唯一。dataNode:定义逻辑表所属的dataNode,该属性需要与dataNode标签中的name对应;多个dataNode用逗号分隔。rule:分片规则的名字,分片规则名字是在rule.xml中定义的。primaryKey:逻辑表对应真实表的主键。type:逻辑表的类型,目前逻辑表只有全局表和普通表,如未配置,就是普通表,全局表配置为:global
4.1.2 dataNode标签
<dataNode name="dn1" dataHost="dataHost1" database="db01"/>
<dataNode name="dn2" dataHost="dataHost2" database="db01"/>
<dataNode name="dn3" dataHost="dataHost3" database="db01"/>
dataNode标签中定义了MyCat中的数据节点,也就是我们通常说的数据分片。一个dataNode标签就是一个独立的数据分片。
核心属性:
name:定义了数据节点名称dataHost:数据库实例主机名称,引用自dataHost标签中的name属性database:定义分片所属数据库
4.1.3 dataHost标签
<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.200.210:3306" user="root" password="1234">
</writeHost>
</dataHost>
该标签在MyCat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。
核心属性:
name:唯一标识,供上层标签使用。maxCon/minCon:最大连接数/最小连接数balance:负载均衡策略,取值为0,1,2,3writeType:写操作分发方式0:写操作转发到第一个writeHost,第一个挂了,切换到第二个1:写操作随机分发到配置的writeHost
dbDriver:数据库驱动,支持native,jdbc
4.2 rule.xml
rule.xml中定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签:
tableRule:主要定义涉及到的分片规则name属性:用于给schema.xml中schema标签的rule属性引用rule子标签,定义分片规则columns:要根据哪个字段进行数据分片algorithm:分片的算法name,就是function标签的name的引用
Function:主要定义分片所涉及到的java类和参数配置name属性就是给algorithm引用的class属性:mycat自带的分片规则的java类property子标签,定义这种分片规则关联的一些属性配置,有些直接配置在子标签里面,有些是关连到外部文件里面。
4.3 server.xml
server.xml配置文件包含了MyCat的系统配置信息,主要有两个重要的标签:system、user。
-
system标签:对应的mycat系统配置项及其含义,例如一些端口配置等,这个直接去查文档。 -
user标签
五,MyCat分片
5.1 垂直拆分
-
场景
在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据 库表进行拆分,原有的数据库表如下。
-
准备工作:
-
配置Mycat
5.2 水平拆分
-
场景
在业务系统中,有一张表(日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分。
-
准备工作
-
配置Mycat
5.3 分片规则
5.3.1 范围分片
范围分片:根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。
配置方式:
id超出范围会报错!
5.3.2 取模分片
取模分片:根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片。
配置方式
5.3.3 一致性hash
所谓一致性哈希**,相同的哈希因子计算值总是被划分到相同的分区表中**,不会因为分区节点的增加而改变原来数据的分区位置。
配置方式
5.3.4 枚举分片
枚举分片:通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。
配置方式
前面写枚举值,后面写保存在哪个节点
5.3.5 应用指定算法
应用指定算法:运行阶段由应用自主决定路由到那个分片,直接根据字符子串(必须是数字)计算分片号。
- 字符串子串:根据字符串字段里面的指定部分子串来计算分片号。
配置方式
5.3.6 固定分片hash算法
固定分片hash算法:该算法类似于十进制的求模运算,但是为二进制的操作,例如,取过d的二进制低10位与 1111111111进行位&运算。
配置方式
代码解释:
<property name="partitionCount">2,1</property>
<property name="partitionLength">256,512</property>
-
partitionCount:分片的数量 -
partitionLength:分片的长度2代表有两个分片节点,1代表有1个分片节点,这个2代表前面2个分片节点的长度都是256,1代表后面节点长度为512
5.3.7 字符串hash解析
字符串hash解析:截取字符串中的指定位置的子字符串,进行hash算法,算出分片。
配置方式
代码解释
-
partitionCount:分片的数量 -
partitionLength:分片的长度这俩参数和上一个算法的设置方法是一样的。
-
hashSlice:哈希运算位,格式是start:end,就是我们在hash运算截取子字符串的范围。- 如果0出现在end位置,代表的是整个字符串长度
- 如果-1出现在end位置,代表的是
字符串长度-1 - 如果end是大于0的,代表数字本身
5.3.8 按天分片
按天分片:指定开始,结束时间,时间间隔。比如说第一个10天就存储在第一个分片,第二个十天存储在第二个分片。
配置方式
红色的字体意思是,时间拆分出的分片数量必须和我们dataNode数量保持一致
5.3.9 按自然月份分片
按自然月份分片:使用场景为按照月份来分片,每个自然月为一个分片,如下图,配置了起始时间和结束时间后,超出的部分重新循环到第一个分片,第二个分片这样。
配置方式
红色字体的意思是,配置出来的分片数量必须和dataNode的数量保持一致。
六,MyCat管理及监控
6.1 Mycat原理
6.2 Mycat管理工具
Mycat默认开通2个端口,可以在server.xml中进行修改。
8066数据访问端口,即进低 DML和 DDL操作。9066数据库管理端口,即 mycat 服务管理控制功能,用于管理mycat的整个集群状态
mysql -h 192.168.200.210 -P 9066 -u root -p 123456
| 命令 | 解释 |
|---|---|
| show @@help | 查看Mycat管理工具帮助文档 |
| show @@version | 查看Mycat版本 |
| reload @@config | 重新加载Mycat的配置文件 |
| show @@datasource | 查看Mycat的数据源信息 |
| show @@datanode | 查看Mycat现有的分片节点信息 |
| show @@threadpool | 查看Mycat的线程池信息 |
| show @@sql | 查看执行的SQL |
| show @@sql.sum | 查看执行的SQL统计 |
6.3 Mycat监控
6.3.1 介绍
Mycat-eye
Mycat-web(Mycat-eye)是对mycat-server提供监控服务,功能不局限于对mycat-server使用。他通过JDBC连接对Mvcat、Mvsql监控,控远程服务器(目前仅限于linux系统)的cpu、内存、网络、磁盘。
Mycat-eye运行过程中需要依赖zookeeper,因此需要先安装zookeeper
6.3.2 安装
-
安装Zookeeper
-
上传安装包
zookeeper-3.4.6.tar.gz -
解压
tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local -
创建数据存放目录
cd /usr/local/zookeeper-3.4.6/ mkdir data -
修改配置文件名称并配置
cd config mv zoo_sample.cfg zoo.cfg -
配置数据存放目录
dataDir=/usr/local/zookeeper-3.4.6/data -
启动
bin/zkServer.sh start bin/zkServer.sh status
-
-
安装Mycat-web
-
上传安装包
Mycat-web.tar.gz -
解压
tar -zxvf Mycat-web.tar.gz -C /usr/local -
目录介绍
etc:jetty配置文件lib:依赖jar包mycat-web:mycat-web项目readme.txtstart.jar:启动jarstart.sh:linux启动脚本
-
启动
sh start.sh -
访问
http://192.168.200.210:8082/mycat
备注:
- 如果Zookeeper与Mycat-web不在一个服务器,需要设置zookeeper的地址;在/usr/local/mycat-web/mycat-web/WEB-INF/classes/mycat.properties文件中配置
-
6.3.3 配置mycat-web
-
开启Mycat的实时统计功能(
server.xml)<property name="useSqlStat">1</property><!--1开启,0关闭--> -
在Mycat监控界面配置服务地址