ShardingSphere-Proyx数据迁移实战

news2024/11/25 5:30:45

前提说明

优先明确一点:数据迁移必须使用DistSQL操作。

ShardingSphere提供的数据迁移方案为:使用全新的数据库集群作为迁移目标。因此,需要冗余的服务器资源支持,并且在数据迁移过程中,所有的数据都会发生移动。

实战内容:将192.168.49.110:3306/user中的t_user表,迁移到192.168.49.119:3306/user中并且进行数据分片。将源端t_user表的数据以user_id为分片键,分布在10张表中。

数据迁移阶段划分

  1. 准备阶段;

  2. 存量数据迁移阶段;

  3. 增量数据同步阶段,提供数据一致性校验;

  4. 流量切换阶段;

从存量迁移到增量迁移阶段,Proxy组件会自动帮助我们完成过渡。在增量数据迁移阶段,Proxy会不断读取源端写入的最新数据,保持目标端数据和源端数据的基本一致。而数据想要从基本一致过渡到完全一致,需要源端将服务暂时改为只读,之后proxy继续读取源端信息,进而使数据完全同步(有内置的校验规则)。之后,完成线上流量的切换。

1.迁移前准备

  1. 校验MySQL账号的权限

    1. 源端账号是否开启binlog、是否拥有replication权限和查询权限。

    2. 目标端账号是否拥有赋予增删改查、创建索引权限。【不能是ALL PRIVILEGE,要给具体的权限,不然会报错】

  2. 以集群模式启动proxy,并配置Proxy的分片规则

a. 账号权限检查

-- 检查源端是否开启binlog,以及源端账户是否具有replication和Select权限
show variables like 'log_bin'; -- 需要是ON
show variables like 'binlog_format'; -- 需要是ROW
show variables like 'binlog_row_image'; -- 需要是FULL
SHOW GRANTS FOR 'chatbot';
-- 缺少那个权限执行下面那一条命令
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON `chatbot`.* TO 'chatbot'@'%';
GRANT SELECT ON `chatbot`.* TO 'chatbot'@'%';

-- 检查目标端账户的权限,需要DML和索引权限
SHOW GRANTS FOR 'chatbot_shard'@'%';
GRANT CREATE, DROP, INDEX, SELECT, INSERT, UPDATE, DELETE ON 'chatbot_shard'.* TO 'chatbot_shard'@'%';

 b. Proxy 配置

启动Proxy

采用zk集群模式进行数据迁移和分库分表。

对应的Dockerfile、启动命令和global.yaml配置如下:

想要详细了解可以看以下文章:

1. 定制满足业务需求ShardingSphere-Proxy镜像

2. 解决Docker环境变量的配置的通用方法

# Dockerfile文件内容
FROM apache/shardingsphere-proxy:5.5.1
RUN mkdir -p /opt/shardingsphere-proxy/ext-lib/
RUN wget -P /opt/shardingsphere-proxy/ext-lib/ 
https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.11/mysql-connector-java-8.0.11.jar


#制作镜像
docker build -t sharding:1.0 .


# Docker启动命令
docker run -d \
  --name sharding1 \
  -p 3309:3307 \
  -e JAVA_MEM_COMMON_OPTS='-Xms256m -Xmx400m -Xss1m' \
  -v /root/sharding/conf/:/opt/shardingsphere-proxy/conf \
  sharding:1.0


# global.yaml文件内容
mode:
  type: Cluster
  repository:
    type: ZooKeeper
    props:
      namespace: governance_db
      server-lists: zk0:2181,zk1:2181,zk2:2181
      retryIntervalMilliseconds: 500
      timeToLiveSeconds: 60
      maxRetries: 3
      operationTimeoutMilliseconds: 500
authority:
  users:
    - user: root@%
      password: root
  privilege:
    type: ALL_PERMITTED
props:
  sql-show: true
数据分片规则配置

连接proxy,进行分片规则的配置。这时候,我们只需要关注目标表的分片规则就可以了,不需要关注旧表的情况。

