首页 > 其他分享 >基于 TiCDC 的 TiDB 复制集群的计划内和计划外切换验证步骤

基于 TiCDC 的 TiDB 复制集群的计划内和计划外切换验证步骤

时间:2023-05-03 10:31:56浏览次数:35  
标签:计划外 cdc -- TiDB mysql 集群 TiCDC tidb select

作者: pepezzzz



环境准备



集群名称和版本

上游 tidb 集群: tidb-h

下游 tidb 集群: tidb-cdc

版本:v6.5.0

CDC 专用用户:cdcuser

注:业务负载用户应独立于 CDC 专用用户。

业务数据库:cdcdb

模拟业务应用:Sysbench、BANK。



上下游创建 ticdc 同步用户和数据库

create user cdcuser identified by 'cdcuser';
grant restricted_replica_writer_admin on *.* to cdcuser;
create database cdcdb;
grant all privileges on cdcdb.* to cdcuser;



设置下游 tidb-cdc 集群只读

tidb-cdc 集群只读后,只允许具备 restricted_replica_writer_admin 角色的 cdcuser 进行上游同步的数据写入。

set global tidb_restricted_read_only=on;

建议重启 tidb-server 防止有连接未进入只读状态。

tiup cluster restart tidb-cdc -R tidb

检验环境变量。

show global variables like '%tidb_restricted_read_only%';
show global variables like '%tidb_super_read_only%';

此时结果应该显示为 ON。

验证 tidb-cdc 处于只读状态。

create database rovfydb;

系统应提示 ERROR 1836 (HY000): Running in read-only mode 的报错,说明确定处于只读状态。



完成数据初始化

使用 dumpling / lightning 或者 br 进行上下游 TiDB 集群的数据初始化,并记录备份 ts,过程略。



编辑任务 toml 文件

Toml 文件内需要启用 redo 功能,并指定 redo 数据共享的存储位置。



创建 tidb-h 到 tidb-cdc 的复制链路

在上游 tidb-h 执行创建 changefeed 指令

tiup ctl:v<CLUSTER_VERSION> cdc changefeed create --server=http://{tidb-h-cdc-ip}:8300  --sink-uri="mysql://cdcuser:cdcuser@{tidb-cdc-lb-ip}:4000/?safe-mode=false&enable-old-value=true" --sync-interval=5m --sync-point=true  --changefeed-id="cdcdb-cdc-task" --config /home/tidb/cdc_toml/cdcdb_h2cdc_changefeed.toml

检查同步任务状态

tiup ctl:v<CLUSTER_VERSION> cdc changefeed list --server=http://{tidb-h-cdc-ip}:8300

检验 cdcdb-cdc-task 任务状态应该是 normal,同时多次执行可见 tso 和 checkpoint 值还在正常推进。

"id": "cdcdb-cdc-task", 
"summary": {
"state": "normal",
"tso”: 436004661945434114,
"checkpoint": “202x-xx-xx xx:xx:xx.xxx",
"error": null
}



启动上游应用

sysbench 模拟应用负载

sysbench /usr/local/share/sysbench/oltp_read_write.lua --mysql-host={tidb-h-lb-ip} --mysql-port=4000 --mysql-db=cdcdb --mysql-user=sbuser --mysql-password=sbuser  --tables=20 --threads=20 --time=600  run > /tmp/syebench.log &

bank 模拟检验一致性应用

./bank_arm64  -dsn 'bankuser:bankuser@tcp({tidb-h-lb-ip}:4000)/cdcdb' -accounts 10000

执行完成后,应该有 INFO[0002] verify success in xxxx-xx-xx xx:xx:xx ... 的总余额校验成功的提示。



观察 cdc 数据同步指标

Tidb-h 集群的 cdc 监控面板,changefeed checkpoint lag 和 changefeed resolved ts lag 应该在秒级。

基于 TiCDC 的 TiDB 复制集群的计划内和计划外切换验证步骤_mysql



模拟 ticdc 同步集群计划内主从切换



设置上游 tidb-h 集群只读

set global tidb_restricted_read_only = on;

tidb-h 只读后,原先连接 tidb-h 集群的 sysbench 和 bank 模拟负载程序均应报错。

建议重启 tidb-server 防止有连接未进入只读状态。

tiup cluster restart tidb-h -R tidb

检查环境变量。

show variables like '%tidb_restricted_read_only%';
show variables like '%tidb_super_read_only%';

