1. 介绍

问题分析:

随着互联网以及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:

IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。
CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。
image
分库分表的中心思想就是将数据分散存储,使得单一数据库/表的数据量变小来缓解的单一数据库的性能问题,从而达到提升数据库性能的目的。

拆分策略

  1. 垂直拆分
    a. 垂直分库
    将业务拆分成几个独立的单元, 根据业务单元将原来的单库分成多个结构不同的库, 用外键相连,数据的并集是原来的单库
    image

    b. 垂直分表
    把原来支持多个业务的宽表拆分成多个窄表,每个窄表之间通过外键相连, 他们的并集是原来的那个宽表
    image

  2. 水平拆分
    a. 水平分库
    根据某个字段(比如自增id,时间戳)按照一定的策略(取模,范围,hash,枚举,应用指定,日期等)讲原来的单库拆分成多个结构相同的库
    image

    b. 水平分表
    根据某个字段(比如自增id,时间戳)按照一定的策略(取模,范围,hash,枚举,应用指定,日期等)讲原来的单库拆分成多个结构相同的库
    image

2. 实现技术

Mycat

Mycat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。它位于mysql与应用程序之间,经过相应的配置后,应用程序通过mycat来访问mysql,mycat通过分片规则来决定应用程序应该访问哪个分库, 而应用程序感觉不到.
image

a. 下载

下载地址:http://dl.mycat.org.cn/

b. 安装

Mycat是采用Java语言开发的开源的数据库中间件,支持Windows和Linux运行环境,需要提前在准备好的服务器中安装如下软件:
⚪ MySQL
⚪ JDK
⚪ Mycat

  1. 利用工具上传Mycat压缩包到服务器
    Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz
  2. 解压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架构图

image

d.以三台服务器分片为例

  1. 环境准备:
    image
  2. 分片配置(/usr/local/mycat/conf/schema.xml
    image
    2-1. 权限配置
    image
  3. 启动服务
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

  1. 配置文件介绍
  • schema.xml: 定义逻辑表和逻辑数据库
    image
    schema.xml作为Mycat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。
    ⚪ schema标签
    image
    <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标签
    image
    <dataNode>标签中定义了MyCat中的数据节点,也就是数据分片。一个dataNode标签就是一个独立的数据分片。
    核心属性
    name:定义数据节点名称
    dataHost:数据库实例主机名称,引用自dataHost标签中name属性
    database:定义分片所属数据库
    ⚪ datahost标签
    image
    该标签在MyCat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。
    核心属性
    name:唯一标识,供上层标签使用
    maxCon/minCon:最大连接数/最小连接数
    balance:负载均衡策略,取值0,1,2,3
    writeType:写操作分发方式(0:写操作转发到第一个writeHost,第一个挂了,切换到第二个;1:写操作随机分发到配置的writeHost)
    dbDriver:数据库驱动,支持native、jdbc
    image

  • rule.xml: 用来定义分片规则
    rule.xml中定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签:tableRule、Function。,
    image

  • server.xml: 用来配置mycat系统配置和用户配置
    server.xml配置文件包含了MyCat的系统配置信息,主要有两个标签:system、user。
    ⚪ system标签
    ⚪ user标签
    image

修改配置文件进行分片

1. 垂直拆分

⚪ 场景
在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据库进行拆分,原有的数据库表如下。
image
分别在三台MySQL中创建数据库shopping。
⚪ 配置
image
image
⚪ 全局表配置
对于省、市、区/县表,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设为全局表,利于业务操作。
image

2. 水平拆分

⚪ 场景
单表太大: 在业务系统中,有一张表(日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分。
image
⚪ 配置
image
⚪ 分片规则
1. 按指定指端值的范围
image
image

2. 对指定字段的值取模
image
image

3. 枚举
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。
image
image

4. 应用指定
运行阶段由应用自主决定路由到哪个分片,直接根据字符子串(必须是数字)计算分片号。
image
image

5. 一致性hash
一致性hash,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加改变原来数据的分区位置。
image
image

6. 固定分片hash算法
image
image

7. 字符串hash解析
截取字符串中的指定位置的子字符串,进行hash算法,算出分片
image
image

8. 按(天)日期分片
image
image

9. 按(自然月)日期分片
image
image

Mycat管理及监控

1. Mycat原理

image

2. Mycat管理

Mycat默认开通2个端口,可以在server.xml中进行修改。
⚪ 8066数据访问端口,进行DML和DDL操作。
⚪ 9066数据库管理端口,mycat服务管理控制功能,用于管理mycat的整个集群状态
mysql -h 192.168.200.210 -p 9066 -uroot -proot
image

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

5.访问
http://192.168.200.210:8082/mycat