MyCat实现分库分表

news2024/11/24 7:00:34

两个集群 两个库 两个表

  • 搭建数据库服务
    • 使用docker启动两个mysql 3506 3507
    • 连接MyCat创建两个数据源
    • 连接MyCat创建集群
  • mycat创建逻辑库
  • MyCat创建全局表广播表
  • 创建分片表
    • mycat逻辑库
    • MyCat插入数据
    • mycat查看数据
    • 物理库3506查看数据
    • 物理库3507查看数据
  • ER表
    • 创建ER表
    • mycat插入数据
    • mycat查询数据
    • 物理节点3506数据分布
    • 物理节点3507数据分布
    • join关联查询

相关文档
MyCat安装

搭建数据库服务

使用docker启动两个mysql 3506 3507

version: '3'
services:
  lx-one:
    image: mysql:8.0.29
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_PASSWORD: 123456
    ports:
      - 3506:3306
    container_name: "lx-one"
    
  lx-two:
    image: mysql:8.0.29
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_PASSWORD: 123456
    ports:
      - 3507:3306

    container_name: "lx-two"
    
   

连接MyCat创建两个数据源

/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://172.23.85.23:3506",
"user":"root",
"password":"123456"
} */;

/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://172.23.85.23:3506",
"user":"root",
"password":"123456"
} */;

/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://172.23.85.23:3507",
"user":"root",
"password":"123456"
} */;

/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://172.23.85.23:3507",
"user":"root",
"password":"123456"
} */;

在这里插入图片描述

连接MyCat创建集群

/*! mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]}*/;
/*!mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]}*/;

在这里插入图片描述
c0.cluster.json

{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetryCount":3,
                "minSwitchTimeInterval":300,
                "showLog":false,
                "slaveThreshold":0.0
        },
        "masters":[
                "dw0"
        ],
        "maxCon":2000,
        "name":"c0",
        "readBalanceType":"BALANCE_ALL",
        "replicas":[
                "dr0"
        ],
        "switchType":"SWITCH"
}

c1.cluster.json

{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetryCount":3,
                "minSwitchTimeInterval":300,
                "showLog":false,
                "slaveThreshold":0.0
        },
        "masters":[
                "dw1"
        ],
        "maxCon":2000,
        "name":"c1",
        "readBalanceType":"BALANCE_ALL",
        "replicas":[
                "dr1"
        ],
        "switchType":"SWITCH"
}

集群文件名称规范是 c0.cluster.json 、 c1.cluster.json 、 c2.cluster.json,以此类推,mycat启动的时候才会自动识别集群配置文件。

mycat创建逻辑库

CREATE DATABASE db1

在这里插入图片描述
db1.shema.json内容

{
        "customTables":{},
        "globalTables":{},
        "normalProcedures":{},
        "normalTables":{},
        "schemaName":"db1",
        "shardingTables":{},
        "views":{}
}

MyCat创建全局表广播表

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;

查看db1.schema.json变化

{
        "customTables":{},
        "globalTables":{
                "travelrecord":{
                        "broadcast":[
                                {
                                        "targetName":"c1"
                                },
                                {
                                        "targetName":"c0"
                                }
                        ],
                        "createTableSQL":"CREATE TABLE db1.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) BROADCAST ENGINE = InnoDB CHARSET = utf8"
                }
        },
        "normalProcedures":{},
        "normalTables":{},
        "schemaName":"db1",
        "shardingTables":{},
        "views":{}
}

不需要自己指定targetName,创建全局表之后 会自动指定targetName。可能是自动识别了集群配置文件。因为全局表是每个库都要有的。所以mycat需要知道有哪些数据库

两个数据库3506、3507物理表有什么变化呢
在这里插入图片描述
发现两个MySQL服务也都有了db1 库和表

创建分片表

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;

查看db1.schema.json变化

{
        "customTables":{},
        "globalTables":{
                "travelrecord":{
                        "broadcast":[
                                {
                                        "targetName":"c1"
                                },
                                {
                                        "targetName":"c0"
                                }
                        ],
                        "createTableSQL":"CREATE TABLE db1.`travelrecord` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`user_id` varchar(100) DEFAULT NULL,\n\t`traveldate` date DEFAULT NULL,\n\t`fee` decimal(10, 0) DEFAULT NULL,\n\t`days` int DEFAULT NULL,\n\t`blob` longblob,\n\tPRIMARY KEY (`id`),\n\tKEY `id` (`id`)\n) BROADCAST ENGINE = InnoDB CHARSET = utf8"
                }
        },
        "normalProcedures":{},
        "normalTables":{},
        "schemaName":"db1",
        "shardingTables":{
                "orders":{
                        "createTableSQL":"CREATE TABLE db1.orders (\n\tid BIGINT NOT NULL AUTO_INCREMENT,\n\torder_type INT,\n\tcustomer_id INT,\n\tamount DECIMAL(10, 2),\n\tPRIMARY KEY (id),\n\tKEY `id` (`id`)\n) ENGINE = INNODB CHARSET = utf8\nDBPARTITION BY mod_hash(customer_id) DBPARTITIONS 2\nTBPARTITION BY mod_hash(customer_id) TBPARTITIONS 1",
                        "function":{
                                "properties":{
                                        "dbNum":"2",
                                        "mappingFormat":"c${targetIndex}/db1_${dbIndex}/orders_${index}",
                                        "tableNum":"1",
                                        "tableMethod":"mod_hash(customer_id)",
                                        "storeNum":2,
                                        "dbMethod":"mod_hash(customer_id)"
                                }
                        },
                        "shardingIndexTables":{}
                }
        },
        "views":{}
}