命令结果应该显示为 ON



停止上游的应用程序

使用 pkill 停止已经处于报错状态的 sysbench 和 bank。

pkill sysbench
pkill bank_arm64



下游集群做业务数据校验

业务应用可以通过手工检查是否是一致的,如 BANK 应用可以通过最新记录确认事务是一致的,并记录当前的 current_ts。

select sum(balance) from accounts;
select * from record where tso=(select max(tso) from record); 
select * from accounts where tso=(select max(tso) from accounts);
select tidb_current_ts();



可选使用 sync diff 进行 tidb-h 和 tidb-cdc 集群的数据一致校验

vi sync_diff_inspector_h_to_cdc.conf
cd /home/tidb/tidb-community-toolkit-v<CLUSTER_VERSION>-linux-arm64
nohup ./sync_diff_inspector --config sync_diff_inspector_h_to_cdc.conf > sync.32.log &
tail -20 /data1/sync_dir/sync_diff.log

通过 syncdiff 的结果确认两边追平

[INFO] [diff.go:377] ["close handleCheckpoint goroutine"] 
[INFO] [main.go:114] ["check data finished"] [cost=XmYs] 
[INFO] [main.go:108] ["check pass!!!"]



删除 tidb-h 集群 cdc 任务

tiup ctl:v<CLUSTER_VERSION> cdc changefeed remove --server=http://{tidb-h-cdc-ip}:8300 -c cdcdb-cdc-task

检查同步任务状态

tiup ctl:v<CLUSTER_VERSION> cdc changefeed list --server=http://{tidb-h-cdc-ip}:8300

命令输出为空,或者不包含 cdcdb-cdc-task。



设置下游 tidb-cdc 集群恢复读写模式

关闭只读状态,恢复读写模式。

set global tidb_restricted_read_only = off;
set global tidb_super_read_only=off;

检查环境变量。

show variables like '%tidb_restricted_read_only%';
show variables like '%tidb_super_read_only%';

命令结果应该显示为 OFF



创建新的上游 tidb-cdc 到 tidb-h 的复制链路

在上游 tidb-cdc 执行创建指令

tiup ctl:v<CLUSTER_VERSION> cdc changefeed create --server=http://{tidb-cdc-cdc-ip}:8300  --sink-uri="mysql://cdcuser:cdcuser@{tidb-h-lb-ip}:4000/?safe-mode=false&enable-old-value=true" --sync-interval=5m --sync-point=true  --changefeed-id="cdcdb-cdc-task-standby" --config /home/tidb/cdc_toml/cdcdb_cdc2h_changefeed.toml

检查同步任务状态

tiup ctl:v<CLUSTER_VERSION> cdc changefeed list --server=http://{tidb-cdc-cdc-ip}:8300

检验任务状态应该是 normal,同时 tso 和 checkpoint 数据还在正常推进。

"id": "cdcdb-cdc-task-standby", 
"summary": {
"state": "normal",
"tso”: 436004661945434114,
"checkpoint": “202x-xx-xx xx:xx:xx.xxx",
"error": null
}



启动下游应用

sysbench 模拟应用负载

sysbench /usr/local/share/sysbench/oltp_read_write.lua --mysql-host={tidb-cdc-lb-ip} --mysql-port=4000 --mysql-db=cdcdb --mysql-user=sbuser --mysql-password=sbuser  --tables=20 --threads=20 --time=600  run > /tmp/syebench.log &

bank 模拟检验一致性应用

./bank_arm64  -dsn 'cdcuser:cdcuser@tcp({tidb-cdc-lb-ip}:4000)/cdcdb' -accounts 10000



观察 cdc 数据同步指标

Tidb-cdc 集群的 cdc 监控面板,changefeed checkpoint lag 和 changefeed resolved ts lag 应该在秒级。



计划内主从切换切换后检查



查询 tsomap 对应关系

tidb-h 集群是切换后复制链路的下游目标集群,需要从 tidb-h 取得最新的 tso 对应点。

select * from syncpoint_v1 order by primary_ts desc limit 10;

得到最新的一个上下游一致性对应点的 TSO 数据



使用 sync diff 进行 tidb-h 和 tidb-cdc 集群的数据一致校验

在 sync diff 的配置文件 snapshot 参数需要指定一个上下游一致性对应点的 TSO 进行数据一致校验

vi sync_diff_inspector_cdc_to_h.conf

