MyCat2之分库分表

原理

        一个数据库由很多表的构成,每个表对应的不同的业务,垂直切分是指按照业务将表进行分类,分不到不同的数据库上,这样压力就分担到了不同的库上面。

数据分片

        数据分片包括里:垂直分片和水平分片,垂直分片包括:垂直分库和垂直分表,水平分片包括: 水平分库和水平分表。

垂直分片

垂直分库

        数据库中不同的表对应着不同的业务,垂直切分是指按照业务的不同将表进行分类,分布到不同的数据库上面;

        将数据库部署在不同服务器上,从而达到多个服务器共同分摊压力的效果

垂直分表

        表中字段太多且包含大字段的时候,在查询时对数据库的IO、内存会受到影响,同时更新数据时,产生的binlog文件会很大,MySQL在主从同步时也会有延迟的风险。

        将⼀个表按照字段分成多表,每个表存储其中⼀部分字段。

        对职位表进⾏垂直拆分, 将职位基本信息放在⼀张表, 将职位描述信息存放在另⼀张表

好处

  • 解决业务层面的耦合,业务清晰
  • 能对不同业务的数据进行分级管理、维护、监控、扩展等
  • 高并发场景下,垂直分库⼀定程度的提高访问性能
  • 垂直拆分没有彻底解决单表数据量过大的问题

水平分片

水平分库

        将单张表的数据切分到多个服务器上去,每个服务器具有相应的库表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。

水平分表

针对数据量巨大的单张表(比如订单表),按照规则把⼀张表的数据切分到多张表里面去。 但是这些表还是在同⼀个库中,所以库级别的数据库操作还是有IO瓶颈。

总结

垂直分表: 将⼀个表按照字段分成多表,每个表存储其中⼀部分字段。
垂直分库: 根据表的业务不同,分别存放在不同的库中,这些库分别部署在不同的服务器.
水平分库: 把⼀张表的数据按照⼀定规则,分配到不同的数据库,每⼀个库只有这张表的部分数据.
水平分表: 把⼀张表的数据按照⼀定规则,分配到同⼀个数据库的多张表中,每个表只有这个表的部分数据。

分库分表

        按照⼀定规则把数据库中的表拆分为多个带有数据库实例,物理库,物理表访问路径的分表。

实现

1.添加数据库、存储数据源

/*+ mycat:createDataSource{
"name":"dw0",

"url":"jdbc:mysql://192.168.140.100:3306", "user":"root",
"password":"123123"
} */;
/*+ mycat:createDataSource{
"name":"dr0", "url":"jdbc:mysql://192.168.140.100:3306", "user":"root",
"password":"123123"
} */;
/*+ mycat:createDataSource{ "name":"dw1", "url":"jdbc:mysql://192.168.140.99:3306", "user":"root",
"password":"123123"
} */;
/*+ mycat:createDataSource{ "name":"dr1", "url":"jdbc:mysql://192.168.140.99:3306", "user":"root",
"password":"123123"
} */;
#通过注释命名添加数据源后,在对应目录会生成相关配置文件 cd /usr/local/mycat/conf/datasources

如下图:

2.添加集群配置

把新添加的数据源配置成集群

#//在 mycat 终端输入
/*! mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */;
/*! mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]} */;
#可以查看集群配置信息
cd /usr/local/mycat/conf/clusters

如下图:

3.创建全局表

#添加数据库db1 CREATE DATABASE db1;
#在建表语句中加上关键字 BROADCAST(广播,即为全局表) CREATE TABLE db1.`travelrecord` (

