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. puts()与scanf(“%s”)

    使用gets()即使字符串中含有空格,依然可以接收,而scanf()不会. Example: /* 输入一个字符串到字符数组s1中,将s1中的字符串复制到字符数组s2中并输出s2中的字符串. 不用st ...

  2. 看懂插入才算看懂redis跳表

    跳表的数据结构 forward相当于9之于8,12之于8 插入算法流程: 1.初始化两个数组update和rank数组:update表示每一层的前继节点.rank表示update节点到头结点的距离(用 ...

  3. spring boot 中 CommandLineRunner接口使用

    接口定义:接口,用于指示bean包含在SpringApplication中时应运行.可以在同一应用程序上下文中定义多个CommandLineRunner bean,并可以使用ordered接口或@Or ...

  4. 油猴CSDN净化脚本

    CSDN版面越来越乱,最近还总是弹出红包雨和顶部巨大横幅,左侧也会随机出现学生认证弹窗.而且版面混乱难看,看起来非常费劲. 另外底下的推荐列表经常夹杂着CSDN文件下载的链接,下载文件又要付费,从来不 ...

  5. VSCode-关于自动格式化问题

    Code ->首选项 ->设置 ,在搜索框上输入"格式化" 设置格式化后挂号会自动补齐,关键字会自动添加空格,

  6. K8S—dashboard ui部署

    一.Dashboard UI概述 仪表板是基于Web的Kubernetes用户界面.您可以使用仪表板将容器化应用程序部署到Kubernetes集群,对容器化应用程序进行故障排除,并管理集群本身及其伴随 ...

  7. Sqoop连接数据库MySQL报错

    1.问题描述 (1)问题示例: [Hadoop@master TestDir]$ sqoop list-databases --connect jdbc:mysql://master:3306/ -- ...

  8. Oracle 取Group By 第一条

    select *from (select emp.*,row_number() over(partition by deptno order by rownum) cn from emp)where ...

  9. Python第四章实验报告

    一.实验项目名称:<零基础学Python>第四章的14道实例和4道实战 二.实验环境:IDLE(Python 3.9 64-bit) 三.实验目的和要求:熟练掌握Python序列的应用 四 ...

  10. Qt 5.15.2 QTextEdit无法设置新字体的处理方式

    首发于我的个人博客:xie-kang.com 博客内有更多文章,欢迎大家访问 原文地址 在使用QT 5.15.2 开发的过程中碰到了件怪事,下列代码无法给QTextEdit选中的文字设置字体: QTe ...