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/
总用量 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.以三台服务器分片为例

  1. 环境准备:

  2. 分片配置(/usr/local/mycat/conf/schema.xml



    2-1. 权限配置

  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: 定义逻辑表和逻辑数据库



    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

5.访问

http://192.168.200.210:8082/mycat

mysql运维------分库分表的更多相关文章

  1. MySQL纯透明的分库分表技术还没有

    MySQL纯透明的分库分表技术还没有  种树人./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033 ...

  2. Mysql中的分库分表

    mysql中的分库分表分库:减少并发问题分表:降低了分布式事务分表 1.垂直分表 把其中的不常用的基础信息提取出来,放到一个表中通过id进行关联.降低表的大小来控制性能,但是这种方式没有解决高数据量带 ...

  3. Mycat安装并实现mysql读写分离,分库分表

    Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...

  4. Docker安装Mycat并实现mysql读写分离,分库分表

    Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...

  5. mysql、oracle分库分表方案之sharding-jdbc使用(非demo示例)

    选择开源核心组件的一个非常重要的考虑通常是社区活跃性,一旦项目团队无法进行自己后续维护和扩展的情况下更是如此. 至于为什么选择sharding-jdbc而不是Mycat,可以参考知乎讨论帖子https ...

  6. MYSQL性能优化--分库分表

    1.分库分表 1>纵向分表 将本来可以在同一个表的内容,人为划分为多个表.(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的.) 分表理由:根据数据的活跃度进行分离,(因为不同 ...

  7. mysql为什么要分库分表?

    1 基本思想之什么是分库分表?从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上. 2 基本思想之为什么要分库分表? 单表操作数据量有最优值, ...

  8. mycat+ mysql集群 分库分表

    mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...

  9. 实现对MySQL数据库进行分库/分表备份(shell脚本)

    工作中,往往数据库备份是件非常重要的事情,毕竟数据就是金钱,就是生命!废话不多,下面介绍一下:如何实现对MySQL数据库进行分库备份(shell脚本) Mysq数据库dump备份/还原语法: mysq ...

  10. MyCat:对MySQL数据库进行分库分表

    本篇前提: mycat配置正确,且能正常启动. 1.schema.xml <table>标签: dataNode -- 分片节点指定(取值:dataNode中的name属性值) rule ...

随机推荐

  1. Python爬虫之用Selenium做爬虫

    我们在用python做爬虫的时候,除了直接用requests的架构,还有Scrapy.Selenium等方式可以使用,那么今天我们就来聊一聊使用Selenium如何实现爬虫. Selenium是什么? ...

  2. 解决spring boot 2.6.4版本循环依赖问题

    引用spring boot 2.6.4 版本 报循环依赖错误 *************************** APPLICATION FAILED TO START ************* ...

  3. .Net 开发 web.config参数获取

    System.Configuration.ConfigurationSettings.AppSettings["title"] 对应着 web.config下面的 <conf ...

  4. 【原创】SeetaFace2 Android编译

    SeetaFace2 github上有很完整的编译说明,但是自己编译过程中还是遇到了一点小问题.记录一下 编译环境: wsl ubuntu 20.04 执行编译命令 cmake .. -DCMAKE_ ...

  5. cmake使用boost静态库,错误提示 Could NOT find Boost (missing: Boost_INCLUDE_DIR) (Required is at least version "1.48")

    使用的是Cmake-gui 编译. 问题出在C盘路径下找不到 Boost ,是否需要把boost的路径添加到系统Path 中? 任然不能解决. 更改源码: 找到下面这几行代码(你可以搜索) messa ...

  6. 网络存储服务ip-san搭建

                                         网络存储服务ip-san搭建 ip-san简称SAN(Storage Area Network),中文意思存储局域网络,ip- ...

  7. Surge 开启脚本功能后,京东自动签到总结

    本人小白,花费半天时间才弄好,写下这个给自己和后来人指路. Surge 开启脚本功能后,京东自动签到获取京豆总结: 1.注意 去 Raw 真实地址下载 js https://github.com/No ...

  8. 通过Dnsmasq自建干净的DNS服务

    不晓得为撒,用网上的一些公共DNS服务的时候,总是莫名其妙的有些网站无法解析,有时候114能解析,阿里DNS不行或者腾讯DNS不行,导致总是来回切换DNS,很是烦心. 于是就想着自己搭建一个DNS服务 ...

  9. 区块链技术与应用:02-BTC-密码学原理

    本文为个人整理笔记,知识点来源于北京大学肖臻老师的<区块链技术与应用>公开课视频:https://www.bilibili.com/video/BV1Vt411X7JF?from=sear ...

  10. Spring源码构建踩坑记录

    1:Kotlin: warnings found and -Werror specified Kotlin将程序中的警告变更为错误导致的问题,只需要改变一下级别即可,注意看是那个模块的 解决方式:fi ...