【Mycat2实战】五、Mycat实现分库分表【实践篇】

Mycat2本系列文章

一、Mycat简介
二、Mycat安装部署
三、Mycat实现读写分离
四、Mycat实现分库分表【概念篇】
五、Mycat实现分库分表【实践篇】

【番外】Mysql主从复制搭建

1. 前言

上篇文章讲述了Mycat分库分表的概念,本文主要讲如何使用Mycat来实现分库分表。

正式配置之前,先声明一下,配置分表这里采用注释配置的方法,配置即可生效并且动态更新Mycat配置并且把配置持久化,具体可参考通过注释配置文档介绍,这个注释配置挺方便的。后面的Mycat分片算法讲解会介绍直接通过建表语句创建分片。

这里介绍和上文Mycat已执行的内容均无关联,这里先重置Mycat配置。重置后读写分离文章中相关的配置全部清除。

/*+ mycat:resetConfig{} */

image-20231116142659742

注意:这里连接Mycat时建议使用Navicat,部分开源的数据库连接软件 逻辑表 可能展示不出来,例如博主使用的这款(满满的全是泪😭),部分图是在Navicat上截取

2. 单数据源单库分表(水平分表)

2.1 准备数据源

创建一个新的数据库连接。127.0.0.1:3308,用户名:root, 密码:123456

image-20231116132052342

2.2 在Mycat上添加数据源

首先使用在Mycat上添加数据源,使用注解就如果读写分离一文中的在conf/datasources目录下创建xxx.datasource.json文件。

/*+ mycat:createDataSource{
	"dbType":"mysql",
	"idleTimeout":60000,
	"initSqls":[],
	"initSqlsGetConnection":true,
	"instanceType":"READ_WRITE",
	"maxCon":1000,
	"maxConnectTimeout":3000,
	"maxRetryCount":5,
	"minCon":1,
	"name":"sharding",
	"password":"123456",
	"type":"JDBC",
	"url":"jdbc:mysql://127.0.0.1:3308?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
	"user":"root",
	"weight":0
} */;

通过命令/*+ mycat:showDataSources{} */,可以看到新增的数据源sharding

image-20231116143246320

同时可以看到在conf/datasources目录下多了sharding.datasource.json文件。

image-20231116143359103

2.3 水平分表实现

127.0.0.1:3308创建数据库xxf_sharding

CREATE DATABASE `xxf_sharding`;

在Mycat数据库执行同步生成schema

/*+ mycat:createSchema{
	"customTables":{},
	"globalTables":{},
	"normalTables":{},
	"schemaName":"xxf_sharding",
	"shardingTables":{},
	"targetName":"sharding"
} */;

接着创建数据分片规则,在Mycat上执行,采用注释方法配置,先看配置:

/*+ mycat:createTable{
  	"schemaName":"xxf_sharding",
	"tableName":"xxf_user",
  	"shardingTable":{
		"createTableSQL":"CREATE TABLE `xxf_user` (
			`id` BIGINT(20) NOT NULL COMMENT '用户ID',
			`user_name` VARCHAR(30) NULL DEFAULT NULL COMMENT '用户姓名',
			`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '用户邮箱',
			`phone` VARCHAR(11) NULL DEFAULT NULL COMMENT '手机号码',
			`sex` CHAR(1) NULL DEFAULT NULL COMMENT '用户性别',
			PRIMARY KEY (`id`) USING BTREE
		) COMMENT='笑小枫-用户信息表' COLLATE='utf8_general_ci' ENGINE=InnoDB;",
  
		"function":{
			"properties":{
				"mappingFormat": "sharding/xxf_sharding/xxf_user_${tableIndex}",
				"dbNum":1, //分库数量
				"tableNum":3, //分表数量
				"tableMethod":"mod_hash(id)", //分表分片函数
				"storeNum":1, //实际存储节点数量
				"dbMethod":"mod_hash(id)" //分库分片函数
				}
		 },
		 "partition":{
		}
	}
} */;
解释一下
mappingFormat属性
targetName/schemaName/tableName
数据库 /物理库名 /物理分表名

targetName:就是配置集群数据源名称,对应prototype.cluster.json 文件中的name属性;

schemaName:逻辑库;

tableName: 分表的名称;

以上属性都支持表达式,比如user_${tableIndex}会自动根据配置的分表数量(tableNum),从0开始,分为xxf_user_0、xxf_user_1、xxf_user_2三个表,配置集群数据源和逻辑库都是这个原理,这里是单数据源单库就不演示了。

另外,建表语句复杂的话可以先导出表结构,复制粘贴到createTableSQL属性后边即可。

算法请参考:分片算法简介——如果默认的算法都不满足需求,可以下载mycat的源代码,然后修改对应的算法,打包来用即可。