-- 在proxy中执行
create database sharding_user;
use chatbot_shard;
REGISTER STORAGE UNIT server_target (
    URL="jdbc:mysql://192.168.49.110:3306/user?useUnicode=true&characterEncoding=utf8",
    USER="root",
    PASSWORD="123456",
    PROPERTIES("minPoolSize"="1","maximumPoolSize"=20,"idleTimeout"="6000")
);
CREATE SHARDING TABLE t_user(
STORAGE_UNITS(server_target),
SHARDING_COLUMN=user_id,
TYPE(NAME="mod",PROPERTIES("sharding-count"="10"))
);

-- 比对,我们的配置是否和预期一致。
EXPORT DATABASE CONFIGURATION;

-- 执行对应的建表语句
CREATE TABLE `user`(
    id bigint primary key auto_increment,
    user_id bigint not null,
    name varchar(10),
);

-- 自此,我们的分片规则已经配置完成,并且sharding也帮助我们在节点中创建了对应的表。

2. 数据迁移

--1.按需更改迁移配置,主要是从旧表中读取线程的数量和向新表中写入线程的数量。
-- 不要因为数据迁移对线上业务造成过大的读取压力。
SHOW MIGRATION RULE;
ALTER MIGRATION RULE (
READ(
  WORKER_THREAD=5,
  BATCH_SIZE=500,
  SHARDING_SIZE=10000,
  RATE_LIMITER (TYPE(NAME='QPS',PROPERTIES('qps'='200')))
),
WRITE(
  WORKER_THREAD=5,
  BATCH_SIZE=500,
  RATE_LIMITER (TYPE(NAME='TPS',PROPERTIES('tps'='200')))
),
STREAM_CHANNEL (TYPE(NAME='MEMORY',PROPERTIES('block-queue-size'='200')))
);

--2.添加迁移的数据源【源端】
REGISTER MIGRATION SOURCE STORAGE UNIT origin (
    URL="jdbc:mysql://192.168.49.110:3306/user?useUnicode=true&characterEncoding=utf8",
    USER="wang",
    PASSWORD="123456",
    PROPERTIES("minPoolSize"="1","maxPoolSize"="20","idleTimeout"="60000")
);

--3.执行迁移命令,可以并发
MIGRATE TABLE origin.t_user INTO t_user;

--4.查看迁移进度
SHOW MIGRATION LIST;
SHOW MIGRATION STATUS 'j0102p00002333dcb3d9db141cef14bed6fbf1ab54';

-- SHOW MIGRATION LIST重要数据解读
-- 迁移作业的状态有三种:准备、存量迁移、增量迁移,只有在增量迁移阶段,才能够使用校验算法。
id             |tables              |job_item_count |active  |create_time         |stop_time|
------------------------------------------+----------------------+--------------+------+---------
当前迁移任务的id |源端.源表             |迁移job的分片数  |是否活跃 |迁移任务开始时间       |迁移任务停止时间
j01021212324   |origin.conversation |1              |true    |2024-11-19 03:20:21 |         

-- SHOW MIGRATION STATUS 重要数据解读
item|data_source|tables         |status                  |active |processed_records_count|inventory_finished_percentage|incremental_idle_seconds|error_message|
----+-----------+---------------+------------------------+------+-----------------------+-----------------------------+------------------------+-------------+
编号 |数据源      |源端.源表       |迁移作业状态              |是否活跃 |处理数据行数             |迁移作业完成度                 |增量闲置时间              | 错误信息提示  |
0   |origin     |origin.question|EXECUTE_INCREMENTAL_TASK|true    |37450                  |100                         |2                       |             |


--5.验证迁移前后数据的一致性
--先执行算法,再查看进度。MySQL支持的校验算法有CRC32_MATCH||DATA_MATCH
--CRC32_MATCH:循环冗余校验,通过校验码来判断是否存在数据不一致,效率快,但是不支持断点续传,且只支持MySQL
--DATA_MATCH:逐行挨个比对数据,效率稍慢但是支持断点续传和异构数据库,如果有加密数据,需要使用该算法。
CHECK MIGRATION j0102p000041c4912117c302e9facd92f9a74a478c BY TYPE (NAME='DATA_MATCH');
SHOW MIGRATION CHECK STATUS 'j0102p00000211a23d148fe8cc6c42ce4a445ad5b3';

