分库分表之Mycat应用学习五

5 Mycat 离线扩缩容

当我们规划了数据分片,而数据已经超过了单个节点的存储上线,或者需要下线节
点的时候,就需要对数据重新分片。

5.1 Mycat 自带的工具

5.1.1 准备工作

1、mycat 所在环境安装 mysql 客户端程序。
2、mycat 的 lib 目录下添加 mysql 的 jdbc 驱动包。
3、对扩容缩容的表所有节点数据进行备份,以便迁移失败后的数据恢复。

5.1.2 步骤

以取模分片表 sharding-by-mod 缩容为例
在这里插入图片描述
1、复制 schema.xml、rule.xml 并重命名为 newSchema.xml、newRule.xml 放
于 conf 目录下。
2、修改 newSchema.xml 和 newRule.xml 配置文件为扩容缩容后的 mycat
配置参数(表的节点数、数据源、路由规则)。
注意:
只有节点变化的表才会进行迁移。仅分片配置变化不会迁移。
newSchema.xml

<table name="sharding_by_mod" dataNode="dn1,dn2,dn3" rule="qs-sharding-by-mod" />

改成(减少了一个节点):

<table name="sharding_by_mod" dataNode="dn1,dn2" rule="qs-sharding-by-mod" />

newRule.xml 修改 count 个

<function name="qs-sharding-by-mod-long" class="io.mycat.route.function.PartitionByMod">
	<property name="count">2</property>
</function>

3、修改 conf 目录下的 migrateTables.properties 配置文件,告诉工具哪些表需要进行扩容或缩容,没有出现在此配置文件的 schema 表不会进行数据迁移,格式:
注意,1)不迁移的表,不要修改 dn 个数,否则会报错。
2)ER 表,因为只有主表有分片规则,子表不会迁移。

catmall=sharding-by-mod

4、dataMigrate.sh 中这个必须要配置
通 过 命 令 “find / -name mysqldump” 查 找 mysqldump 路 径 为"/usr/bin/mysqldump",指定#mysql bin 路径为"/usr/bin

#mysql bin 路径
RUN_CMD="$RUN_CMD -mysqlBin= /usr/bin/

5、停止 mycat 服务
6、执行执行 bin/ dataMigrate.sh 脚本
注意:必须要配置 Java 环境变量,不能用 openjdk
7 、 脚 本 执 行 完 成 , 如 果 最 后 的 数 据 迁 移 验 证 通 过 , 就 可 以 将 之 前 的
newSchema.xml 和 newRule.xml 替换之前的 schema.xml 和 rule.xml 文件,并重启 mycat 即可
注意事项:
1)保证分片表迁移数据前后路由规则一致(取模——取模)。
2)保证分片表迁移数据前后分片字段一致。
3)全局表将被忽略。
4)不要将非分片表配置到 migrateTables.properties 文件中。
5)暂时只支持分片表使用 MySQL 作为数据源的扩容缩容。
migrate 限制比较多,还可以使用 mysqldump。

5.2 mysqldump 方式

系统第一次上线,把单张表迁移到 Mycat,也可以用 mysqldump。
MySQL 导出

mysqldump -uroot -p123456 -h127.0.0.1 -P3306 -c -t --skip-extended-insert gpcat > mysql-1017.sql

-c 代表带列名
-t 代表只要数据,不要建表语句
–skip-extended-insert 代表生成多行 insert(mycat childtable 不支持多行插入ChildTable multi insert not provide)

Mycat 导入

mysql -uroot -p123456 -h127.0.0.1 -P8066 catmall 

Mycat 导出

mysqldump -h192.168.8.151 -uroot -p123456 -P8066 -c -t --skip-extended-insert catmall customer > mycat-cust.sql

其他导入方式:
load data local infile ‘/mycat/customer.txt’ into table customer;
source sql ‘/mycat/customer.sql’;

6 核心流程总结

官网的架构图
在这里插入图片描述

6.1 启动

1、MycatServer 启动,解析配置文件,包括服务器、分片规则等
2、创建工作线程,建立前端连接和后端连接

6.2 执行 SQL

1、前端连接接收 MySQL 命令
2、解析 MySQL,Mycat 用的是 Druid 的 DruidParser
3、获取路由
4、改写 MySQL,例如两个条件在两个节点上,则变成两条单独的 SQL
例如 select * from customer where id in(5000001, 10000001);
改写成:
select * from customer where id = 5000001;(dn2 执行)
select * from customer where id = 10000001;(dn3 执行)
又比如多表关联查询,先到各个分片上去获取结果,然后在内存中计算
5、与后端数据库建立连接
6、发送 SQL 语句到 MySQL 执行
7、获取返回结果
8、处理返回结果,例如排序、计算等等
9、返回给客户端