check-thread-count=20
export-fix-sql = true 
check-struct-only = false 
[data-sources]
[data-sources.tidb-h] 
host ="tidb-h-lb-ip” 
port = 4000
user = "root"
password = ""
snapshot = "436004818783567873" 
[data-sources.tidb-cdc]
host = "tidb-h-cdc-ip” 
port = 4000
user = "root" 
password = ""
snapshot = "436004805298880512" 
[routes]
...



模拟 ticdc 同步集群计划外切换从集群接管



停上游集群模拟计划外主集群故障

关闭 tidb-h 集群。

tiup cluster stop tidb-h



停止上游的应用程序

sysbench 和 bank 应该会出现报错,使用 pkill 停止 sysbench 和 bank。

pkill sysbench
pkill bank_arm64



下游集群进行 acid 一致性修复

下游集群使用与上游同版本的 cdc 二进制进行 redo apply 的一致性修复。

mkdir -p /tmp/cdc/redo/apply
export AWS_ACCESS_KEY_ID=xxxx
export AWS_SECRET_ACCESS_KEY=xxxx
./cdc redo apply --tmp-dir="/tmp/cdc/redo/apply" --storage="s3://{cdc_bucket}/cdc_redo/?endpoint=http://{s3-url}/" --sink-uri="mysql://cdcuser:cdcuser@{tidb-cdc-lb-ip}:4000"

命令输出应该会有如下提示:

[INFO][redo.go:111] ["apply redo log starts"] [checkpointTs=436118916148494396] [resolvedTs=436118916672782426] 
...
[INFO][mysql.go:186]["Start mysql sink"] 
[INFO][mysql.go:536]["clean up table max resolved ts in MySQL sink"] [tableID=1093][resolvedTs=436118916672782426]
[INFO][mysql.go:541] ["clean up table checkpoint ts in MySQL sink"] [tableID=1093] [checkpointTs=436118916672782426]
[INFO][mysql.go:536]["clean up table max resolved ts in MySQL sink"] [tableID=1091][resolvedTs=436118916672782426]
[INFO][mysql.go:541]["clean up table checkpoint ts in MySQL sink"] [tableID=1091] [checkpointTs=436118916672782426]
Apply redo log successfully



下游集群做业务数据校验

业务应用可以通过手工检查是否是一致的,如 BANK 应用可以通过最新记录确认事务是一致的,并记录当前的 current_ts。

select sum(balance) from accounts;
select * from record where tso=(select max(tso) from record); 
select * from accounts where tso=(select max(tso) from accounts);
select tidb_current_ts();



设置 tidb-cdc 集群恢复读写模式

锁定 ticdc 用户,防止集群恢复读写后上游复制链路突然恢复会进行写入。

ALTER USER cdcuser ACCOUNT UNLOCK;

关闭只读状态,恢复读写模式。

set global tidb_restricted_read_only=off;
set global tidb_super_read_only=off;

检查环境变量。

show variables like '%tidb_restricted_read_only%';
show variables like '%tidb_super_read_only%';

命令结果应该显示为 OFF



启动下游应用

sysbench 模拟应用负载

sysbench /usr/local/share/sysbench/oltp_read_write.lua --mysql-host={tidb-cdc-lb-ip} --mysql-port=4000 --mysql-db=cdcdb --mysql-user=sbuser --mysql-password=sbuser  --tables=20 --threads=20 --time=600  run > /tmp/syebench.log &

bank 模拟检验一致性应用

./bank_arm64  -dsn 'cdcuser:cdcuser@tcp({tidb-cdc-lb-ip}:4000)/cdcdb' -accounts 10000



可选上游集群做数据比对

可选重启除 CDC 节点外的上游集群,通过 redo apply 日志中的 tso 时间点做闪回查询对比,查询结果应该与下游集群的输出一致。

set tidb_snapshot="redo apply ts";
select sum(balance) from accounts; 
select * from record where tso=(select max(tso) from record); 
select * from accounts where tso=(select max(tso) from accounts);

注意:上游集群在 tikv 的最新数据不一定已经同步到 ticdc 的 redo 内,所以逻辑复制方案暂时不能实现 RPO=0。

理论上,可以通过对 redo 文件的解析,提交业务进行手工审核修改进行恢复。

标签:计划外,cdc,--,TiDB,mysql,集群,TiCDC,tidb,select
From: https://blog.51cto.com/u_15550868/6241115

