数据库|TiDB 数据库大版本升级-基于TiCDC异机升级

news2024/11/25 12:25:51

作者:高文峰 | 神州数码云基地TiDB团队成员

目录

一、前言

二、升级架构图

三、升级流程

1.下游TiDB集群部署过程

2. 上游TiCDC节点的扩容

3. 上游数据全备恢复到下游

4. TiCDC启用正向同步任务

5. 应用停服务,tidb 无业务会话连接

6. 确认数据已完全同步,停止正向同步任务

7. 数据校验

8. 开启回退库的反向TiCDC同步

9. 创建业务用户,取消只读,F5切换到(v6.1.0)集群

10. 业务接入服务,验证服务正常

四、回退方案

1. 回退前提条件

2. 回退操作步骤

五、总结


一、前言

本操作手册描述了 xx 用户 TiDB 集群基于TiCDC进行大版本升级的操作过程、操作方法与注意事项,用于指导 xx 用户完成TiDB 集群基于TiCDC进行大版本异机升级以及回退方案。

二、升级架构图

TiCDC的系统架构如上图所示:

部署一套所需升级版本的下游TiDB集群,上游数据通过dumpling+lightning全备恢复到下游,再通过 TiCDC 实时同步增量数据到下游。

系统角色

• TiKV CDC 组件:只输出 key-value (KV) change log。

○ 内部逻辑拼装 KV change log。

○ 提供输出 KV change log 的接口,发送数据包括实时 change log 和增量扫的 change log。

• capture:TiCDC 运行进程,多个 capture 组成一个 TiCDC 集群,负责 KV change log 的同步。

○ 每个 capture 负责拉取一部分 KV change log。

○ 对拉取的一个或多个 KV change log 进行排序。

○ 向下游还原事务或按照 TiCDC Open Protocol 进行输出。

 

三、升级流程

本过程中,详细描述了将 TiDB 集群基于TiCDC进行大版本升级的过程,具体操作步骤如下:

1.下游TiDB集群部署过程

1) 下游v6.1.0版本TiDB集群配置文件

Bash
config2.yaml:
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/data/tidb-deploy"
  data_dir: "/data/tidb-data"
  arch: "amd64"

monitored:
  node_exporter_port: 9101
  blackbox_exporter_port: 9116

pd_servers:
  - host: 192.168.2.81
    client_port: 2479
    peer_port: 2480
  - host: 192.168.2.82
    client_port: 2479
    peer_port: 2480
  - host: 192.168.2.83
    client_port: 2479
    peer_port: 2480

tidb_servers:
  - host: 192.168.2.80
    port: 4001
    status_port: 10081

tikv_servers:
  - host: 192.168.2.81
    port: 20161
    status_port: 20181
  - host: 192.168.2.82
    port: 20161
    status_port: 20181
  - host: 192.168.2.83
    port: 20161
    status_port: 20181

2) TiDB集群的部署

tiup cluster deploy tidb-test v6.1.0 config2.yaml
tiup cluster start tidb-test2
tiup cluster display tidb-test2

3)配置tidb只读,防止业务修改写入(可选)

2. 上游TiCDC节点的扩容

1) 配置文件

Bash
scale-ticdc.yaml:
cdc_servers:
- host: 192.168.2.80
  ssh_port: 22
  port: 8300
  deploy_dir: "/tidb-deploy/cdc-8300"
  log_dir: "/tidb-deploy/cdc-8300/log"
 

2) TiCDC节点的扩容

tiup cluster scale-out tidb-test1 /tidb/scale-ticdc.yaml
tiup cluster display tidb-test1

3) 确认业务表都有唯一键或者主键

Bash
SELECT
t.table_schema AS database_name,
t.table_name
FROM
information_schema.TABLES t
LEFT JOIN information_schema.TABLE_CONSTRAINTS c ON t.TABLE_SCHEMA = c.TABLE_SCHEMA
AND t.table_name = c.TABLE_NAME
AND c.CONSTRAINT_TYPE = 'PRIMARY KEY'
WHERE
C.CONSTRAINT_TYPE IS NULL
AND T.TABLE_TYPE = 'BASE TABLE'
AND T.TABLE_SCHEMA NOT IN ( 'mysql', 'information_schema', 'performance_schema', 'sys' );

3. 上游数据全备恢复到下游

1) dumpling全备

mkdir -p /tidb/backup
tiup dumpling --user root --port 4000 --host 192.168.2.80 -proot --filetype sql --threads 8 -r 200000 --filesize 256MiB --output /tidb/backup --database "db1,db2,db3,db4,db5" >> /tidb/backup/dumpling.log
cat /tidb/backup/metadata

