1. 介绍

问题分析:

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

IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。
CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出现瓶颈。

分库分表的中心思想就是将数据分散存储,使得单一数据库/表的数据量变小来缓解的单一数据库的性能问题,从而达到提升数据库性能的目的。

拆分策略

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

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

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

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

2. 实现技术

Mycat

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

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/总用量 12drwxr-xr-x. 2 root root190 4月11 09:53 bindrwxrwxrwx. 2 root root6 4月15 2020 catletdrwxrwxrwx. 4 root root 4096 4月11 09:53 confdrwxr-xr-x. 2 root root 4096 4月11 09:53 libdrwxrwxrwx. 2 root root6 8月31 2021 logs-rwxrwxrwx. 1 root root227 9月13 2021 version.txt
目录作用
bin存放可执行文件,用于启动停止mycat
conf存放mycat的配置文件
lib存放mycat的项目依赖包(jar)
logs存放mycat的日志文件

c. mycat架构图

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

  1. 环境准备:
  2. 分片配置(/usr/local/mycat/conf/schema.xml

    2-1. 权限配置

  3. 启动服务
cd /usr/local/mycatbin/mycat start #启动bin/mycat stop #停止

mycat启动之后占用端口8066
启动完毕之后,可以查看logs目录下的启动日志,查看Mycat是否启动完成。
tail -f logs/wrapper.log
通过如下指令,连接并登录Mycat
mysql -h -P 8066 -uroot -p

  1. 配置文件介绍
  • schema.xml: 定义逻辑表和逻辑数据库

    schema.xml作为Mycat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置。
    ⚪ schema标签

    标签用于定义MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。MyCat中的逻辑库的概念,等同于MySQL中的database概念,需要操作某个逻辑库下的表时,也需要切换逻辑库(use xxx)。
    核心属性
    name:指定自定义的逻辑库库名
    checkSQLschema:在SQL语句操作时指定了数据库名称,执行时是否自动去除;true:自动去除,false:不自动去除
    sqlMaxLimit:如果未指定limit进行查询,列表查询模式查询多少条记录

    标签定义了MyCat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义。
    核心属性
    name:定义逻辑表名,在该逻辑库下唯一
    dataNode:定义逻辑表所属的dataNode,该属性需要与dataNode标签中name对应;多个dataNode逗号分割
    rule:分片规则的名字,分片规则名字是在rule.xml中定义的
    primaryKey:逻辑表对应真实表的主键
    type:逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为global
    ⚪ 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 configmv zoo_sample.cfg zoo.cfg

    5.配置数据存放目录
    dataDir=/usr/local/zookeeper-3.4.6/data

    6.启动zookeeper
    bin/zkServer.shstart#启动
    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.txtstart.jar —>启动jarstart.sh —>linux启动脚本

    4.启动
    sh start.sh

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

    Copyright © maxssl.com 版权所有 浙ICP备2022011180号