Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ticdc: add detailed instructions for verifying if TiCDC has synchronized all updates to downstream (#19055) #19078

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions ticdc/ticdc-faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,111 @@ cdc cli changefeed list --server=http://127.0.0.1:8300
>
> 该功能在 TiCDC 4.0.3 版本引入。

## 上游停止更新后,如何判断 TiCDC 是否已将所有更新同步到下游?

在上游 TiDB 集群停止更新后,可以通过比较上游 TiDB 集群的最新 [TSO](/glossary.md#tso) 时间戳与 TiCDC 当前的同步进度判断同步是否完成。如果 TiCDC 的同步进度时间大于或等于上游 TiDB 集群的 TSO,则说明 TiCDC 已同步所有更新。具体操作步骤如下:

1. 获取上游 TiDB 集群的最新 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;
```

输出结果示例如下:

```sql
+------------------------------------+
| TIDB_PARSE_TSO(TIDB_CURRENT_TSO()) |
+------------------------------------+
| 2024-11-12 20:35:34.848000 |
+------------------------------------+
```

2. 获取 TiCDC 当前的同步进度。

你可以通过以下两种方法之一检查当前的同步进度:

* **方法一**:查询同步任务的 Checkpoint(推荐)

使用 [TiCDC 命令行工具](/ticdc/ticdc-manage-changefeed.md) `cdc cli` 查看所有同步任务的 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
}
}
]
```

在输出结果中,`"checkpoint": "2024-11-12 20:36:01.447"` 表示 TiCDC 当前的同步进度为 `2024-11-12 20:36:01.447`,即所有在该时间之前的上游 TiDB 变更已同步完成。如果该时间戳大于或等于步骤 1 中获取的上游 TiDB TSO 时间,则表示所有更新已经同步到下游。

* **方法二**:查询下游 TiDB 的 Syncpoint 信息

如果下游是 TiDB,并且已启用 [TiCDC Syncpoint 功能](/ticdc/ticdc-upstream-downstream-check.md),可以通过查询下游 TiDB 的 Syncpoint 信息获取同步进度。

> **注意:**
>
> Syncpoint 信息的更新间隔由 [`sync-point-interval`](/ticdc/ticdc-upstream-downstream-check.md#启用-syncpoint) 参数控制。如需获取最新同步进度,建议使用方法一。

在下游 TiDB 中执行以下 SQL 语句,获取上游 TSO (`primary_ts`) 和下游 TSO (`secondary_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 |
+------------------+------------+--------------------+--------------------+---------------------+
```

在输出结果中,每一行表示上游 TiDB 在 `primary_ts` 时刻的 snapshot 与下游 TiDB 在 `secondary_ts` 时刻的 snapshot 一致。

要查看同步进度,可以将最新的 `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 已经将所有更新同步到下游。

## TiCDC 的 `gc-ttl` 是什么?

从 TiDB v4.0.0-rc.1 版本起,PD 支持外部服务设置服务级别 GC safepoint。任何一个服务可以注册更新自己服务的 GC safepoint。PD 会保证任何晚于该 GC safepoint 的 KV 数据不会在 TiKV 中被 GC 清理掉。
Expand Down