以上命令中:

-h、-P、-u 分别代表地址、端口、用户。

如果需要密码验证,可以使用 -p $YOUR_SECRET_PASSWORD 将密码传给 Dumpling。

-o用于选择存储导出文件的目录,支持本地文件路径或外部存储 URL 格式。

-t用于指定导出的线程数。增加线程数会增加 Dumpling 并发度提高导出速度,但也会加大数据库内存消耗,因此不宜设置过大。

-r用于指定单个文件的最大行数,指定该参数后 Dumpling 会开启表内并发加速导出,同时减少内存使用。

-F选项用于指定单个文件的最大大小,单位为 MiB,可接受类似 5GiB 或 8KB 的输入。如果你想使用 TiDB Lightning 将该文件加载到 TiDB 实例中,建议将 -F 选项的值保持在 256 MiB 或以下。

2) 用户和权限导出

3) lightning恢复

Bash
tidb-lightning.toml:

[lightning]
# 启动之前检查集群是否满足最低需求。
check-requirements = true
file = "tidb-lightning.log"

[checkpoint]
# 是否启用断点续传。
# 导入数据时,TiDB Lightning 会记录当前表导入的进度。
# 所以即使 TiDB Lightning 或其他组件异常退出,在重启时也可以避免重复再导入已完成的数据。
enable = true
# 存储断点的数据库名称。
#schema = "tidb_lightning_checkpoint"
# 存储断点的方式。
#  - file:存放在本地文件系统。
#  - mysql:存放在兼容 MySQL 的数据库服务器。
driver = "file"
# dsn 是数据源名称 (data source name),表示断点的存放位置。
# 若 driver = "file",则 dsn 为断点信息存放的文件路径。
dsn = "/tidb/backup/tidb_lightning_checkpoint.pb"

# 所有数据导入成功后是否保留断点。设置为 false 时为删除断点。
# 保留断点有利于进行调试,但会泄漏关于数据源的元数据。
keep-after-success = false

[tikv-importer]
# 选择后端:“importer” 或 “local” 或 “tidb”
# "local":通过在本地排序生成 SST 文件的方式导入数据,适用于快速导入大量数据,但导入期间下游 TiDB 无法对外提供服务,并且导入的目标表必须为空。
# "importer": 和 “local“ 原理类似,但需要额外部署 “tikv-importer“ 组件。如无特殊情况,推荐使用 “local” 后端。
# "tidb":通过执行 SQL 语句的方式导入数据,速度较慢,但导入期间下游 TiDB 可正常提供服务,导入的目标表可以不为空。
backend = "local"
# 当后端是 “local” 时,本地进行 KV 排序的路径。如果磁盘性能较低(如使用机械盘),建议设置成与 `data-source-dir` 不同的磁盘,这样可有效提升导入性能。
sorted-kv-dir = "/data/sort"


[mydumper]
# 设置文件读取的区块大小,确保该值比数据源的最长字符串长。
read-block-size = "64KiB" # 默认值
# 本地源数据目录或外部存储 URL
data-source-dir = "/tidb/backup"

[tidb]
# 目标集群的信息。tidb-server 的地址,填一个即可。
host = "192.168.2.80"
port = 4001
user = "root"
password = "root"
# 表结构信息从 TiDB 的“status-port”获取。
status-port = 10081
# pd-server 的地址,填一个即可。
pd-addr = "192.168.2.81:2479"
# tidb-lightning 引用了 TiDB 库,并生成产生一些日志。
# 设置 TiDB 库的日志等级。
log-level = "error"
 

vi /tidb/lightning.sh
#!/bin/bash
nohup tiup tidb-lightning -config /tidb/tidb-lightning.toml > nohup.out &

chmod u+x /tidb/lightning.sh
sh /tidb/lightning.sh

4) 用户和权限导入

修改/tidb/backup/mysql_exp_grants_out_xxxxxxxx.sql
cp /tidb/backup/mysql_exp_grants_out_xxxxxxxx.sql mysql_exp_grants_out_20220905.sql.bak
vi mysql_exp_grants_out_xxxxxxxx.sql
修改不导入root用户
mysql -h192.168.2.80 -P4001 -uroot -p
source /tidb/backup/mysql_exp_grants_out_xxxxxxxx.sql

5) 验证下游已恢复数据和用户权限

4. TiCDC启用正向同步任务