相关文章

  • TiDB与MySQL的SQL差异及执行计划简析
    作者:京东零售肖勇一、前言导读TiDB作为NewSQL,其在对MySQL(SQL92协议)的兼容上做了很多,MySQL作为当下使用较广的事务型数据库,在IT界尤其是互联网间使用广泛,那么对于开发人员来说,1)两个数据库产品在SQL开发及调优的过程中,都有哪些差异?在系统迁移前需要提前做哪些准备?2)TiDB的执行计......
  • 将TiDB各服务组件混布到物理机集群和K8S环境
    前提条件K8S集群外的服务器节点和K8S集群内的Pod网络必须保持互通(本文采用将物理机节点加入K8S集群然后打污点并驱逐该服务器里边的pod的方式来实现)K8S机器外的服务器节点必须可以通过添加解析的方式来解析K8S集群内部Pod域名(具体见第一步)待迁移集群没有开启组件间TLS加密通信......
  • TiDB单机部署
    1、安装包下载及环境说明TIDB软件包下载地址:https://cn.pingcap.com/product-community/操作系统:CentOS7.9TIDB版本:6.5.1TIDB所需安装包:tidb-community-toolkit-v6.5.1-linux-amd64.tar.gztidb-community-server-v6.5.1-linux-amd64.tar.gz2、创建系统用户#创建用......
  • TiDB × 阿里云试用体验(随迟但到)
    作者:CuteRay前言其实TiDB的阿里云试用活动其实也过去一段时间了,之前一直没有整块整块的时间慢慢地折腾,只能趁着闲暇之余慢慢体验,这篇文章也就写的很慢了,可惜错过了文章征文活动,错过好多礼物(咱们写文章是为了奖品的吗?肤浅!!!)。行话不多说,直入正题。部署部署没什么太多需要讲的,......
  • TiDB 数据库大版本升级-基于TiCDC异机升级
    作者:gary一、前言 本操作手册描述了xx用户TiDB集群基于TiCDC进行大版本升级的操作过程、操作方法与注意事项,用于指导xx用户完成TiDB集群基于TiCDC进行大版本异机升级以及回退方案。 二、升级架构图 ** **TiCDC的系统架构如上图所示:部署一套所需升级版本的下游TiDB集群......
  • 基于TiDB+Flink实现的滑动窗口实时累计指标算法
    作者:Jellybean前言在不少的支付分析场景里,大部分累计值指标可以通过T+n的方式计算得到。随着行业大环境由增量市场转为存量市场,产品的运营要求更加精细化、更快速反应,这对各项数据指标的实时性要求已经越来越高。产品如果能实时把握应用的整体运行情况或特征用户的状态,就可......
  • bytebase让你爱上tidb的开源审核神器。
    作者:tidb狂热爱好者保证tidb运行,首先要缩小数据库容量。保证每个sql只需要查询他当前需要查询的内容。尽量取更少的数据,节约单个tikv的io。使用分页、分表、分区等技术,控制单表的数据量和查询范围这种就是保证读取的少使用缓存、读写分离、集群等技术,提高并发处理能力和可用性根......
  • 基于TiDB Binlog架构的主备集群部署及数据同步操作手册
    作者:Liuhaoao最近手头有个系统,有需要搭建灾备库的需求(rto要求4小时内,根据实际情况计算)。考虑到生产系统是5版本,TiCDC存在一些兼容性问题,且TiDBBinlog已经有实践案例及经验可供参考,故选择使用TiDBBinlog来实现主集群-->灾备集群的增量数据同步。数据全量初始化采用Dumpling+Ti......
  • 对tidb-lightning导入机制的一点点研究
    作者:buddyyuan前言最近生产上出现了一个问题,就是一堆emptyregion不进行合并。通过分析发现是和lightning失败有关的,于是把这个问题研究了一下,以下是关于这个问题的一点点原理。Lightning究竟停止了什么首先我们先阅读一下官方文档。在导入数据之前,tidb-lightning 会自动......
  • 【必须收藏】别再乱找 TiDB 集群部署教程了,这篇保姆级教程来帮你!!| 博学谷狂野架构师
    TiDB基础使用TiDBdashboard使用TiDBDashboard是TiDB自4.0版本起提供的图形化界面,可用于监控及诊断TiDB集群。TiDBDashboard内置于TiDB的PD组件中,无需......