1. 介绍
问题分析:
随着互联网以及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:
IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。
CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。
分库分表的中心思想就是将数据分散存储,使得单一数据库/表的数据量变小来缓解的单一数据库的性能问题,从而达到提升数据库性能的目的。
拆分策略
-
垂直拆分
a. 垂直分库
将业务拆分成几个独立的单元, 根据业务单元将原来的单库分成多个结构不同的库, 用外键相连,数据的并集是原来的单库
b. 垂直分表
把原来支持多个业务的宽表拆分成多个窄表,每个窄表之间通过外键相连, 他们的并集是原来的那个宽表
-
水平拆分
a. 水平分库
根据某个字段(比如自增id,时间戳)按照一定的策略(取模,范围,hash,枚举,应用指定,日期等)讲原来的单库拆分成多个结构相同的库
b. 水平分表
根据某个字段(比如自增id,时间戳)按照一定的策略(取模,范围,hash,枚举,应用指定,日期等)讲原来的单库拆分成多个结构相同的库
2. 实现技术
Mycat
Mycat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。它位于mysql与应用程序之间,经过相应的配置后,应用程序通过mycat来访问mysql,mycat通过分片规则来决定应用程序应该访问哪个分库, 而应用程序感觉不到.
a. 下载
b. 安装
Mycat是采用Java语言开发的开源的数据库中间件,支持Windows和Linux运行环境,需要提前在准备好的服务器中安装如下软件:
⚪ MySQL
⚪ JDK
⚪ Mycat
- 利用工具上传Mycat压缩包到服务器
Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz
- 解压Mycat的压缩包
tar -zxvf Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz -C /usr/local/
mycat目录结构
[pmish@localhost mycat]$ ll /usr/local/mycat/
总用量 12
drwxr-xr-x. 2 root root 190 4月 11 09:53 bin
drwxrwxrwx. 2 root root 6 4月 15 2020 catlet
drwxrwxrwx. 4 root root 4096 4月 11 09:53 conf
drwxr-xr-x. 2 root root 4096 4月 11 09:53 lib
drwxrwxrwx. 2 root root 6 8月 31 2021 logs
-rwxrwxrwx. 1 root root 227 9月 13 2021 version.txt
目录 | 作用 |
---|---|
bin | 存放可执行文件,用于启动停止mycat |
conf | 存放mycat的配置文件 |
lib | 存放mycat的项目依赖包(jar) |
logs | 存放mycat的日志文件 |
c. mycat架构图
d.以三台服务器分片为例
- 环境准备:
- 分片配置(
/usr/local/mycat/conf/schema.xml
)
2-1. 权限配置
- 启动服务
cd /usr/local/mycat
bin/mycat start #启动
bin/mycat stop #停止
mycat启动之后占用端口8066
启动完毕之后,可以查看logs目录下的启动日志,查看Mycat是否启动完成。
tail -f logs/wrapper.log
通过如下指令,连接并登录Mycat
mysql -h -P 8066 -uroot -p
- 配置文件介绍
-
schema.xml: 定义逻辑表和逻辑数据库
schema.xml
作为Mycat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。
⚪ schema标签
<schema>
标签用于定义MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。MyCat中的逻辑库的概念,等同于MySQL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。
核心属性:
● name:指定自定义的逻辑库库名
● checkSQLschema:在SQL语句操作时指定了数据库名称,执行时是否自动去除;true:自动去除,false:不自动去除
● sqlMaxLimit:如果未指定limit进行查询,列表查询模式查询多少条记录
<table>
标签定义了MyCat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义。
核心属性:
● name:定义逻辑表名,在该逻辑库下唯一
● dataNode:定义逻辑表所属的dataNode,该属性需要与dataNode标签中name对应;多个dataNode逗号分割
● rule:分片规则的名字,分片规则名字是在rule.xml中定义的
● primaryKey:逻辑表对应真实表的主键
● type:逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为global
⚪ datanode标签
<dataNode>
标签中定义了MyCat中的数据节点,也就是数据分片。一个dataNode标签就是一个独立的数据分片。
核心属性:
● name:定义数据节点名称
● dataHost:数据库实例主机名称,引用自dataHost标签中name属性
● database:定义分片所属数据库
⚪ datahost标签
该标签在MyCat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。
核心属性:
● name:唯一标识,供上层标签使用
● maxCon/minCon:最大连接数/最小连接数
● balance:负载均衡策略,取值0,1,2,3
● writeType:写操作分发方式(0:写操作转发到第一个writeHost,第一个挂了,切换到第二个;1:写操作随机分发到配置的writeHost)
● dbDriver:数据库驱动,支持native、jdbc
-
rule.xml: 用来定义分片规则
rule.xml中定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签:tableRule、Function。,
-
server.xml: 用来配置mycat系统配置和用户配置
server.xml
配置文件包含了MyCat的系统配置信息,主要有两个标签:system、user。
⚪ system标签
⚪ user标签
修改配置文件进行分片
1. 垂直拆分
⚪ 场景
在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据库进行拆分,原有的数据库表如下。
分别在三台MySQL中创建数据库shopping。
⚪ 配置
⚪ 全局表配置
对于省、市、区/县表,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设为全局表,利于业务操作。
2. 水平拆分
⚪ 场景
单表太大: 在业务系统中,有一张表(日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分。
⚪ 配置
⚪ 分片规则
1. 按指定指端值的范围
2. 对指定字段的值取模
3. 枚举
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。
4. 应用指定
运行阶段由应用自主决定路由到哪个分片,直接根据字符子串(必须是数字)计算分片号。
5. 一致性hash
一致性hash,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加改变原来数据的分区位置。
6. 固定分片hash算法
7. 字符串hash解析
截取字符串中的指定位置的子字符串,进行hash算法,算出分片
8. 按(天)日期分片
9. 按(自然月)日期分片
Mycat管理及监控
1. Mycat原理
2. Mycat管理
Mycat默认开通2个端口,可以在server.xml中进行修改。
⚪ 8066数据访问端口,进行DML和DDL操作。
⚪ 9066数据库管理端口,mycat服务管理控制功能,用于管理mycat的整个集群状态
mysql -h 192.168.200.210 -p 9066 -uroot -proot
3. Mycat-eye
⚪ 介绍
Mycat-web(Mycat-eye)是对mycat-server提供监控服务,功能不局限于对mycat-server使用。他通过JDBC连接对Mycat、Mysql监控,监控远程服务器(仅限于Linux系统)的cpu、内存、网络、磁盘。
Mycat-eye运行过程中需要依赖zookeeper,因此需要先安装zookeeper。
⚪ 安装
Zookeeper安装
1.上传安装包
zookeeper-3.4.6.tar.gz
2.解压
tar -zxcf zookeeper-3.4.6.tar.gz -C /usr/local/
3.创建数据存放目录
cd /usr/local/zookeeper-3.4.6/
mkdir data
4.修改配置文件名称并配置
cd config
mv zoo_sample.cfg zoo.cfg
5.配置数据存放目录
dataDir=/usr/local/zookeeper-3.4.6/data
6.启动zookeeper
bin/zkServer.sh start
#启动
bin/zkServer.sh status
#查看状态
Mycat-web安装
1.上传安装包
Mycat-web.tar.gz
2.解压
tar -zxvf Mycat-web.tar.gz -C /usr/local/
3.目录介绍
lib —> 依赖jar包
mycat-web —>mycat-web项目
readme.txt
start.jar —>启动jar
start.sh —>linux启动脚本
4.启动
sh start.sh