从全量备份的 metadata 文件中获取 commit-ts,作为 TiCDC 同步的开始时间戳。

tiup cdc cli capture list --pd=http://192.168.2.81:2379
tiup cdc cli changefeed create --pd=http://192.168.2.81:2379 --sink-uri="mysql://root:root@192.168.2.80:4001/" --changefeed-id="replication-task-1" --sort-engine="unified" --start-ts=439108994059206663
tiup cdc cli changefeed list --pd=http://192.168.2.81:2379
tiup cdc cli changefeed query --pd=http://192.168.2.81:2379 --changefeed-id=replication-task-1

5. 应用停服务,tidb 无业务会话连接

• 停机窗口,应用停服务。

• 断开F5连接进程。

• 重启 tidb 节点,确保 tidb 无业务会话连接。


6. 确认数据已完全同步,停止正向同步任务

tiup cdc cli changefeed pause --pd=http://192.168.2.81:2379 --changefeed-id replication-task-1

7. 数据校验

Bash
sync-diff-inspector.toml:

# Diff Configuration.

######################### Global config #########################

# 日志级别,可以设置为 info、debug
log-level = "info"

# sync-diff-inspector 根据主键/唯一键/索引将数据划分为多个 chunk,
# 对每一个 chunk 的数据进行对比。使用 chunk-size 设置 chunk 的大小
chunk-size = 1000

# 检查数据的线程数量
check-thread-count = 4

# 抽样检查的比例,如果设置为 100 则检查全部数据
sample-percent = 100

# 通过计算 chunk 的 checksum 来对比数据,如果不开启则逐行对比数据
use-checksum = true

# 如果设置为 true 则只会通过计算 checksum 来校验数据,如果上下游的 checksum 不一致也不会查出数据再进行校验
only-use-checksum = false

# 是否使用上次校验的 checkpoint,如果开启,则只校验上次未校验以及校验失败的 chunk
use-checkpoint = true

# 不对比数据
ignore-data-check = false

# 不对比表结构
ignore-struct-check = false

# 保存用于修复数据的 sql 的文件名称
fix-sql-file = "fix.sql"

######################### Tables config #########################
# 配置需要对比的*目标数据库*中的表
[[check-tables]]
    # 目标库中数据库的名称
    schema = "db1"

   # 下面的配置会检查配置库中所有的表
    tables = ["~^"]
    
[[check-tables]]
    # 目标库中数据库的名称
    schema = "db2"

   # 下面的配置会检查配置库中所有的表
    tables = ["~^"]
    
[[check-tables]]
    # 目标库中数据库的名称
    schema = "db3"

   # 下面的配置会检查配置库中所有的表
    tables = ["~^"]
    
[[check-tables]]
    # 目标库中数据库的名称
    schema = "db4"

   # 下面的配置会检查配置库中所有的表
    tables = ["~^"]
    
[[check-tables]]
    # 目标库中数据库的名称
    schema = "db5"

   # 下面的配置会检查配置库中所有的表
    tables = ["~^"]

######################### Databases config #########################

# 源数据库实例的配置
[[source-db]]
    host = "192.168.2.80"
    port = 4000
    user = "root"
    password = "root"
    # 源数据库实例的 id,唯一标识一个数据库实例
    instance-id = "source-1"
    # 使用 TiDB 的 snapshot 功能,如果开启的话会使用历史数据进行对比

# 目标数据库实例的配置
[target-db]
    host = "192.168.2.80"
    port = 4001
    user = "root"
    password = "root"

./sync_diff_inspector --config /tidb/sync-diff-inspector.toml

8. 开启回退库的反向TiCDC同步

1) 下游TiCDC节点的扩容

Bash
scale-ticdc2.yaml:

cdc_servers:
- host: 192.168.2.80
  ssh_port: 22
  port: 8301
  deploy_dir: "/tidb-deploy/cdc-8301"
  log_dir: "/tidb-deploy/cdc-8301/log"

tiup cluster scale-out tidb-test2 /tidb/scale-ticdc2.yaml
tiup cluster display tidb-test2

2) 开启TiCDC反向同步任务

tiup cdc cli capture list --pd=http://192.168.2.81:2479
tiup cdc cli changefeed create --pd=http://192.168.2.81:2479 --sink-uri="mysql://root:root@192.168.2.80:4000/" --changefeed-id="replication-task-1" --sort-engine="unified"
tiup cdc cli changefeed list --pd=http://192.168.2.81:2479
tiup cdc cli changefeed query --pd=http://192.168.2.81:2479 --changefeed-id=replication-task-1