6.3 源码下载与调试环境搭建

6.3.1 下载源代码,导入工程
git clone https://github.com/MyCATApache/Mycat-Server
6.3.2 配置

schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
		<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
		<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
		<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
	</schema>
	<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />
		<dataHost name="localhost1" maxCon="20" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>
6.3.3 表结构

本地数据库创建 db1、db2、db3 数据库,全部执行建表脚本

CREATE TABLE `company` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(64) DEFAULT '', `market_value` bigint(20) DEFAULT '0', PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `hotnews` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(64) DEFAULT '', `content` varchar(512) DEFAULT '0', `time` varchar(8) DEFAULT '', `cat_name` varchar(10) DEFAULT '', PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `travelrecord` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, `city` varchar(32) DEFAULT '', `time` varchar(8) DEFAULT '', PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
6.3.4 逻辑表配置

travelrecord 表配置

<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<tableRule name="auto-sharding-long">
	<rule>
	<columns>id</columns>
	<algorithm>rang-long</algorithm>
	</rule>
</tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
	<property name="mapFile">autopartition-long.txt</property>
</function>

hotnews 表配置

<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
<tableRule name="mod-long">
	<rule>
	<columns>id</columns>
	<algorithm>mod-long</algorithm>
	</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
	<!-- how many data nodes -->
	<property name="count">3</property>
</function>

company 表配置

<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
6.3.5 debug 方式启动

debug 方式启动 main 方法
Mycat-Server-1.6.5-RELEASE\src\main\java\io\mycat\MycatStartup.java

6.3.6 连接本机 Mycat 服务

测试语句

insert into travelrecord(`id`, `city`, `time`) values(1, '长沙', '20191020');
insert into hotnews(`title`, `content`) values('咕泡', '盆鱼宴');
insert into company(`name`, `market_value`) values('spring', 100);

6.3.7 调试入口

连接入口:
io.mycat.net.NIOAcceptor#accept
SQL 入口:
io.mycat.server.ServerQueryHandler#query
Step Over 可以看到上一层的调用

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

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

相关文章

mac上使用Navicat Premium 在本地和生产环境中保持数据库同步

Navicat Premium 是一款功能强大的数据库管理和开发工具&#xff0c;支持多种数据库系统&#xff0c;如 MySQL、Oracle、SQL Server 等。作为程序员&#xff0c;我深知在开发过程中需要一款方便、高效的数据库管理工具来提升工作效率。而 Navicat Premium 正是这样一款不可多得…

Spring5注解驱动(六)

5. 自动装配 5.1. Autowired&Qualifier&Primary 在原来&#xff0c;我们就是使用Autowired的这个注解来进行自动装配&#xff1b; 现在有一个BookController 类 package com.hutu.controller;import com.hutu.service.BookService; import org.springframework.bea…

2023最新租号平台系统源码支持单独租用或合租使用

这是一款租号平台源码&#xff0c;采用常见的租号模式。目前网络上还很少见到此类类型的源码。 平台的主要功能如下&#xff1a; 支持单独租用或采用合租模式&#xff1b; 采用易支付通用接口进行支付&#xff1b; 添加邀请返利功能&#xff0c;以便站长更好地推广&#xf…

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蚁狮算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蚁狮优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

逻辑卷学习后续----------缩容

一、缩容&#xff1a;缩减大小 ext4可以 &#xff0c; xfs无法缩减&#xff0c;缩减会影响业务 1.解挂载 2.检查文件系统完整性 3.缩减文件系统 4.缩减逻辑卷上下一致 5.再挂载回去 添加磁盘 文件系统只能装ext4 缩减文件系统 resize2fs 挂载失败需要重新安装文件系统…

磁盘阵列(RAID)

1.独立硬盘冗余阵列&#xff08;RAID, Redundant Array of Independent Disks&#xff09; 旧称廉价磁盘冗余阵列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;简称磁盘阵列 用虚拟化存储技术把多个硬盘组合起来&#xff0c;成为一个或多个硬盘阵…

