一、背景
目前想用tidb支撑一个主要的业务,为了安全,需要在后面接一个mysql用来备份,闪回及关键时刻切回的操作
二、操作流程
1.安装ticdc
这一步可以通过部署部署集群的时候安装,也可以后期扩容,这一步比较简单
2.tidb端的操作
因为同步没法找到一个准确的时间点,且主库又无法停业务,所以需要提前复制一部分
2.1 查看tidb的gc配置
# ticdc的start-ts 的值需要大于 TiDB 集群当前的 tikv_gc_safe_point
mysql> select VARIABLE_NAME, VARIABLE_VALUE from mysql.tidb where VARIABLE_NAME like "tikv_gc%";
+--------------------------+------------------------------------------------------------------------------------------------------------------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+--------------------------+------------------------------------------------------------------------------------------------------------------------+
| tikv_gc_leader_uuid | abc3basdas |
| tikv_gc_leader_desc | host:123.123, pid:19191, start at 2021-09-10 02:25:35.75321834 +0000 UTC m=+1.129627037 |
| tikv_gc_leader_lease | 20210914-06:11:35 +0000 |
| tikv_gc_enable | true |
| tikv_gc_run_interval | 10m0s |
| tikv_gc_life_time | 10m0s |
| tikv_gc_last_run_time | 20210914-06:08:35 +0000 |
| tikv_gc_safe_point | 20210914-05:58:35 +0000 |
| tikv_gc_auto_concurrency | true |
| tikv_gc_mode | distributed |
+--------------------------+------------------------------------------------------------------------------------------------------------------------+
2.2 调整gc配置
# 预留足够的时间给cdc同步
update mysql.tidb set VARIABLE_VALUE="24h" where VARIABLE_NAME="tikv_gc_life_time";
2.3 同步数据到下游
3.cdc配置与启动
3.1 创建同步任务
tiup ctl:v4.0.13 cdc changefeed create --pd=http://pd_ip:pd_port --sink-uri="mysql://root:123456@127.0.0.1:3306/" --changefeed-id="simple-replication-task" --start-ts=395181938313123110 --sort-engine="unified" --config=./cdc.conf
# 这里我把start-ts改为一个很小的tso,这样报错里就会给出当前保存点的tso,然后我们把这个tso填写到start-ts上,目前不知道怎么讲时间转换成tso,只能用这种方法了
# --changefeed-id:同步任务的 ID,格式需要符合正则表达式 ^[a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*$。如果不指定该 ID,TiCDC 会自动生成一个 UUID(version 4 格式)作为 ID
# --sink-uri:同步任务下游的地址,需要按照以下格式进行配置,目前 scheme 支持 mysql/tidb/kafka/pulsar
# --start-ts:指定 changefeed 的开始 TSO。TiCDC 集群将从这个 TSO 开始拉取数据。默认为当前时间。
# --target-ts:指定 changefeed 的目标 TSO。TiCDC 集群拉取数据直到这个 TSO 停止。默认为空,即 TiCDC 不会自动停止。
# --sort-engine:指定 changefeed 使用的排序引擎。因 TiDB 和 TiKV 使用分布式架构,TiCDC 需要对数据变更记录进行排序后才能输出。该项支持 unified(默认)/memory/file:
# unified:优先使用内存排序,内存不足时则自动使用硬盘暂存数据。该选项默认开启。
# memory:在内存中进行排序。 不建议使用,同步大量数据时易引发 OOM。
# file:完全使用磁盘暂存数据。已经弃用,不建议在任何情况使用。
# --sort-dir: 指定排序引擎使用的临时文件目录。不建议在 cdc cli changefeed create 中使用该选项,建议在 cdc server 命令中使用该选项来设置临时文件目录。该配置项的默认值为 /tmp/cdc_sort。在开启 Unified Sorter 的情况下,如果服务器的该目录不可写或可用空间不足,请手动指定 sort-dir。如果 sort-dir 对应的目录不可写入,changefeed 将会自动停止。
# --config:指定 changefeed 配置文件
3.2 查看同步列表
tiup ctl:v4.0.13 cdc changefeed list --pd=http://pd_ip:pd_port
# checkpoint 即为 TiCDC 已经将该时间点前的数据同步到了下游。
# state 为该同步任务的状态:
# normal: 正常同步
# stopped: 停止同步(手动暂停或出错)
# removed: 已删除任务(只在指定 --all 选项时才会显示该状态的任务。未指定时,可通过 query 查询该状态的任务)
# finished: 任务已经同步到指定 target-ts,处于已完成状态(只在指定 --all 选项时才会显示该状态的任务。未指定时,可通过 query 查询该状态的任务)
3.3 查看特定同步任务
tiup ctl:v4.0.13 cdc changefeed query -s --pd=http://pd_ip:pd_port --changefeed-id=simple-replication-task
# --simple 或 -s 参数会简化输出
# state 代表当前 changefeed 的同步状态,各个状态必须和 changefeed list 中的状态相同。
# tso 代表当前 changefeed 中已经成功写入下游的最大事务 TSO。
# checkpoint 代表当前 changefeed 中已经成功写入下游的最大事务 TSO 对应的时间。
# error 记录当前 changefeed 是否有错误发生。
# 非简化输出解释如下:
# info 代表查询 changefeed 的同步配置。
# status 代表查询 changefeed 的同步状态信息。
# resolved-ts 代表当前 changefeed 中已经成功从 TiKV 发送到 TiCDC 的最大事务 TS。
# checkpoint-ts 代表当前 changefeed 中已经成功写入下游的最大事务 TS。
# admin-job-type 代表一个 changefeed 的状态:
# 0: 状态正常。
# 1: 任务暂停,停止任务后所有同步 processor 会结束退出,同步任务的配置和同步状态都会保留,可以从 checkpoint-ts 恢复任务。
# 2: 任务恢复,同步任务从 checkpoint-ts 继续同步。
# 3: 任务已删除,接口请求后会结束所有同步 processor,并清理同步任务配置信息。同步状态保留,只提供查询,没有其他实际功能。
# task-status 代表查询 changefeed 所分配的各个同步子任务的状态信息。
3.4 停止同步任务
tiup ctl:v4.0.13 cdc changefeed pause --pd=http://10.0.10.25:2379 --changefeed-id simple-replication-task
3.5 恢复同步任务
tiup ctl:v4.0.13 cdc changefeed resume --pd=http://10.0.10.25:2379 --changefeed-id simple-replication-task
3.6 删除同任务
tiup ctl:v4.0.13 cdc changefeed remove --pd=http://10.0.10.25:2379 --changefeed-id simple-replication-task --force
3.7 更新同步任务
tiup ctl:v4.0.13 cdc changefeed pause -c test-cf --pd=http://pd_ip:pd_port
tiup ctl:v4.0.13 cdc changefeed update -c test-cf --pd=http://pd_ip:pd_port --sink-uri="mysql://127.0.0.1:3306/?max-txn-row=20&worker-number=8" --config=changefeed.toml
tiup ctl:v4.0.13 cdc changefeed resume -c test-cf --pd=http://pd_ip:pd_port
# TiCDC 从 v4.0.4 开始支持非动态修改同步任务配置,修改 changefeed 配置需要按照 暂停任务 -> 修改配置 -> 恢复任务 的流程。
# 当前支持修改的配置包括:
# changefeed 的 sink-uri
# changefeed 配置文件及文件内所有配置
# changefeed 是否使用文件排序和排序目录
# changefeed 的 target-ts
3.8 配置文件概览
# 指定配置文件中涉及的库名、表名是否为大小写敏感
# 该配置会同时影响 filter 和 sink 相关配置,默认为 true
case-sensitive = true
# 是否输出 old value,从 v4.0.5 开始支持
enable-old-value = false
[filter]
# 忽略指定 start_ts 的事务
ignore-txn-start-ts = [1, 2]
# 过滤器规则
# 过滤规则语法:https://docs.pingcap.com/zh/tidb/stable/table-filter#表库过滤语法
rules = ['*.*', '!test.*']
[mounter]
# mounter 线程数,用于解码 TiKV 输出的数据
worker-num = 16
[sink]
# 对于 MQ 类的 Sink,可以通过 dispatchers 配置 event 分发器
# 支持 default、ts、rowid、table 四种分发器,分发规则如下:
# - default:有多个唯一索引(包括主键)时按照 table 模式分发;只有一个唯一索引(或主键)按照 rowid 模式分发;如果开启了 old value 特性,按照 table 分发
# - ts:以行变更的 commitTs 做 Hash 计算并进行 event 分发
# - rowid:以所选的 HandleKey 列名和列值做 Hash 计算并进行 event 分发
# - table:以表的 schema 名和 table 名做 Hash 计算并进行 event 分发
# matcher 的匹配语法和过滤器规则语法相同
# 根据hash算法分发到不同的partition中,6.1开始支持partition和topic两种分发器
dispatchers = [
{matcher = ['test1.*', 'test2.*'], dispatcher = "ts"},
{matcher = ['test3.*', 'test4.*'], dispatcher = "rowid"},
]
# 对于 MQ 类的 Sink,可以指定消息的协议格式
# 目前支持 default、canal、avro 和 maxwell 四种协议。default 为 TiCDC Open Protocol
protocol = "default"
[cyclic-replication]
# 是否开启环形同步
enable = false
# 当前 TiCDC 的复制 ID
replica-id = 1
# 需要过滤掉的同步 ID
filter-replica-ids = [2,3]
# 是否同步 DDL
sync-ddl = true
ps: 使用cdc要将tiup升级到新版本,不然可能会有问题