9. 创建业务用户,取消只读,F5切换到(v6.1.0)集群

10. 业务接入服务,验证服务正常

启动应用,应用侧进行验证。

四、回退方案

1. 回退前提条件

回退前检查

  • 生产库 (v6.x.x) 与回退库 (v4.0.x) 数据一致
  • 数据追平

2. 回退操作步骤

  1. 确保数据追平
  2. 停止生产集群 (v6.x.x) 业务写入生产集群 (v6.x.x) 重启 tidb-server 节点,确认所有 tidb-server 均无连接
  3. 停止生产环境 (v6.x.x) 的 TiCDC 同步
  4. 搭建回退库 (v4.0.x) 到生产库 (v6.x.x) 的TiCDC 同步(可选)
  5. F5 修改地址,回退库 (v4.0.x) 中为业务用户重新赋权,验证业务。
  6. 修改应用指向到回退库 (v4.0.x)
  7. 查看回退集群 (v4.0.x) 状态

五、总结

  1. TiCDC开启之前需要确认业务是否有没主键或唯一键的表,对于没有有效索引的表,insert和 replace 等操作不具备可重入性,因此会有数据冗余的风险。TiCDC 在同步过程中只保证数据至少分发一次,因此开启该特性同步没有有效索引的表,一定会导致数据冗余出现。如果不能接受数据冗余,建议增加有效索引。查出来的没主键的表需提前和客户沟通进行增加主键或唯一键操作。
  2. 业务切换过程中可以把数据库设为只读状态,防止业务修改写入。

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

公众号搜索神州数码云基地,后台回复数据库,加入数据库技术交流群。

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

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

相关文章

2023年6月跟产品开发专家学NPDP产品经理认证课到这里

NPDP产品经理国际资格认证是国际公认的唯一的新产品开发专业认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 我们针对互联网时代的个人、互联网企业、与传统企业推出一系列学习。 课程从…

小车跑迷宫,如何完成?

先看视频1: 先看视频2: 要制作一个能顺利走到迷宫终点,并能按最短路径回来的小车,重中之重就是寻找其最短路径的算法,迷宫情况复杂多变,多个路口交错纵横,想要完美的找出最短路径并不容易&#…

事件相关功能磁共振波谱技术(fMRS)

导读 质子磁共振波谱(MRS)是一种非侵入性脑成像技术,用于测量不同神经化学物质的浓度。“单体素”MRS数据通常在几分钟内采集,然后对单个瞬态进行平均,从而测量神经化学物质浓度。然而,这种方法对更快速的神经化学物质的时间动态…

chatgpt赋能python:Python人脸身份识别:提高安全性和效率的先进技术

Python人脸身份识别:提高安全性和效率的先进技术 随着科技的发展,人类对于安全性和效率的需求逐渐增加。而人脸身份识别技术正是一个能够满足这一需求的先进技术。在过去的几年中,这种技术已经逐渐发展成为一种普及的安全措施,这…

串口组件:ZylSerialPort.NET 1.83 Crack

ZylSerialPort.NET 1.83 .NET 组件 库 ZylSerialPort.NET 是一个基于线程、事件驱动、异步/同步串口的.NET 组件库。 使用 ZylSerialPort.NET 组件可以轻松地通过串行端口连接与外部设备进行通信,例如调制解调器、条形码阅读器、GSM 模块等。 您也可以将它与 USB、…

Volatile、Synchronized、ReentrantLock锁机制使用说明

一、Volatile底层原理 volatile是轻量级的同步机制,volatile保证变量对所有线程的可见性,不保证原子性。 当对volatile变量进行写操作的时候,JVM会向处理器发送一条LOCK前缀的指令,将该变量所在缓存行的数据写回系统内存。由于缓…

DJ4-7 请求分页存储管理方式

目录 4.7.1 请求分页中的硬件支持 1、页表机制 2、缺页中断机构 4.7.2 内存分配策略和分配算法 1、最小物理块数的确定 2、物理块的分配策略 3、物理块的分配算法 4.7.3 调页策略 1、系统应当在何时把一个页面装入内存? 2、从何处调入页面?…

机器学习常识 12: SVM

摘要: 支持向量机 (support vector machine, SVM) 有很多闪光点, 理论方面有 VC 维的支撑, 技术上有核函数将线性不可分变成线性可分, 实践上是小样本学习效果最好的算法. 1. 线性分类器 如图 1 所示, 基础的 SVM 仍然是一个线性二分类器, 这一点与 logistic 回归一致. 图 1.…

