TiDB丨教你一招,实现MySQL与TiDB灵活切换

news2025/2/24 21:55:28

文章目录

  • 一、前言
  • 二、MySQL与TiDB切换方案
    • 1. 部署DM集群
    • 2. 添加数据源
    • 3. 创建同步任务
  • 三、 切换到 TiDB
    • 1、停止DM数据同步
    • 2、开启 Binlog 增量同步
  • 四、 故障切换回 MySQL
  • 五、总结


一、前言

在日常工作中,原应用系统是跑在单机MySQL上,但随着业务量的慢慢递增,单机MySQL渐渐支撑不住,满足不了业务需求,因此我们需要考虑迁移到TiDB上,这时候就有一些问题出现了。

首先,在切换数据库的时候,业务侧不希望停机很久;其次,希望能在TiDB发生无法及时处理的故障的时候,迅速切换回MySQL。

基于这两点要求,想到了一个好法子,能够安全快速的从TiDB切换到MySQL,同时能够切换回原MySQL。

本期我们就一起来看看如何灵活快速的切换MySQL与TiDB。


二、MySQL与TiDB切换方案

基于我们想要实现的MySQL与TiDB安全灵活切换,我们的方案主要分为2个部分:

  • 切换到TiDB之后,开启数据反向同步,从TiDB侧同步增量数据到 MySQL,保证原MySQL数据与TiDB一致;

  • MySQL同步数据到TiDB,全量+增量数据的同步,数据追平后,应用切换到TiDB;

这一部分,选择的工具主要是DM(TiDB Data Migration),其支持从MySQL协议兼容多的数据库(MySQL、MariaDB、Aurora MySQL)到TiDB的全量数据迁移与增量数据同步。

使用DM,一定程度上能简化数据迁移过程,降低运维数据迁移的成本

1. 部署DM集群

部署的详细就不提了,过于基础,详可参考官方文档。

# 执行部署命令
tiup dm deploy dm-test v5.3.1 ./topoloy.yaml --user tidb -p

# 查看 DM 集群状况
tiup dm display dm-test

2. 添加数据源

数据源配置文件 mysql-source.yaml

source-id: "mysql-test" 

from:
  host: "xxx.xxx.xxx.234"
  port: 3306
  user: "root"
  # password 使用 tiup dmctl encrypt '<password>'生成
  password: "WTy21lJlYSzEaaspVxxyCyilxxxbF6xxgxx"
# 创建数据源
tiup dmctl –master-addr xxx.xxx.xxx.238:8261 operate-source create ./mysql-source.yaml

# 查看创建的数据源
tiup dmctl –master-addr xxx.xxx.xxx.238:8261 operate-source show

3. 创建同步任务

# 前置检查

  • 上游 MySQL 需要开启 Binlog,并设置Server ID;
  • 上游 MySQL 需要迁移的表都拥有主键或者唯一索引;
  • 上游 MySQL 需要迁移的表 Collation 在 TiDB 中是否兼容;
  • … 可参考 check-task;

# 编写数据同步任务配置文件 work-task.yaml

name: test                      
task-mode: all
case-sensitive: true      # schema/table 是否大小写敏感online-ddl: true          # 支持上游 "gh-ost""pt" 的自动处理
clean-dump-file: true     # 是否清理 dump 阶段产生的文件,包括 metadata 文件、建库建表 SQL 文件以及数据导入 SQL 文件

target-database:                # 下游数据库实例配置
  host: "xxx.xxx.xxx.236"
  port: 4000
  user: "root"
  password: ""  

block-allow-list:                    
  bw-rule-1:                             
do-dbs: ["ba","busapi","cboard","express","im","pm","seed","ui","wms"] 
    ignore-tables: 
    - db-name: "im"
      tbl-name: "Edo"
    - db-name: "ui"
      tbl-name: "t1"
    - db-name: "ui"
      tbl-name: "t2"
    - db-name: "pm"
      tbl-name: "Sheet4"
    - db-name: "pm"
      tbl-name: "bus_api_log"
    - db-name: "busapi"
      tbl-name: "itl_user"
    - db-name: "busapi"
      tbl-name: "mew_ebs"
    - db-name: "busapi"
      tbl-name: "mew_pts_interface"