执行完成,可以看见在127.0.0.1:3308数据库xxf_sharding生成了3张分片表。

image-20231120095505650

查看一下分片规则,在mycat下执行:

/*+ mycat:showTopology{
	"schemaName":"xxf_sharding",
	"tableName":"xxf_user"
} */;

结果如下:

image-20231120100011277

在Mycat下执行以下插入语句:

INSERT INTO `xxf_user` VALUES (1, '张三1', 'zhangsan1@xiaoxiaofeng.com', '18300000001', '1');
INSERT INTO `xxf_user` VALUES (2, '张三2', 'zhangsan2@xiaoxiaofeng.com', '18300000002', '1');
INSERT INTO `xxf_user` VALUES (3, '张三3', 'zhangsan3@xiaoxiaofeng.com', '18300000003', '1');
INSERT INTO `xxf_user` VALUES (4, '张三4', 'zhangsan4@xiaoxiaofeng.com', '18300000004', '1');
INSERT INTO `xxf_user` VALUES (5, '张三5', 'zhangsan5@xiaoxiaofeng.com', '18300000005', '1');
INSERT INTO `xxf_user` VALUES (6, '张三6', 'zhangsan6@xiaoxiaofeng.com', '18300000006', '1');

在Mycat上可以看到xxf_sharding库下的xxf_user表里有全部的数据。

注意这个xxf_user表是逻辑表,在物理库中是不存在的,主要是综合xxf_user_0~3表的信息

image-20231120101812092

可以看到数据分别插入到了不同的分片上

image-20231120100202306

image-20231120100212054

image-20231120100318285

单数据源的水平拆分表到这里已经实现了,不过这样所有的访问压力仍然都在这一台服务器上,可能并不能满足我们的需求,接下来一起看一下多数据源多库的环境下如何分表吧。

3. 多数据源多库分表(水平分库分表)

先重置一下我们的Mycat。

/*+ mycat:resetConfig{} */

3.1 准备数据源

创建两个新的数据源,分别如下。

`127.0.0.1:3307`,用户名:`root`, 密码:`123456`。
`127.0.0.1:3308`,用户名:`root`, 密码:`123456`。

image-20231120104336203

3.2 在Mycat上添加数据源

在Mycat连接下分别添加ds0和ds1数据源。如下:

添加数据源ds0

/*+ mycat:createDataSource{
	"dbType":"mysql",
	"idleTimeout":60000,
	"initSqls":[],
	"initSqlsGetConnection":true,
	"instanceType":"READ_WRITE",
	"maxCon":1000,
	"maxConnectTimeout":3000,
	"maxRetryCount":5,
	"minCon":1,
	"name":"ds0",
	"password":"123456",
	"type":"JDBC",
	"url":"jdbc:mysql://127.0.0.1:3307?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
	"user":"root",
	"weight":0
} */;

添加数据源ds1

/*+ mycat:createDataSource{
	"dbType":"mysql",
	"idleTimeout":60000,
	"initSqls":[],
	"initSqlsGetConnection":true,
	"instanceType":"READ_WRITE",
	"maxCon":1000,
	"maxConnectTimeout":3000,
	"maxRetryCount":5,
	"minCon":1,
	"name":"ds1",
	"password":"123456",
	"type":"JDBC",
	"url":"jdbc:mysql://127.0.0.1:3308?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
	"user":"root",
	"weight":0
} */;

通过命令/*+ mycat:showDataSources{} */,可以看到新增的数据源。

image-20231120105824567

这里我单独创建了两个数据源配置文件,当然也可以利用已经存在的prototypeDs.datasource.json文件作为数据源1,那么你只需要再配置数据源2就可以了。

3.3 创建集群

创建c0、c1集群,用来关联数据源1、2。

自动分片默认要求集群名字以c为前缀,数字为后缀,c0就是分片表第一个节点,c1就是第二个节点,也可以自己更改命名。

创建集群1:c0

/*+ mycat:createCluster{
	"clusterType":"MASTER_SLAVE",
	"heartbeat":{
		"heartbeatTimeout":1000,
		"maxRetry":3,
		"minSwitchTimeInterval":300,
		"slaveThreshold":0
	},
	"masters":[
		"ds0" //主节点
	],
	"maxCon":2000,
	"name":"c0",
	"readBalanceType":"BALANCE_ALL",
	"switchType":"SWITCH"
} */;

创建集群2:c1

/*+ mycat:createCluster{
	"clusterType":"MASTER_SLAVE",
	"heartbeat":{
		"heartbeatTimeout":1000,
		"maxRetry":3,
		"minSwitchTimeInterval":300,
		"slaveThreshold":0
	},
	"masters":[
		"ds1" //主节点
	],
	"maxCon":2000,
	"name":"c1",
	"readBalanceType":"BALANCE_ALL",
	"switchType":"SWITCH"
} */;