`id` bigint NOT NULL AUTO_INCREMENT, `user_id` varchar(100) DEFAULT NULL, `traveldate` date DEFAULT NULL, `fee` decimal(10,0) DEFAULT NULL, `days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST; #进入相关目录查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json #可以看到自动生成的全局表配置信息

4.创建分片表(分库分表)

#在 Mycat 终端直接运行建表语句进行数据分片 CREATE TABLE db1.orders(
id BIGINT NOT NULL AUTO_INCREMENT, order_type INT,

customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY `id` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id) tbpartitions 1 dbpartitions 2;
#数据库分片规则,表分片规则,以及各分多少片
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
SELECT * FROM orders;
#同样可以查看生成的配置信息
#进入相关目录查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json

5.创建ER表

 

上述两表具有相同的分片算法,但是分片字段不相同 Mycat2 在涉及这两个表的 join 分片字段等价关系的时候可以完成 join 的下推

常用分片规则

MOD_HASH

如果分片值是字符串则先对字符串进行hash转换为数值类型

分库键和分表键是同键

分表下标=分片值%(分库数量*分表数量)

分库下标=分表下标/分表数量

分库键和分表键是不同键

分表下标= 分表分片值%分表数量

分库下标= 分库分片值%分库数量

create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by MOD_HASH (id) dbpartitions 6
tbpartition by MOD_HASH (id) tbpartitions 6;create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by MOD_HASH (id) dbpartitions 6
tbpartition by MOD_HASH (id) tbpartitions 6;

RANGE_HASH

RANGE_HASH(字段1, 字段2, 截取开始下标)

仅支持数值类型,字符串类型

当时字符串类型时候,第三个参数生效

计算时候优先选择第一个字段,找不到选择第二个字段

如果是字符串则根据下标截取其后部分字符串,然后该字符串hash成数值

根据数值按分片数取余

要求截取下标不能少于实际值的长度

两个字段的数值类型要求一致

create table travelrecord(
...
)ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by RANGE_HASH(id,user_id,3) dbpartitions 3
tbpartition by RANGE_HASH(id,user_id,3) tbpartitions 3;

RIGHT_SHIFT

RIGHT_SHIFT(字段名,位移数)

仅支持数值类型

分片值右移二进制位数,然后按分片数量取余

create table travelrecord(
 ...
)ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by RIGHT_SHIFT(id,4) dbpartitions 3
tbpartition by RIGHT_SHIFT(user_id,4) tbpartitions 3;

UNI_HASH

如果分片值是字符串则先对字符串进行hash转换为数值类型

分库键和分表键是同键

分库下标=分片值%分库数量

分表下标=(分片值%分库数量)*分表数量+(分片值/分库数量)%分表数量

分库键和分表键是不同键

分表下标= 分片值%分表数量

分库下标=分片值%分库数量

create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by UNI_HASH (id) dbpartitions 6
tbpartition by UNI_HASH (id) tbpartitions 6;

WEEK

仅用于分表

仅DATE/DATETIME

一周之中的星期(1-7)进行取余运算

tbpartitions不超过7

create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by xxx(xx) dbpartitions 8
tbpartition by WEEK(xx) tbpartitions 7;

YYYYDD

仅用于分库

DD是一年之中的天数

(YYYY*366+DD)%分库数

create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by YYYYDD(xxx) dbpartitions 8
tbpartition by xxx(xxx) tbpartitions 12;

YYYYMM

仅用于分库:(YYYY*12+MM)%分库数.MM是1-12

create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by YYYYMM(xxx) dbpartitions 8
tbpartition by xxx(xx) tbpartitions 12;

    "travelrecord":{
            "createTableSQL":"CREATE TABLE db1.travelrecord (\n\t`id` bigint(22) NOT NULL\n) ENGINE = InnoDB CHARSET = utf8\nDBPARTITION BY YYYYMM(id) DBPARTITIONS 12",
            "function":{
                "properties":{
                    "dbNum":"36",
                    "mappingFormat":"prototype/db1/travelrecord_${ 2022+(index.toInteger()-1).intdiv(12) }_${  if(index.toInteger()==0)return 'any';  var i=  (index.toInteger()).mod(12);  if(i==0)return '12'; return i; }",

                    "storeNum":1,
                    "dbMethod":"YYYYMM(id)"
                }
            },
            "shardingIndexTables":{}
        }

DD

仅用于分表

仅DATE/DATETIME

一月中的第几天(1-31)%分表数

tbpartitions不能超过31

create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by xxx(xx) dbpartitions 8
tbpartition by DD(xx) tbpartitions 31;

YYYYWEEK

支持分库分表

(YYYY*54+WEEK)%分片数

WEEK的范围是1-53

java.time.temporal.WeekFields#weekOfWeekBasedYear

create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by YYYYWEEK(xx) dbpartitions 8
tbpartition by xxx(xx) tbpartitions 12;

MM

仅用于分表

仅支持DATE/DATETIME

月份(1-12)%分表数

tbpartitions不超过12

create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by xxx(xxx) dbpartitions 12
tbpartition by MM(xxx) tbpartitions 12;

MMDD

仅用于分表

仅DATE/DATETIME

一年之中第几天%分表数

tbpartitions不超过366

create table travelrecord (
 ....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by xxx(xx) dbpartitions 8
tbpartition by MMDD(xx) tbpartitions 366;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装依赖报-gyp: No Xcode or CLT version detected!

错误 > node-gyp rebuild No receipt for com.apple.pkg.CLTools_Executables found at /. No receipt for com.apple.pkg.DeveloperToolsCLILeo found at /. No receipt for com.apple.pkg.DeveloperToolsCLI found at /. gyp: No Xcode or CLT version detected! gyp ERR!…

【Spark加速】加大hive表在HDFS存的分片文件大小

配置参数: spark.hadoop.hive.exec.orc.default.stripe.size78643200 spark.hadoop.orc.stripe.size78643200 spark.hadoopRDD.targetBytesInPartition78643200 spark.hadoop.hive.exec.dynamic.partition.modenonstrict spark.sql.sources.partitionOverwriteModed…

【wiki知识库】02.wiki知识库SpringBoot后端的准备

📝个人主页:哈__ 期待您的关注 目录 一、🔥今日目标 二、📂打开SpringBoot项目 2.1 导入所需依赖 2.2修改application.yml配置文件 2.3导入MybatisPlus逆向工程工具 2.4创建一个公用的返回值 2.5创建CopyUtil工具类 2.6创建…

科技与心理学的协同舞蹈

在探讨盲人如何利用如“蝙蝠避障”这样的辅助软件融入日常生活的同时,我们不得不深入触及盲人教育心理学的核心,这一领域致力于理解盲人在学习与成长过程中独特的心理需求与挑战,以及如何通过教育策略激发他们的潜能,促进全面发展…

前端Vue自定义顶部搜索框:实现热门搜索与历史搜索功能

前端Vue自定义顶部搜索框:实现热门搜索与历史搜索功能 摘要: 随着前端开发复杂性的增加,组件化开发成为了提高效率和降低维护成本的有效手段。本文介绍了一个基于Vue的前端自定义顶部搜索框组件,该组件不仅具备基本的搜索功能&am…

powershell脚本批量拉取 git仓库文件

# 定义基础URL和数据库列表 $BASE_URL "http://8.8.11.99:8999/yaya/" $DATABASES "common-service", "bi-system", "erp", "gateway", "pdm", "plm", "public-service", "scm"…

Micro SD封装是什么?

我们了解客户对于Micro SD封装的疑问。在这篇文章中,我们将详细解释Micro SD封装是什么,以及其在存储领域的技术原理和应用情况,帮助客户更好地理解这一技术。 1. Micro SD封装的定义 Micro SD封装是指一种特定尺寸的存储芯片封装方式&#x…

windows 11 23H2更新总是失败解决过程

频繁更新失败的困扰 最近一个月以来 windows 11 系统 23H2 更新总是失败,更新失败会撤销更改: 之后会自动重启系统,但是重启进不去系统,屏幕有背光但是不显示任何内容。 这时候只能长按开机键强制关机。每次出现这种情况我都没办法远程连接到…

大规模团队的数据库开发,如何用OceanBase工具快速建立企业级账号体系

前言 为了让数据库开发的安全性与可靠性得以充分保障,数据库开发工具的管控能力显得尤为关键。构建一个健全的账号体系,能够协助开发团队实现对数据库开发工具的全方位管控,从而有效防范各类数据安全隐患,确保数据库开发的顺利进…

【Python】搭建pypi私仓

1. 下载依赖 pip install pypiserver # 命令安装 pypiserver 库 pip install passlib # passlib 包来读取 Apache htpasswd 文件apt-get install -y apache2-utils2. 生成密码 使用htpasswd库在指定路径/path/to/.pypipasswd生成密码文件 htpasswd -c /path/to/.pypipasswd …

【开源】租房管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、系统介绍 租客屋主模块 房源信息模块 租客评价模块 房源订单模块 留言板模块 二、系统截图 三、核心代码 一、系统介绍 基于Vue.js和SpringBoot的租房管理系统,分为管理后台和用户网页端,可以给管理员、租客和屋主角色使用&#xff0c…

大模型应用之基于Langchain的测试用例生成

一 用例生成实践效果 在组内的日常工作安排中,持续优化测试技术、提高测试效率始终是重点任务。近期,我们在探索实践使用大模型生成测试用例,期望能够借助其强大的自然语言处理能力,自动化地生成更全面和高质量的测试用例。 当前…

【cocos creator】进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示

进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示 const { ccclass, property, menu } cc._decorator;let text_type cc.Enum({"20%": 0,"1/5": 1,"差值": 2,"自定义…

Django结合Manager重写create、update、delete方法

想要重写create、update、delete方法我们先要了解一下其他的知识点 Manager 在Django中,Manager是一个非常核心的概念,它负责与数据库交互,提供了访问和管理模型实例(即数据库中的记录)的方式。每个Django模型类默认…

jupyter lab怎么使用cmd打开

我一般都是用vscode,或者pycharm的终端打开 但是我为了秉承程序员的素养(就是觉得命令行打开很帅) 我试着去直接用一样的命令,但是不行,显示不是内部命令之类的。 是因为没有配置环境变量。 但是我突然发现&#x…

【计算机毕业设计】基于SSM++jsp的汽车客运站管理系统【源码+lw+部署文档】

目录 第1章 绪论 1.1 课题背景 1.2 课题意义 1.3 研究内容 第2章 开发环境与技术 2.1 MYSQL数据库 2.2 JSP技术 2.3 SSM框架 第3章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统流程 3.2.1 操作流程 3.2.2 登录流程 3.2.3 删除信息流…

rpm与yum扩展、命令

目录 系统安装软件方式 1、rpm方式 命令 yum方式 安装 更新和升级 查找与显示 删除程序 清除缓存 仅下载 系统安装软件方式 1、rpm方式 优点:无需网络安装软件 缺点:无法解决软件依赖 命令 rpm -ivh 安装 --nodeps忽略依赖关系 --force强…

希尔伯特 包络证明 未出现模态混合现象 是啥?

希尔伯特变换在信号处理中常用于求信号的包络,它是一种线性运算,能够将实数信号转换为其解析信号,即包含原信号及其希尔伯特变换的复数信号。解析信号的实部是原信号,虚部是原信号的希尔伯特变换。 包络证明 在信号处理中&#…

TypeScript 学习笔记(五):异步编程与错误处理

1. 引言 在前几篇学习笔记中,我们介绍了 TypeScript 的基础知识、高级类型系统、模块与命名空间以及装饰器和高级编程技巧。本篇将重点探讨 TypeScript 中的异步编程与错误处理,帮助你在实际项目中更好地处理异步操作和错误。 2. 异步编程 异步编程是现代 JavaScript 应用…

C语言预处理中#和##运算符是什么意思?

一、问题 有⼈认为,在C 语⾔中使⽤“#”运算符的就是预处理,是不是呢?“##”⼜是什么呢? 二、解答 在程序中,最为常⻅的是#define 宏定义指令,下⾯通过这个指令理解⼀下“#”的作⽤。编写⼀个预处理指令&a…