文件解释

  • shardingTables :分片表规则
  • shardingTables.properties: 分片配置
  • dbNum:分库数量
  • dbMethod(customer_id) :库的分片算法,以及根据的字段
  • tableNum:分表数量
  • tableMethod(customer_id) :表的分片算法,以及根据的字段

mycat逻辑库

在这里插入图片描述
物理库 两个MySQL 服务也都分了库和表
在这里插入图片描述
为什么出现了db1_0和db1_1

因为在创建表的时候指定了数据库分片规则和数据表的分片规则
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id)
tbpartitions 1 dbpartitions 2;

MyCat插入数据

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);
 

mycat查看数据

在这里插入图片描述

物理库3506查看数据

在这里插入图片描述

物理库3507查看数据

在这里插入图片描述

发现每个物理库根据分片字段存储数据库是不一样的,

ER表

与分片表关联的表如何分表,也就是 ER 表如何分表,

创建ER表

CREATE TABLE orders_detail(
`id` BIGINT NOT NULL AUTO_INCREMENT,
detail VARCHAR(2000),
order_id INT,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(order_id) tbpartition BY mod_hash(order_id)
tbpartitions 1 dbpartitions 2;

mycat显示
在这里插入图片描述
物理库3506显示
在这里插入图片描述
物理库3507显示
在这里插入图片描述

mycat插入数据

INSERT INTO orders_detail(id,detail,order_id) VALUES(1,'detail1',1);
INSERT INTO orders_detail(id,detail,order_id) VALUES(2,'detail1',2);
INSERT INTO orders_detail(id,detail,order_id) VALUES(3,'detail1',3);
INSERT INTO orders_detail(id,detail,order_id) VALUES(4,'detail1',4);
INSERT INTO orders_detail(id,detail,order_id) VALUES(5,'detail1',5);
INSERT INTO orders_detail(id,detail,order_id) VALUES(6,'detail1',6);

mycat查询数据

在这里插入图片描述

物理节点3506数据分布

在这里插入图片描述

物理节点3507数据分布

在这里插入图片描述

join关联查询

SELECT * FROM orders o INNER JOIN orders_detail od ON od.order_id=o.id;

在这里插入图片描述
看一下具体物理划分到底是不是数据都划分到一块了呢?
物理节点3506数据分布
在这里插入图片描述
物理节点3507数据分布
在这里插入图片描述
发现两个数据有的不是在同一个数据库 怎么查询出来的呢?
在这里插入图片描述
原理:
mycat作为一个中间件,根据查询的SQL语句进行分片分析,找到对应的实际物理数据库节点,然后把数据合并之后再返回。
查看配置的表是否具有 ER 关系(父表和子表的关系),使用

/*+ mycat:showErGroup{}*/

在这里插入图片描述

一个是db1下的orders,一个是db1下的orders_detail都属于一个groupId
#group_id 表示相同的组,该组中的表具有相同的存储分布,运行关联语句的时候,就会把相同组的表自动进行关联

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

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

相关文章

蓝桥杯练习系统(算法训练)ALGO-946 Q神的足球赛

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 足球赛上,只见Q神如闪电般的速度带球时而左,时而右,时而前,时而后&#xff…

HDFS HA 修改nameservice

本例中修改将原来的hdfs-ha 修改为 hdfs-ns 停止HDFS, 防止新的业务操作 等待停止结束 KDE中需要调整的配置项如下图所示 a.搜索栏找到fs.defaultFS,将hdfs://hdfs-ha改为hdfs://hdfs-ns b.搜索栏找到dfs.nameservices,将hdfs-ha改为hdfs-ns c.搜索栏找…

HBuilder报错--openssl-legacy-provider is not allowed in NODE_OPTIONS解决方法

目录 一、问题描述二、解决方法 一、问题描述 HBuilder编译时报错:–openssl-legacy-provider is not allowed in NODE_OPTIONS 二、解决方法 将 windows 环境变量 NODE_OPTIONS 的值设置为空,由: 改为:

并发-判断线程对象是否处于活动状态 - isAlive

t.isAlive() 测试线程t是否处于活动状态,只要线程启动并且没有终止,方法返回值就是truestart()之前,线程不处于活动状态,之后就处于活动状态示例:运行结果:但是事情并没有这么简单,先来看一下以…

【每日刷题】Day37

【每日刷题】Day37 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 2391. 收集垃圾的最少总时间 - 力扣(LeetCode) 2. 1614. 括号的最大嵌套深度…

软件库V1.5版本iApp源码V3

软件库V1.5版本iApp源码V3 配置教程在【mian.iyu】的【载入事件】 更新内容: 1、分类对接蓝奏(免费,付费,会员,广告),支持蓝奏文件描述设置为简介(改动:首页.iyu&#…

【算法】二叉树中的dfs

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、计算布尔二叉树的值二、求根节点到叶节点数字之和三、二叉树剪枝四、验证搜索二叉树五、二叉搜索树中…

该从哪些方面提升系统的吞吐量?

更多大厂面试内容可见 -> http://11come.cn 该从哪些方面提升系统的吞吐量? 我们平时自己做的项目一般没有用户量,都是练手项目,所以并不会在吞吐量上做出很多的优化,但是这样的话,又会导致项目和其他人相比并没有…

mysql设置远程访问权限,允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时,格式不一样 比如 当右键单击时,然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪,就pdf的格式比较靠谱一点

Java---类和对象第一节

目录 1.面向对象初步认识 1.1什么是面向对象 1.2面向对象和面向过程的区别 2.类的定义和使用 2.1简单认识类 2.2类的定义格式 2.3类的实例化 2.4类和对象的说明 3.this关键字 3.1访问本类成员变量 3.2调用构造方法初始化成员变量 3.3this引用的特性 4.对象的构造以…

国内有哪些知名的网络安全厂商?

首先就是360,这个我相信大家并不陌生了吧,你的电脑装过360么? 360在个人终端服务那是妥妥的扛把子,但是在企业服务里虽然有他们的身影却略显不足。 第二个就是深信服,网络安全的老牌大佬,业务覆盖了全球5…

什么是XXE漏洞,日常如何做好web安全,避免漏洞威胁

随着网络技术的不断发展,网站安全问题日益受到人们的关注。当前随着技术发展,网站存在一些常见的可能被攻击者利用的漏洞,而在众多网站安全漏洞中,XXE(XML External Entity)漏洞是一个不容忽视的问题。今天…

linux性能监控之slabtop

slabtop命令是以实时的方式显示内核slab缓冲区的细节信息&#xff0c;是linux自带的命令 [rootk8s-master ~]# slabtop --helpUsage:slabtop [options]Options:-d, --delay <secs> delay updates-o, --once only display once, then exit-s, --sort <char&…

【WEEK11】 【DAY6】员工管理系统第七部分【中文版】

2024.5.11 Saturday 接上文【WEEK11】 【DAY5】员工管理系统第六部分【中文版】 目录 10.8.删除及404处理10.8.1.修改list.html10.8.2.修改EmployeeController.java10.8.3.重启10.8.4. 404页面处理10.8.4.1.把404.html文件移入10.8.4.2.重启并运行 10.8.5.退出登录状态10.8.5.1…

51基于单片机的温室大棚系统设计

设计摘要&#xff1a; 本设计旨在基于51单片机和蓝牙技术&#xff0c;实现一个功能完善的温室大棚系统。该系统具备以下主要功能&#xff1a;首先&#xff0c;通过连接的显示屏能够实时地显示当前的温度和湿度信息&#xff0c;方便用户了解温室内的环境变化。其次&#xff0c;…

Codeforces Round 605 (Div. 3) A~D

本人水平不高&#xff0c;开这个专栏主要是督促自己补题&#xff0c;有些题对目前的我来说还比较难&#xff0c;还补不动&#xff0c;等以后能力上来了再补。。。 原题链接&#xff1a;Dashboard - Codeforces Round 605 (Div. 3) - Codeforces 目录 A. Three Friends B. Sn…

✨✨使用vue3打造一个el-form表单及高德地图的关联组件实例✨

✨1. 实现功能 &#x1f31f;表单内显示省市县以及详细地址 点击省市县输入框时&#xff0c;打开对应地图弹窗&#xff0c;进行位置选择选择位置回显入对应输入框表单内的省市县以及地址输入框同外嵌表单走相同的校验方式触发校验后点击reset实现清除校验与清空数据 &#x1f…

Web开发小知识点(二)

1.关于取余 我在Dart语言里&#xff08;flutter项目&#xff09; int checkNum (10 - 29) % 10; 那么checkNum等于1 但是在Vue项目里 const checkNum (10 - 29) % 10;却等于-9 语言的特性不同&#xff0c;导致结果也不同&#xff0c;如果要想和Dart保持一致&#xff0c;…

Task Office for Mac v9.0激活版:任务管理新境界

还在为繁琐的任务管理而烦恼吗&#xff1f;Task Office for Mac为您带来全新的任务管理体验。简洁明了的界面设计&#xff0c;让您轻松上手&#xff1b;强大的任务管理和项目管理功能&#xff0c;让您轻松掌握任务进度&#xff1b;多用户协作功能&#xff0c;让团队协作更加高效…