查看添加的集群信息:/*+ mycat:showClusters{} */

image-20231120111911003

3.4 创建分片规则

mycat创建数据库xxf_sharding

在Mycat数据库执行同步生成schema

/*+ mycat:createSchema{
	"customTables":{},
	"globalTables":{},
	"normalTables":{},
	"schemaName":"xxf_sharding",
	"shardingTables":{}
} */;

127.0.0.1:3307127.0.0.1:3308上创建数据库xxf_sharding

CREATE DATABASE `xxf_sharding`;

image-20231120111426381

接着创建数据分片规则,在Mycat上执行,采用注释方法配置,先看配置:

/*+ mycat:createTable{
  "schemaName":"xxf_sharding",
	"tableName":"xxf_user",
  "shardingTable":{
		"createTableSQL":"CREATE TABLE `xxf_user` (
			`id` BIGINT(20) NOT NULL COMMENT '用户ID',
			`user_name` VARCHAR(30) NULL DEFAULT NULL COMMENT '用户姓名',
			`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '用户邮箱',
			`phone` VARCHAR(11) NULL DEFAULT NULL COMMENT '手机号码',
			`sex` CHAR(1) NULL DEFAULT NULL COMMENT '用户性别',
			PRIMARY KEY (`id`) USING BTREE
		) COMMENT='笑小枫-用户信息表' COLLATE='utf8_general_ci' ENGINE=InnoDB;",
  
		"function":{
				"properties":{
					"mappingFormat": "c${targetIndex}/xxf_sharding/xxf_user_${tableIndex}",
					"dbNum":2, //分库数量
					"tableNum":3, //分表数量
					"tableMethod":"mod_hash(id)", //分表分片函数
					"storeNum":2, //实际存储节点数量
					"dbMethod":"mod_hash(id)" //分库分片函数
					}
		 },
		 "partition":{
		}
	}
} */;

可以看到ds0和ds1都已经创建出了对应的3个分片表

image-20231120112120727

查看一下分片规则,在mycat下执行:

/*+ mycat:showTopology{
	"schemaName":"xxf_sharding",
	"tableName":"xxf_user"
} */;

结果如下:

image-20231120112310952

在Mycat下执行以下插入语句:

INSERT INTO `xxf_user` VALUES (1, '张三1', 'zhangsan1@xiaoxiaofeng.com', '18300000001', '1');
INSERT INTO `xxf_user` VALUES (2, '张三2', 'zhangsan2@xiaoxiaofeng.com', '18300000002', '1');
INSERT INTO `xxf_user` VALUES (3, '张三3', 'zhangsan3@xiaoxiaofeng.com', '18300000003', '1');
INSERT INTO `xxf_user` VALUES (4, '张三4', 'zhangsan4@xiaoxiaofeng.com', '18300000004', '1');
INSERT INTO `xxf_user` VALUES (5, '张三5', 'zhangsan5@xiaoxiaofeng.com', '18300000005', '1');
INSERT INTO `xxf_user` VALUES (6, '张三6', 'zhangsan6@xiaoxiaofeng.com', '18300000006', '1');

可以看出来,插入数据根据mod_hash算法分布到了不同的数据源,数据库表中。在Mycat上可以看到xxf_sharding库下的xxf_user表里有全部的数据。

image-20231120135740339

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio 引入Xui框架-简单应用