mysql-instances:
  - source-id: "mysql-test"         
    block-allow-list: "bw-rule-1"

# 检查任务是否能正常运行

tiup dmctl –master-addr xxx.xxx.xxx.238:8261 check-task ./dm-work-task.yaml

tiup check 检查项包含:

  • 检查上游 MySQL 实例用户的 dump 相关权限;
  • 检查上游 MySQL 实例用户的 replication 相关权限;
  • 检查上游数据库版本;
  • 检查上游数据库是否设置 server_id;
  • 检查上游数据库是否已启用 binlog;
  • 检查上游数据库 binlog 格式是否为 ROW;
  • 检查上游数据库 binlog_row_image 是否为 FULL;
  • 检查上游 MySQL 表结构的兼容性;
  • 检查上游 MySQL 多实例分库分表的表结构一致性;
  • 检查上游 MySQL 多实例分库分表的自增主键冲突;

# 启动数据同步任务

tiup dmctl –master-addr xxx.xxx.xxx.238:8261 start-task ./dm-work-task.yaml

# 查看数据同步任务

# 这里的 task-name 是前面任务配置中,name后面所填写的内容,也就是 test
tiup dmctl –master-addr xxx.xxx.xxx.238:8261 query-status <task-name>

然后这里简单说一下遇到的坑吧,以及笔者解决的方法。

前面提到过,dmctl中的check-task会主动检查那些项目,但即使所有的check-task全都通过了,DM同步任务也不一定能够正常进行。

比如,如果碰到表中字段的collate这一项与TiDB不兼容的情况,就会卡住。

在这里插入图片描述
这次我们遇到的就是这种情况,dmctl check-task检查已经全部通过了。

但是在执行迁移任务候,仍然遇到报错,检查发现,是上游MySQL数据库部分表的部分字段的COLLATE属性在TiDB中不支持,DM执行同步任务时,创表阶段就会报错。

一般而言,遇到这种情况,应该去修改源表对应字段的COLLATE ,改成 TiDB 兼容的格式,比如统一改成utf8mb4_bin 。

但是由于种种限制,不适合在生产环境直接对表进行DDL,于是只能尝试另一种方法。

这就涉及到 DM 迁移数据的流程逻辑了。

简单说明一下,DM在做full模式的数据迁移时,会先全量逻辑导出数据,导出的目录位于执行该任务的DM-worker机器上

默认情况下,导出的数据目录位于DM-worker的部署目录下的dumped_data.\ 中。

task-name就是前文中数据同步配置文件中的name项配置,而在这个数据目录中,就保存着导入到TiDB需要执行的SQL文件,包括建表语句。

执行完这个目录下的所有 SQL 文件之后,意味着全量数据迁移完成,后续开始同步增量数据

在这里插入图片描述
遇到前面的错误,这时就可以进入到该目录,找到对应表的建表 SQL 文件。

默认情况下,该表的文件命名格式 .-schema.sql ,直接去修改该SQL文件中的内容,接着继续运行DM任务即可。


三、 切换到 TiDB

当DM工具将上游的MySQL数据全部同步到下游,数据追平,并且稳定同步一段时间之后。

此时就可以考虑将读写流量打到TiDB上,同时开启TiDB到原MySQL数据库的反向数据增量同步,保证TiDB与MySQL数据完全一致,就可以让应用随时从TiDB切换回MySQL。

此时需要注意的是,数据库在切换时,需要将应用服务停掉,切换完成之后,重启应用服务,在事先准备好配置文件时,整个过程不超过1分钟。

1、停止DM数据同步

tiup dmctl –master-addr xxx.xxx.xxx.238:8261 stop-task test

# 确认任务停止,查询不到代表任务已经停止
tiup dmctl –master-addr xxx.xxx.xxx.238:8261 query-status test

2、开启 Binlog 增量同步

原 TiDB 集群扩容一个Drainer,开启数据反向同步。

# TiDB 到 MySQL 反向数据同步

这一部分,选择的工具则是TiDB Binlog,这是一个十分简单的工具,提供准实时备份与数据同步。