MATLAB 之 隐函数绘图、图形修饰处理、图像处理与动画制作和交互式绘图工具

这里写目录标题 一、隐函数绘图1. 隐函数二维绘图3. 隐函数三维绘图 二、图形修饰处理1. 视点处理2. 色彩处理2.1 颜色的向量表示2.2 色图2.3 三维曲面图形的着色 3. 图形的裁剪处理 三、图像处理与动画制作1. 图像处理1.1 图像的读/写1.2 图像的显示 2. 动画制作2.1 制作逐帧动…

chatgpt赋能python:Python交流App:提高Python社区交流效率

Python 交流 App: 提高 Python 社区交流效率 Python 是当今流行程度最高的编程语言之一,有着广泛的应用场景和庞大的社区。 作为 Python 工程师,经常有各种问题需要得到解决,同时也希望能与同行进行交流、分享和学习。这时,一款高…

Linux——Centos7进入单用户模式修改密码

本篇文章适用于经常忘记自己root用户密码的初学者!!!,会进入单用户模式修改root密码即可。 系统启动进入到如下界面后输入字母“e”; 2.可以看到进入到如下界面; 3.一直下翻到图中圈起来的这部分; 4.在Lin…

excel 获取指定字符前后的字符串

目录 excel 获取指定字符前后的字符串 1.截取指定字符前的字符串 2.截取指定字符后的字符串 excel 获取指定字符前后的字符串 1.截取指定字符前的字符串 1.1LEFT FIND find:返回一个字符串在另一个字符串中出现的起始位置。 (区分大小写,且不允许使用通配符) …

综合指挥调度系统行业分类汇总

综合指挥调度系统是将语音、视频、GIS进行高度融合,构建“平战结合”的指挥调度模式,既满足平时的应急培训、日常通信、会议会商等要求,也能够应对战时的应急指挥、应急救援、应急决策等需求,达到统一指挥、联合行动的目的&#x…

ArcGIS中实现土地利用转移矩阵

土地利用转移矩阵,就是根据同一地区不同时相的土地覆盖现状的变化关系,求得一个二维矩阵。通过对得到的转移矩阵进行分析,能够得到2个时相,不同的地类之间相互转化的情况,它描述了不同的土地利用的类型在不…

新华三的网络脉动:为AI泵血,向产业奔流

AI大模型作为最新的通用技术,今年以来,发展如火如荼。也有很多从业者和专家注意到,AI模型训练和应用过程中,需要优先考虑网络的升级与适配。 如果说数据中心、算力集群是AI的“心脏”,那么网络就犹如AI的“动脉”&…

《嵌入式存储器架构、电路与应用》----学习记录(一)

前言 本书系统介绍嵌入式存储器在架构、电路和应用方面的技术进展,包括SRAM、eDRAM、eFlash和近几年兴起的阻变型存储器,并着重介绍我国研究人员在嵌入式存储器方面的研究工作。 第1章 绪论 1.1 什么是嵌入式存储器 存储器(Memory)是现代信息技术中用…

C语言 出现 “从属语句不能是声明”的情况和解决办法

C 出现 “从属语句不能是声明”的情况和解决办法 发blog的时候是六一儿童节!2023.6.1,过期的小朋友们都节日快乐! 笔者在遇到这个bug的时候的情况是这样的 在查阅了网上的一些资料后也没有发现对应的解决办法,最后发现是一个很基…

chatgpt赋能python:Python中交换变量值的几种方法

Python中交换变量值的几种方法 交换变量值是编程语言中的常见操作,也是Python中常见的操作之一。本文将介绍几种不同的方法来在Python中交换变量的值。 方法一:使用中间变量 最简单的交换变量值的方法之一是使用中间变量,如下所示&#xf…

chatgpt赋能python:Python交流群:分享经验、解决问题、结交朋友

Python 交流群:分享经验、解决问题、结交朋友 Python 是一种高级编程语言,被广泛使用于数据科学、机器学习、人工智能、网络开发、游戏开发等众多领域。作为一个有着10年 Python 编程经验的工程师,我深感 Python 社区的活力和创新力。其中&a…

亿发软件:生产制造供应链管理系统,建设中小型制造企业信息化

在中小型制造企业领域,高效的供应链管理是成功的关键。然而,中小企业所面临的有限的资源和市场需求,需要借助信息化建设,可以提升生产流程,优化供应链管理。亿发软件供应链信息化管理解决方案,优化中小企业…