Android Studio Flamingo | 2022.2.1 Patch 2 Android 11开发、Gradle Version 8.0、 jdk17 源代码:GitHub - xuexiangjys/XUI: 💍A simple and elegant Android native UI framework, free your hands! (一个简洁而优雅的Android原生UI框架&#xff…

python tkinter 使用

python tkinter 使用 ython可以使用多种GUI库来创建窗口页面,例如Tkinter、PyQt、wxPython等。 本篇文章主要讲述如何使用tkinter。 1:导入 import tkinter as tk这时如果运行的话会提示: ModuleNotFoundError: No module named ‘tkint…

卷?中学生开始学习人工智能和大模型,附课件!

卷?中学生开始学习人工智能和大模型,附课件! 大家好,我是老章 发现一个面向11-14岁人群的AI课程,还附加了大模型内容,浏览了一遍它们的课件(还有面向教师的资源),感觉非…

SAP 重复制造简介

重复制造是制造模块三大制造模式(离散、流程、重复)之一,是专门用于产品大批量输出的生产环境。 重复制造与JIT管理思想、拉式生产理念紧密结合,首先在日本企业中得到广泛且成功的运用。与重复制造密切相关的功能,如看…

【力扣】 209. 长度最小的子数组

【力扣】 209. 长度最小的子数组 文章目录 【力扣】 209. 长度最小的子数组1. 题目介绍2. 解法2.1 暴力求解2.2 前缀和 二分查找2.3 滑动窗口2.4 贪心回溯 3. Danger参考 1. 题目介绍 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 …

负载均衡Ribbon和Feign的使用与区别

Ribbon 的介绍 Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。主要功能是提供客户端的软件负载均衡和服务调用。Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer…

“茶叶创新:爆改营销策略,三个月狂销2300万“

我的朋友去年制作了一款白茶,并在短短三个月内将其销售量推到了2300万的高峰。你相信吗? 这位朋友并没有任何茶叶方面的经验,他只是一个有着冒险精神的企业家。他先找到了一家代工厂,帮助他把他的茶叶理念转化为现实。 当他把茶叶…

小趴菜教你如何用Python开发手机App..

Python语言虽然很万能,但用它来开发app还是显得有点不对路,因此用Python开发的app应当是作为编码练习、或者自娱自乐所用,加上目前这方面的模块还不是特别成熟,bug比较多,总而言之,劝君莫轻入。 准备工作 …

Java修仙记之记录一次与前端女修士论道的经历

文章开始之前,想跟我念一句:福生无量天尊,无量寿佛,阿弥陀佛 第一场论道:id更新之争 一个天气明朗的下午,前端的小美女长发姐告诉我:嘿,小后端,你的代码报错了 我答道&am…

【旅游行业】Axure旅游社交平台APP端原型图,攻略门票酒店民宿原型案例

作品概况 页面数量:共 110 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:旅游平台,酒店住宿 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本作品为「旅游社交平台」移动端…

每日一练 | 华为认证真题练习Day134

1、开启标准STP协议的交换机可能存在哪些端口状态?(多选) A. Discarding B. Listening C. Disabled D. Forwarding 2、下列路由协议中优先级最高的是? A. Direct B. RIP C. OSPF D. Static 3、参考如图所示的输出结果&…

如何使用API接口对接淘宝获取店铺销量排序,店铺名称等参数

要接入淘宝官方开放平台API接口获取店铺销量排序,店铺名称等参数,需要按照以下步骤进行操作: 找到可用的API接口:首先,需要找到支持查询店铺信息的API接口。可以在电商数据平台的开放平台上查找相应的API接口。注册并…

PHP 进阶之路 - 亿级 pv 网站架构实战之性能优化

PHP 进阶之路 - 亿级 pv 网站架构实战之性能优化 缘起 PV和PU(数据分析—业务指标) PV即访问次数——用户每访问一次可以看作一次PV。 PU即访问人数——在同一天内,一个用户无论访问了多少次都算一个访客。 通过PV和PU可以分析出用户喜欢…

【无公网IP内网穿透】异地远程访问本地SQL Server数据库

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.本地网页发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 1.前言 数据库的重要性相信大家…

智慧安防监控系统EasyCVR(v3.4)开放协议的介绍及使用

安防视频监控系统EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、视频能力灵活,能…

MS90C386:+3.3V 175MHz 的 24bit 平板显示器(FPD)LVDS 信号接收器

产品简述 MS90C386 芯片能够将 4 通道的低压差分信号( LVDS )转换成 28bit 的 TTL 数据。时钟通道与数据通道并行输入。在时钟频率 为 175MHz 时, 24bit 的 RGB 数据、 3bit 的 LCD 时序数据和 1bit 的控制数据以 1225Mb…

electron桌面应用webSoket实时弹框提示实现

一、实现效果:网页端或者移动端进行了审核操作,在电脑右下角提示用户查看。 1、当有弹框提示的情况时,会弹出如下提示,点击查看自动跳转到当前地址,点击关闭则关闭当前提示窗口; 2、当有两条及其以上的消息…

redis--高可用之持久化

redis高可用相关知识 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务( 如主…

前端css粘性布局,顶部吸附效果(position: sticky)

sticky属性设置 /* 设置粘性布局 */ position: sticky; /* 拖动滚动条,当前元素超出文档0的位置时,触发定位效果(同级元素位置不会受影响) */ top: 0;页面初始效果 设置前(滚动页面时,标签栏随页面滚动&a…

数字电路的基础知识

一、数字电路概述 用数字信号完成对数字量进行逻辑运算和算术运算的电路称为数字电路。 由于它具有逻辑运算和逻辑处理功能,所以又称为数字逻辑电路。 现代的数字电路由半导体工艺制成的数字集成器件构造而成。 逻辑门是数字电路的基本单元电路,就如同在…