1)编写 Drainer 部署配置

drainer_servers:
  - host: xxx.xxx.xxx.123
    commit_ts: -1
    config:
      syncer.db-type: "mysql"
      # 需要同步的数据库
      syncer.replicate-do-db: 
        - ba
        - busapi
        - cboard
        - dispatch
        - express
        - im
        - pm
        - seed
        - ui
        - wms
      syncer.to.host: "xxx.xxx.xxx.234"
      syncer.to.user: "root"
      syncer.to.password: "<password>"
      syncer.to.port: 3306
      syncer.to.checkpoint:
        schema: "tidb_binlog"
        type: "mysql"
        host: "xxx.xxx.xxx.234"
        user: "root"
        password: "<password>"
        port: 3306

2)使用 tiup 扩容 drainer

tiup cluster scale-out tidb-test ./scale-out-drainer.yaml --user tidb -p

扩容完成后,数据反向同步就已开始,可以简单测试一下,然后就可以启动前端服务,将读写流量全部交给TiDB数据库接管。


四、 故障切换回 MySQL

当应用切换回TiDB之后,发生故障,需要切换回原MySQL来保障服务的正常运行时这时候,需要将应用服务停止

接着停止TiDB到MySQL的反向同步,关闭并移除Drainer,即可切换回原MySQL,并且整个过程数据不会丢失。


五、总结

简单列一下,涉及到的操作步骤:

在这里插入图片描述
以上就是在遇到MySQL与TiDB两个数据库需要切换时的解决思路了,大家不妨尝试操作一下,就能明白其中原理了。

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

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

相关文章

读研转码,纠结技术方向

作者&#xff1a;阿秀校招八股文学习网站&#xff1a;https://interviewguide.cn这是阿秀的第「227」篇原创你好&#xff0c;我是阿秀。很多本科非科班的小伙伴都会选择通过读个研来达到转码的目的&#xff0c;主要是想给自己一个2-3年的缓冲时间。其中有的研究生专业是计算机的…

一文带你了解MindSpore的知识及安装入手

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;Jovy. &#x1f35f;博客主页…

自动控制原理笔记-控制系统的数学模型

目录 建模方法 控制系统的数学模型——微分方程&#xff1a; 将方框图变为具体公式&#xff1a; 非线性系统微分方程的线性化&#xff1a; 线性定常微分方程的求解&#xff1a; 拉普拉斯变换的有关概念&#xff1a; 复数的有关概念&#xff1a; 拉氏变换的定义&#xf…

DolphinDB 分布式表数据更新原理和性能介绍

1. 概述 DolphinDB 从 1.30.6 版本开始支持更新分布式表数据。更新操作支持事务&#xff0c;具备事务 ACID 的特性&#xff0c;且通过 MVCC 实现快照隔离级别。DolphinDB 为多模数据库&#xff0c;目前支持两种存储引擎&#xff1a; OLAP 和 TSDB &#xff08;详见 DolphinDB …

xcode使用gdal库

GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。 GDAL提供对多种栅格数据的支持&#xff0c;包括Arc/Info ASCII Grid(asc)&#…

4 个分析 GameFi 项目的工具

Nov. 2022, Vincy 区块链游戏通常有几种 token、几十种类别的 NFT&#xff0c;以及复杂的奖励机制来吸引和留住玩家。同时添加机器人和清洗交易&#xff0c;使得准确评估特定项目的有机利益和潜力变得具有挑战性。 这就是为什么在投入时间和金钱之前分析 GameFi 项目的基础数…

Linux中的Rsync备份服务

目录 一、备份基本概述 1.备份的定义 2.备份的原因 3.备份分类 &#xff08;1&#xff09;完全备份 &#xff08;2&#xff09;增量备份 4.实现备份工具 二、Rsync——远程同步 1.Rsync基本介绍 2.Rsync同步模式 &#xff08;1&#xff09;推 &#xff08;2&#xf…

【Linux】项目自动化构建工具make / Makefile 及进度条小程序

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;make项目管…

关于对死锁的理解

