一、介绍
1、单数据库进行数据存储的问题:
IO瓶颈:热点数据太多,数据库缓存不足以容纳这些热点数据,产生大量磁盘IO,效率较低。
CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源。
2、分库分表:
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。
分库分表的形式,主要是两种:垂直拆分和水平拆分。而拆分的粒度,一般分为分库和分表。
实现技术:MyCat 数据库分库分表中间件,不用调整代码即可实现分库分表。
(1) 垂直拆分:
① 垂直分库:以表为依据,根据业务将不同表拆分到不同库中。
每个库的表结构都不一样。
每个库的数据也不一样。
所有库的并集是全量数据。
② 垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。
每个表的结构都不一样。
每个表的数据也不一样,一般通过一列(主键/外键)关联。
所有表的并集是全量数据。
(2) 水平拆分:
① 水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。
每个库的表结构都一样。
每个库的数据都不一样。
所有库的并集是全量数据。
② 水平分表:以字段为依据,按照一定策略,将一个表的数据拆分到多个表中。
每个表的表结构都一样。
每个表的数据都不一样。
所有表的并集是全量数据。
二、MyCat 概述
1、mycat 介绍:
Mycat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用mysql一样来使用 mycat,具体的分库分表的策略,只需要在MyCat中配置即可。
2、mycat 安装:
(1) 环境部署:
10.1.1.10 :MyCat中间件服务器、分片服务器(MySQL、jdk、mycat)
10.1.1.30 :分片服务器(MySQL)
10.1.1.40 :分片服务器(MySQL)
(2) 安装 jdk:
① 解压安装包:
tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local
cd /usr/local
mv jdk1.8.0_171/ jdk/
② 配置环境变量:
vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile
(3) 安装mycat:
tar -zxvf Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz -C /usr/local/
目录介绍:
bin : 存放可执行文件,用于启动停止mycat
conf:存放mycat的配置文件
lib:存放mycat的项目依赖包(jar)
logs:存放mycat的日志文件
更改mysql驱动包:
lib中的mysql-connector-java-5.1.35.jar版本过低,需要替换成mysql-connector-java-8.0.22.jar。
修改权限:
chmod 777 mysql-connector-java-8.0.22.jar
3、mycat 结构:
MyCat的整体结构分为两个部分:逻辑结构和物理结构。
① 逻辑结构(不存放真实数据):
schema:逻辑层面上的数据库。
table:逻辑表,一个逻辑库中可以存有多个逻辑表。
dataNode:分片节点,一个逻辑表中的数据可分散存放在多个分片节点中 ;分片的划分由分片规则决定。
② 物理结构(存放真实数据):
真实的数据库与分片节点相关联,根据分片规则存储数据。
4、mycat 配置:
10.1.1.10 :MyCat中间件服务器、第一个分片服务器
10.1.1.30 :第二个分片服务器
10.1.1.40 :第三个分片服务器
在上述3台分片服务器库中创建数据库 db01。
(1) 配置 schema.xml:
在schema.xml中配置逻辑库、逻辑表、数据节点、节点主机等相关信息。
① 配置mycat逻辑数据库DB01,配置逻辑数据表TB_ORDER,设置三个分片节点dn1、dn2、dn3,设置分片规则为auto-sharding-long。
● auto-sharding-long:根据id值进行分片
vim rule.xml
auto-sharding-long引用了一个range-long方式
以id值作为分片依据:
0-5000000 分配到第一个数据库;
5000001-10000000 分配到第二个数据库;
10000001-15000000 分配到第三个数据库。
② 配置分片节点所关联的真实数据库名及存储数据的库名。
③ 配置真实数据库的信息:
修改name为dhost1/2/3,dbDriver为jdbc。
三台都为读写数据库,角色都是master,配置url,设置登录数据库所需的用户名和密码。
● jdbc:Java Database Connectivity,Java数据库连接,是一种用于数据库访问的应用程序API。
url="jdbc:mysql://10.1.1.10:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="1234" />
(2) 配置 server.xml:
在server.xml中配置登录mycat所需的用户名、密码,以及用户的访问权限信息。
设置登录mycat的用户为root,密码为123456,可访问DB01;
user用户类似,但user用户权限为只读。
5、mycat 测试:
(1) 启动 mycat:
切换到Mycat的安装目录:
bin/mycat start #启动
bin/mycat stop #停止
● 小插曲:第一次启动mycat时失败了,查看启动日志后发现报错原因如下:
Caused by: org.xml.sax.SAXParseException; lineNumber: 18; columnNumber: 88; The reference to entity "serverTimezone" must end with the ';' delimiter.
这条报错信息的意思是在配置真实数据库的url时,serverTimezone结尾漏了一个";",修改了三台真实服务器的url后,mycat启动成功。
(2) 连接 mycat:
mysql -h 10.1.1.10 -P 8066 -uroot -p123456
在MyCat中创建表,并往表结构中插入数据,查看数据在MySQL中的分布情况。
create table tb_order (id BIGINT(20));
mycat 会根据预设的分片规则 (auto-sharding-long) 将数据分配到指定的数据库中。