--SHOW MIGRATION CHECK STATUS重要信息解读
tables         |result                               |check_failed_tables|active|inventory_finished_percentage|inventory_remaining_seconds|incremental_idle_seconds|check_begin_time       |check_end_time         |duration_seconds|algorithm_type|algorithm_props|error_message|
---------------+------+-------------------+------+-----------------------------+---------------------------+------------------------+-----------------------+-----------------------+----------------+--------------+---------------+-------------+
校验表          |校验结果,true通过,false失败,空白运行中 |校验失败的表         |false |进度                          |预估完成时间                 |                        |开始时间                |结束时间                 |1               |算法类型       |               |             |
origin.question|true                                 |                   |false |100                          |0                          |                        |2024-11-19 04:04:16.911|2024-11-19 04:04:18.520|1               |DATA_MATCH    |               |             |

--当准备流量切换的时候,采用 COUNT(*) 进行数据校验,防止校验时间过长,影响线上业务。
--使用 COUNT(*) 进行校验,可能造成一定的数据不一致,但是比较快,对线上影响下。
SELECT count(*) FROM user.t_user; --源端执行
SELECT count(*) FROM user.t_user; --proxy中执行

--5.提交迁移作业
COMMIT MIGRATION 'j0102p00000211a23d148fe8cc6c42ce4a445ad5b3';
SROLLBACK MIGRATION 'j0102p00000211a23d148fe8cc6c42ce4a445ad5b3';
数据迁移过程中的注意点
  • 如果我们迁移的目标表中已经存在数据,需要把数据清空,再进行数据迁移。

  • 迁移任务回滚不仅仅会把目标端迁移的数据删除,而且还会将proxy中的分片规则以及proxy创建在物理节点的真实表删除。 

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

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

相关文章

【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)

宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市住宿服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、各区…

RabbitMQ和RocketMQ相关面试题

RabbitMQ和RocketMQ面试题 RabbitMQ1.RabbitMQ各部分角色2.如何确保RabbitMQ消息的可靠性?3.什么样的消息会成为死信?4.死信交换机的使用场景是什么?5.TTL6.延迟队列7.消息堆积问题8.MQ集群 RocketMQ1.RocketMQ各部分角色2.RocketMQ如何保证高…

在kali用msfpc远程控制Windows

本次实验我们将使用msfpc生成windows下的被控端,并使用metasploit渗透工具进行远程控制。 一、实验环境 Windows主机IP: 192.168.167.1 虚拟机Kali IP: 192.168.167.100 二、实验过程 1、安装msfpc apt-get install msfpc 2、生成windows…

SDIO WIFI模组Clock EMC问题

问题: 某产品采用SDIO3.0的WIFI模组,测试3米场地辐射出现333MHz和500MHz频点超标。 分析: 1、一开始分析板子上没有对应333MHz,499.5MHz的频点倍频,因此直接拔掉产品上所有的外部接线,测试还是超标。表明辐射源头出…

MCU(一) 时钟详解 —— 以 GD32E103 时钟树结构为例

微控制器 (MCU) 的时钟系统是系统运行的核心,它提供了各模块所需的时钟信号。本文以 GD32E103 系列 MCU 为例,详细讲解其 时钟树结构(Clock Tree)。通过理解时钟源、分配与预分频器设置,可以灵活配置系统时钟以实现高性…

【方案库】从单张照片快速重建3D场景:Flash3D详解

一、Flash3D是什么? Flash3D 是一项革命性的AI技术,能够从单张普通照片快速重建3D场景。简单来说,你只需要提供一张照片,Flash3D 就能帮你还原出这个场景的立体效果。这项技术在房地产、建筑设计、虚拟现实等多个领域都有着广泛的应用前景。 二、主要特点 一张就够:只需…