文章目录什么是死锁&#xff1f;举例理解死锁如何解决死锁锁池与等待池的理解什么是锁池与等待池锁池与等待池的区别两个线程交替执行什么是死锁&#xff1f; 所谓死锁&#xff0c;是指互斥锁标记使用不当造成多个线程&#xff0c;相互持有对方想要申请的资源&#xff0c;不释…

HummerRisk V0.7.0:支持京东云、webhook、PDF下载等

HummerRisk V0.7.0发布&#xff1a;新增京东云支持&#xff0c;系统增加webhook支持&#xff0c;灵活扩展&#xff0c;新增多种页面的PDF下载&#xff0c;新增主机的批量导入和Windows类型主机的检测支持。 感谢社区中小伙伴们的反馈&#xff0c;你们的认可是我们前进的动力。…

四旋翼无人机学习第16节--labview开发allegro的PAD与封装查询工具

文章目录1 前言2 使用展示(有labview软件)2.1 使用界面展示2.2 配置文件展示2.3 封装检索2.4 pad检索2.5 软件退出3 使用展示(无labview软件)4 源文件下载方式1 前言 在学习allegro过程中&#xff0c;设计封装需要先设计组成封装的PAD&#xff0c;也就是使用Padstack Editor工…

Linux学习-93-SELinux安全上下文操作

18.6 SELinux安全上下文查看方法 SELinux 管理过程中&#xff0c;进程是否可以正确地访问文件资源&#xff0c;取决于它们的安全上下文。进程和文件都有自己的安全上下文&#xff0c;SELinux 会为进程和文件添加安全信息标签&#xff0c;比如 SELinux 用户、角色、类型、类别等…

Android设计模式详解之原型模式

前言 原型模式是一个创建型设计模式。 定义&#xff1a;用原型实例指定创建对象的种类&#xff0c;并通过复制这些原型创建新的对象。 使用场景&#xff1a; 类初始化需要消耗非常多的资源&#xff0c;这个资源包括数据、硬件资源&#xff0c;通过原型复制避免这些消耗&…

音质更出色的骨传导耳机,设计也很时尚,南卡Runner CC3上手

这两年我几乎每天都会用耳机&#xff0c;现在耳机的种类也不少&#xff0c;如果是户外健身的话&#xff0c;我觉得骨传导耳机比挂脖式的耳机更好用&#xff0c;这种耳机因为不入耳的使用方式&#xff0c;在我们听音乐的同时&#xff0c;还可以更清晰地感知周围的情况&#xff0…

【Django项目开发】自动生成接口文档(二)

文章目录一、安装第三方库drf-yasg2二、注册到子应用INSTALLED_APPS三、配置路由1、注意四、接口文档中展示详细的文档说明视图类中接口的标准注释五、视图类中自己定义的方法实现接口文档注释1、注意一、安装第三方库drf-yasg2 pip install drf-yasg2二、注册到子应用INSTALL…

新技术不断发展,一个全新的互联网行业的新风口已然来临

拥抱实体经济&#xff0c;绝对是当下互联网玩家们的首要选择。无论是头部的互联网企业来讲&#xff0c;还是新生的互联网玩家而言&#xff0c;它们都不约而同地将关注的焦点聚焦在了这样一个方向上。   透过这一点&#xff0c;我们可以非常明显地感受到&#xff0c;一个全新的…

网络技术展开型介绍(超详细)二

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

MyBatis—MyBatis参数详解

文章目录MyBatis参数详解1、 parameterType2、resultType3、 resultMap结果类型MyBatis获取参数值的两种方式1.配置sql输出日志2.看#{}和${}的输出现象3.#{}的预编译4.sql注入5.什么时候使用${}6.如何选择使用 #{} 和 ${}7.为什么#{}可以预防sql注入—————————————…

Shuffle的作用以及MapReduce的Shuffle过程

Shuffle的设计 为什么需要Shuffle&#xff1f; Shuffle的本质是基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】 等问题 因为单台机器的资源处理不了分布式大数据量全局分区/排序/分组 所以需要通过Shuffle对每一台机器的数据构建一个Task来做分区的…

通关剑指 Offer——剑指 Offer II 055. 二叉搜索树迭代器

1.题目描述 剑指 Offer II 055. 二叉搜索树迭代器 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会…