From 83588b3f9938f492074a90625483c3c35a2ff200 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Tue, 12 Nov 2024 20:56:17 +0800 Subject: [PATCH 1/3] ticdc: add detailed instructions for verifying if TiCDC has synchronized all updates to downstream --- ticdc/ticdc-faq.md | 93 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/ticdc/ticdc-faq.md b/ticdc/ticdc-faq.md index cab3967719db..95131fce051b 100644 --- a/ticdc/ticdc-faq.md +++ b/ticdc/ticdc-faq.md @@ -53,6 +53,99 @@ cdc cli changefeed list --server=http://127.0.0.1:8300 > > 该功能在 TiCDC 4.0.3 版本引入。 +## 上游停止更新后,如何判断 TiCDC 是否已将所有更新同步到下游? + +可以通过对比时间戳的方式查看。 + +1. 在上游 TiDB 停止所有更新后,获取上游 TiDB 集群的最新 TSO 对应的时间。 + +> 注意: +> +> 不要直接使用 `NOW()` 等查看时间的方式,要用 TSO,这里是为了方便后面的时间对比所以将 TSO 转成时间格式。 + +```sql +BEGIN; SELECT TIDB_PARSE_TSO(TIDB_CURRENT_TSO()); ROLLBACK; +``` + +```sql ++------------------------------------+ +| TIDB_PARSE_TSO(TIDB_CURRENT_TSO()) | ++------------------------------------+ +| 2024-11-12 20:35:34.848000 | ++------------------------------------+ +``` + +2. 获取 TiCDC 当前的同步进度,如果进度大于等于刚刚获得的上游 TSO,就表示已经同步了所有更新。获取当前同步进度有两种方式: + + * **方法一**:通过 `cdc` 查看所有同步任务的 Checkpoint。 + + ```shell + cdc cli changefeed list --server=http://127.0.0.1:8300 + ``` + + 在输出中可以看到所有同步任务的 `checkpoint` 字段: + + ```json + [ + { + "id": "syncpoint", + "namespace": "default", + "summary": { + "state": "normal", + "tso": 453880043653562372, + "checkpoint": "2024-11-12 20:36:01.447", + "error": null + } + } + ] + ``` + + `"checkpoint": "2024-11-12 20:36:01.447"` 表示 TiCDC 当前的同步进度已达到 `2024-11-12 20:36:01.447`,上游 TiDB 集群在这个时间之前的所有变更已同步完。所以当 checkpoint 大于等于刚刚获取的上游 TiDB 的 TSO 时间就说明所有更新已同步到下游。 + + * **方法二**:若下游为 TiDB,且开启了 TiCDC Syncpoint 功能,那么可以通过查看 Syncpoint 信息来获取当前同步进度。 + + 在下游 TiDB 中执行下面的 SQL 语句: + + ```sql + select * from tidb_cdc.syncpoint_v1; + ``` + + 从结果中可以看到上游 TSO (primary_ts) 信息: + + ```sql + +------------------+------------+--------------------+--------------------+---------------------+ + | ticdc_cluster_id | changefeed | primary_ts | secondary_ts | created_at | + +------------------+------------+--------------------+--------------------+---------------------+ + | default | syncpoint | 453879870259200000 | 453879870545461257 | 2024-11-12 20:25:01 | + | default | syncpoint | 453879948902400000 | 453879949214351361 | 2024-11-12 20:30:01 | + | default | syncpoint | 453880027545600000 | 453880027751907329 | 2024-11-12 20:35:00 | + +------------------+------------+--------------------+--------------------+---------------------+ + ``` + + 表格中 primary_ts 和 secondary_ts 表示的是上游 TiDB 在 primary_ts 时刻的 snapshot 与下游 TiDB 在 secondary_ts 时刻的 snapshot 是相同的。 + + 将最新的那条 primary_ts 转换成人类易读的时间格式: + + ```sql + select TIDB_PARSE_TSO(453880027545600000); + ``` + + 即可得到 primary_ts 对应的时间格式: + + ```sql + +------------------------------------+ + | TIDB_PARSE_TSO(453880027545600000) | + +------------------------------------+ + | 2024-11-12 20:35:00 | + +------------------------------------+ + ``` + + 当 primary_ts 所对应的时间超过了步骤 1 中刚获取的上游 TiDB 集群的 TSO 时,则说明 TiCDC 已同步完所有更新。 + + > 注意: + > + > Syncpoint 信息每隔 [`sync-point-interval`](/ticdc/ticdc-upstream-downstream-check.md#启用-syncpoint) 时间才更新一次,想要及时查看当前同步进度建议通过方法一的 Checkpoint 信息来判断。 + ## TiCDC 的 `gc-ttl` 是什么? 从 TiDB v4.0.0-rc.1 版本起,PD 支持外部服务设置服务级别 GC safepoint。任何一个服务可以注册更新自己服务的 GC safepoint。PD 会保证任何晚于该 GC safepoint 的 KV 数据不会在 TiKV 中被 GC 清理掉。 From c5f3b2db7b0df6fdfe4be58e2698f8d61e863619 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Wed, 13 Nov 2024 15:57:05 +0800 Subject: [PATCH 2/3] ticdc: adjust indentation --- ticdc/ticdc-faq.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ticdc/ticdc-faq.md b/ticdc/ticdc-faq.md index 95131fce051b..20c722d036cc 100644 --- a/ticdc/ticdc-faq.md +++ b/ticdc/ticdc-faq.md @@ -59,21 +59,21 @@ cdc cli changefeed list --server=http://127.0.0.1:8300 1. 在上游 TiDB 停止所有更新后,获取上游 TiDB 集群的最新 TSO 对应的时间。 -> 注意: -> -> 不要直接使用 `NOW()` 等查看时间的方式,要用 TSO,这里是为了方便后面的时间对比所以将 TSO 转成时间格式。 + > 注意: + > + > 不要直接使用 `NOW()` 等查看时间的方式,要用 TSO,这里是为了方便后面的时间对比所以将 TSO 转成时间格式。 -```sql -BEGIN; SELECT TIDB_PARSE_TSO(TIDB_CURRENT_TSO()); ROLLBACK; -``` + ```sql + BEGIN; SELECT TIDB_PARSE_TSO(TIDB_CURRENT_TSO()); ROLLBACK; + ``` -```sql -+------------------------------------+ -| TIDB_PARSE_TSO(TIDB_CURRENT_TSO()) | -+------------------------------------+ -| 2024-11-12 20:35:34.848000 | -+------------------------------------+ -``` + ```sql + +------------------------------------+ + | TIDB_PARSE_TSO(TIDB_CURRENT_TSO()) | + +------------------------------------+ + | 2024-11-12 20:35:34.848000 | + +------------------------------------+ + ``` 2. 获取 TiCDC 当前的同步进度,如果进度大于等于刚刚获得的上游 TSO,就表示已经同步了所有更新。获取当前同步进度有两种方式: From 7b6649d5e69d145e2048586fd6789e41f0511f79 Mon Sep 17 00:00:00 2001 From: wlwilliamx <53336371+wlwilliamx@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:01:24 +0800 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Aolin --- ticdc/ticdc-faq.md | 126 +++++++++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 57 deletions(-) diff --git a/ticdc/ticdc-faq.md b/ticdc/ticdc-faq.md index 20c722d036cc..08809a39aa1e 100644 --- a/ticdc/ticdc-faq.md +++ b/ticdc/ticdc-faq.md @@ -55,18 +55,24 @@ cdc cli changefeed list --server=http://127.0.0.1:8300 ## 上游停止更新后,如何判断 TiCDC 是否已将所有更新同步到下游? -可以通过对比时间戳的方式查看。 +在上游 TiDB 集群停止更新后,可以通过比较上游 TiDB 集群的最新 [TSO](/glossary.md#tso) 时间戳与 TiCDC 当前的同步进度判断同步是否完成。如果 TiCDC 的同步进度时间大于或等于上游 TiDB 集群的 TSO,则说明 TiCDC 已同步所有更新。具体操作步骤如下: -1. 在上游 TiDB 停止所有更新后,获取上游 TiDB 集群的最新 TSO 对应的时间。 +1. 获取上游 TiDB 集群的最新 TSO 时间戳。 - > 注意: + > **注意:** > - > 不要直接使用 `NOW()` 等查看时间的方式,要用 TSO,这里是为了方便后面的时间对比所以将 TSO 转成时间格式。 + > 请使用 [`TIDB_CURRENT_TSO()`](/functions-and-operators/tidb-functions.md#tidb_current_tso) 函数获取 TSO,而不是 `NOW()` 等查询当前时间的函数。 + + 以下示例使用 [`TIDB_PARSE_TSO()`](/functions-and-operators/tidb-functions.md#tidb_parse_tso) 将 TSO 转换为可读的时间格式,便于后续比较: ```sql - BEGIN; SELECT TIDB_PARSE_TSO(TIDB_CURRENT_TSO()); ROLLBACK; + BEGIN; + SELECT TIDB_PARSE_TSO(TIDB_CURRENT_TSO()); + ROLLBACK; ``` + 输出结果示例如下: + ```sql +------------------------------------+ | TIDB_PARSE_TSO(TIDB_CURRENT_TSO()) | @@ -75,76 +81,82 @@ cdc cli changefeed list --server=http://127.0.0.1:8300 +------------------------------------+ ``` -2. 获取 TiCDC 当前的同步进度,如果进度大于等于刚刚获得的上游 TSO,就表示已经同步了所有更新。获取当前同步进度有两种方式: +2. 获取 TiCDC 当前的同步进度。 + + 你可以通过以下两种方法之一检查当前的同步进度: - * **方法一**:通过 `cdc` 查看所有同步任务的 Checkpoint。 + * **方法一**:查询同步任务的 Checkpoint(推荐) - ```shell - cdc cli changefeed list --server=http://127.0.0.1:8300 - ``` + 使用 [TiCDC 命令行工具](/ticdc/ticdc-manage-changefeed.md) `cdc cli` 查看所有同步任务的 Checkpoint: - 在输出中可以看到所有同步任务的 `checkpoint` 字段: + ```shell + cdc cli changefeed list --server=http://127.0.0.1:8300 + ``` - ```json - [ - { - "id": "syncpoint", - "namespace": "default", - "summary": { - "state": "normal", - "tso": 453880043653562372, - "checkpoint": "2024-11-12 20:36:01.447", - "error": null + 输出结果示例如下: + + ```json + [ + { + "id": "syncpoint", + "namespace": "default", + "summary": { + "state": "normal", + "tso": 453880043653562372, + "checkpoint": "2024-11-12 20:36:01.447", + "error": null + } } - } - ] - ``` + ] + ``` + + 在输出结果中,`"checkpoint": "2024-11-12 20:36:01.447"` 表示 TiCDC 当前的同步进度为 `2024-11-12 20:36:01.447`,即所有在该时间之前的上游 TiDB 变更已同步完成。如果该时间戳大于或等于步骤 1 中获取的上游 TiDB TSO 时间,则表示所有更新已经同步到下游。 - `"checkpoint": "2024-11-12 20:36:01.447"` 表示 TiCDC 当前的同步进度已达到 `2024-11-12 20:36:01.447`,上游 TiDB 集群在这个时间之前的所有变更已同步完。所以当 checkpoint 大于等于刚刚获取的上游 TiDB 的 TSO 时间就说明所有更新已同步到下游。 + * **方法二**:查询下游 TiDB 的 Syncpoint 信息 - * **方法二**:若下游为 TiDB,且开启了 TiCDC Syncpoint 功能,那么可以通过查看 Syncpoint 信息来获取当前同步进度。 + 如果下游是 TiDB,并且已启用 [TiCDC Syncpoint 功能](/ticdc/ticdc-upstream-downstream-check.md),可以通过查询下游 TiDB 的 Syncpoint 信息获取同步进度。 - 在下游 TiDB 中执行下面的 SQL 语句: + > **注意:** + > + > Syncpoint 信息的更新间隔由 [`sync-point-interval`](/ticdc/ticdc-upstream-downstream-check.md#启用-syncpoint) 参数控制。如需获取最新同步进度,建议使用方法一。 - ```sql - select * from tidb_cdc.syncpoint_v1; - ``` + 在下游 TiDB 中执行以下 SQL 语句,获取上游 TSO (`primary_ts`) 和下游 TSO (`secondary_ts`) 信息。 - 从结果中可以看到上游 TSO (primary_ts) 信息: + ```sql + SELECT * FROM tidb_cdc.syncpoint_v1; + ``` - ```sql - +------------------+------------+--------------------+--------------------+---------------------+ - | ticdc_cluster_id | changefeed | primary_ts | secondary_ts | created_at | - +------------------+------------+--------------------+--------------------+---------------------+ - | default | syncpoint | 453879870259200000 | 453879870545461257 | 2024-11-12 20:25:01 | - | default | syncpoint | 453879948902400000 | 453879949214351361 | 2024-11-12 20:30:01 | - | default | syncpoint | 453880027545600000 | 453880027751907329 | 2024-11-12 20:35:00 | - +------------------+------------+--------------------+--------------------+---------------------+ - ``` + 输出结果示例如下: - 表格中 primary_ts 和 secondary_ts 表示的是上游 TiDB 在 primary_ts 时刻的 snapshot 与下游 TiDB 在 secondary_ts 时刻的 snapshot 是相同的。 + ```sql + +------------------+------------+--------------------+--------------------+---------------------+ + | ticdc_cluster_id | changefeed | primary_ts | secondary_ts | created_at | + +------------------+------------+--------------------+--------------------+---------------------+ + | default | syncpoint | 453879870259200000 | 453879870545461257 | 2024-11-12 20:25:01 | + | default | syncpoint | 453879948902400000 | 453879949214351361 | 2024-11-12 20:30:01 | + | default | syncpoint | 453880027545600000 | 453880027751907329 | 2024-11-12 20:35:00 | + +------------------+------------+--------------------+--------------------+---------------------+ + ``` - 将最新的那条 primary_ts 转换成人类易读的时间格式: + 在输出结果中,每一行表示上游 TiDB 在 `primary_ts` 时刻的 snapshot 与下游 TiDB 在 `secondary_ts` 时刻的 snapshot 一致。 - ```sql - select TIDB_PARSE_TSO(453880027545600000); - ``` + 要查看同步进度,可以将最新的 `primary_ts` 转换为可读的时间格式: - 即可得到 primary_ts 对应的时间格式: + ```sql + SELECT TIDB_PARSE_TSO(453880027545600000); + ``` - ```sql - +------------------------------------+ - | TIDB_PARSE_TSO(453880027545600000) | - +------------------------------------+ - | 2024-11-12 20:35:00 | - +------------------------------------+ - ``` + 转换结果示例如下: - 当 primary_ts 所对应的时间超过了步骤 1 中刚获取的上游 TiDB 集群的 TSO 时,则说明 TiCDC 已同步完所有更新。 + ```sql + +------------------------------------+ + | TIDB_PARSE_TSO(453880027545600000) | + +------------------------------------+ + | 2024-11-12 20:35:00 | + +------------------------------------+ + ``` - > 注意: - > - > Syncpoint 信息每隔 [`sync-point-interval`](/ticdc/ticdc-upstream-downstream-check.md#启用-syncpoint) 时间才更新一次,想要及时查看当前同步进度建议通过方法一的 Checkpoint 信息来判断。 + 如果 `primary_ts` 对应的时间大于或等于步骤 1 中获取的上游 TiDB 集群的 TSO 时间戳,说明 TiCDC 已经将所有更新同步到下游。 ## TiCDC 的 `gc-ttl` 是什么?