QT QFormLayout控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizonta…

如何在 Ubuntu 22.04 上安装 Metabase 数据可视化分析工具

简介 Metabase 提供了一个简单易用的界面,让你能够轻松地对数据进行探索和分析。通过本文的指导,你将能够在 Ubuntu 22.04 系统上安装并配置 Metabase,并通过 Nginx 进行反向代理以提高安全性。本教程假设你已经拥有了一个非 root 用户&…

c#:winform调用bartender实现打印(学习整理笔记)

效果 学习路径 C# winform调用Bartender进行自定义打印、批量打印、检索文件夹中的模板_哔哩哔哩_bilibili 一、初始环境搭建见: c#:winform引入bartender-CSDN博客https://blog.csdn.net/weixin_46001736/article/details/143989473?sharetypeblogdetail&s…

1123--日期类

目录 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作

当产业经济插上“数字羽翼”,魔珐有言AIGC“3D视频创作大赛”成功举办

随着AI技术的飞速发展,3D数字人技术已成为驱动各行各业转型升级的重要力量。在这一背景下,2024山东3D数字人视频创作大赛应运而生,并在一番激烈的角逐后圆满落幕,为科技与创意的交融写下浓墨重彩的一笔。 11月20日,一…

InstantStyle容器构建指南

一、介绍 InstantStyle 是一个由小红书的 InstantX 团队开发并推出的图像风格迁移框架,它专注于解决图像生成中的风格化问题,旨在生成与参考图像风格一致的图像。以下是关于 InstantStyle 的详细介绍: 1.技术特点 风格与内容的有效分离 &a…

使用EFK收集k8s日志

首先我们使用EFK收集Kubernetes集群中的日志,本次实验讲解的是在Kubernetes集群中启动一个Elasticsearch集群,如果企业内已经有了Elasticsearch集群,可以直接将日志输出至已有的Elasticsearch集群。 文章目录 部署elasticsearch创建Kibana创建…

Rust 力扣 - 2266. 统计打字方案数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题可以先求按了多少次相同连续的按钮,所有的连续相同按钮表示的方案数的乘积就是本题答案 我们的关键问题就转换成了按n个连续相同按钮表示的方案数 设f(i)表示按i个连续相同按钮表示的方案数 如…

[Redis#0] iredis: linux上redis超好用的环境配置

目录 Features 特征 Install 安装 Pip Brew Linux的 Download Binary 下载 Binary Usage 用法 Using DSN 使用 DSN Change The Default Prompt更改默认提示 Configuration 配置 Keys Development 发展 Release Strategy 发布策略 Setup Environment 设置环境 De…

flutter 专题十七 Flutter Flar动画实战

Flutter Flar动画实战 在Flare动面出现之前,Flare动画大体可以分为使用AnimationController控制的基础动画以及使用Hero的转场动画,如果遇到一些复杂的场景,使用这些动画方案实现起来还是有难度的。不过,随着Flutter开始支持Flar…

Wekan看板安装部署与使用介绍

Wekan看板安装部署与使用介绍 1. Wekan简介 ​ Wekan 是一个开源的看板式项目管理工具,它的配置相对简单,因为大多数功能都是开箱即用的。它允许用户以卡片的形式组织和跟踪任务,非常适合敏捷开发和日常任务管理。Wekan 的核心功能包括看板…

使用ENSP实现静态路由

一、双路由器静态路由 1.项目拓扑 2.项目实现 (1)路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为192.168.1.1/24 ip ad…

3、集线器、交换机、路由器、ip的关系。

集线器、交换机、路由器三者的关系 1、集线器2、交换机(每个交换机是不同的广播域,ip地址起到划分广播域的作用)3、 路由器4、ip地址 1、集线器 一开始两台电脑通信就需要网线就可以,但是三台或者更多主机通信时,就需…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十二集:制作游戏的对话系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏的对话系统 1.通过转移点的门讲解制作对话系统2.以游戏的石碑为例制作确认能力界面总结 前言 hello大家好久没见,之所以隔了这么久…