[C#]使用ONNXRuntime部署一种用于边缘检测的轻量级密集卷积神经网络LDC

源码地址&#xff1a; github.com/xavysp/LDC LDC: Lightweight Dense CNN for Edge Detection算法介绍&#xff1a; 由于深度学习方法的快速发展&#xff0c;近年来&#xff0c;用于执行图像边缘检测的卷积神经网络&#xff08;CNN&#xff09;模型爆炸性地传播。但边缘检测…

Selenium教程04:鼠标+键盘网页的模拟操作

在webdriver 中&#xff0c;鼠标操作都封装在ActionChains类中&#xff0c;使用的时候需要导入这个包。 from selenium.webdriver import ActionChainsActionChains方法列表如下&#xff1a; click(on_elementNone) ——单击鼠标左键click_and_hold(on_elementNone) ——点击…

开始使用MEVN技术栈开发02 MongoDB介绍

开始使用MEVN技术栈开发02 MongoDB介绍 MongoDB介绍 As indicated by the ‘ M ’ in MEVN, we will use MongoDB as the backend database for our app. MongoDB is a NoSQL database. Before we talk about what is a NoSQL database, let ’ s first talk about relationa…

[每周一更]-(第48期):一名成熟Go开发需储备的知识点(问题篇)- 1

问题篇 1、Go语言基础知识 什么是Go语言&#xff1f;它有哪些特点&#xff1f;Go语言的数据类型有哪些&#xff1f;Goroutine是什么&#xff1f;它与线程的区别是什么&#xff1f;介绍一下Go语言的垃圾回收机制。 2、并发和并行 什么是并发和并行&#xff1f;它们之间的区别…

Java超高精度无线定位技术--UWB (超宽带)人员定位系统源码

UWB室内定位技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波&#xff0c;而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据&#xff0c;从而具有GHz量级的带宽。 UWB&#xff08;超宽带&#xff09;高精度定位系统是一…

Java方法(定义和调用,带参数方法定义和调用,带返回值方法的定义和调用,方法的注意事项,方法重载)

文章目录 1. 方法概述1.1 方法的概念 2. 方法的定义和调用2.1 无参数方法定义和调用2.3 无参数方法的练习 3. 带参数方法定义和调用3.1 带参数方法定义和调用3.2 形参和实参3.3 带参数方法练习 4. 带返回值方法的定义和调用4.1 带返回值方法定义和调用4.2 带返回值方法练习14.3…

React学习计划-React16--React基础(八)react-redux使用与优化,纯函数介绍

笔记gitee地址 学习了 redux,为什么还要讲react-redux呢&#xff1f; redux不是专门为react所创建的,只不过在某一刻&#xff0c;react和redux看对眼了&#xff0c;所以俩人走到了一起&#xff0c;所以为了更好的支持redux,react官方出了react-redux来更好的支持redux 1. react…

UntiyShader(七)Debug

目录 前言 一、利用假彩色图像 二、利用Visual Studio 三、帧调试器 前言 Debug&#xff08;调试&#xff09;&#xff0c;是程序员检查问题的一种方法&#xff0c;对于一个Shader调试更是一种噩梦&#xff0c;这也是Shader难写的原因之一——如果效果不对&#xff0c;我们…

JDBC->SpringJDBC->Mybatis封装JDBC

一、JDBC介绍 Java数据库连接&#xff0c;&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们…

Leetcode每日一题周汇总 (12.24-12.30)

Leetcode每日一题周汇总 (12.24-12.30) 1.Sunday (12.24) 题目链接&#xff1a;1954. 收集足够苹果的最小花园周长 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个用无限二维网格表示的花园&#xff0c;每一个 整数坐标处都有一棵苹果树。整数坐标…

今晚咱们一起来场特别的技术跨年!!

▼最近直播超级多&#xff0c;预约保你有收获 今晚跨年直播&#xff1a;《LLM在电商推荐系统的应用案例实战》 —1— 今晚咱们来场技术跨年&#xff01; LLM 大模型无疑是2023年最重磅的技术&#xff0c;逐渐在各行各业产生了越来越重要的实质影响&#xff0c;2024年的钟声今晚…

vue3-12

需求是用户如果登录了&#xff0c;可以访问主页&#xff0c;如果没有登录&#xff0c;则不能访问主页&#xff0c;随后跳转到登录界面&#xff0c;让用户登录 实现思路&#xff0c;在用户登录之前做一个检查&#xff0c;如果登录了&#xff0c;则token是存在的&#xff0c;则放…

Android Studio如何查找和替换

目录 前言 一、概述 二、总结 三、更多资源 前言 在Android Studio中&#xff0c;查找和替换是非常常见的操作&#xff0c;它可以帮助我们快速地定位和修改代码中的错误或不合适的内容。本文将介绍如何在Android Studio中进行查找和替换操作&#xff0c;包括基本的查找和替…