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

cdc: add a description about checksum compatibility #19220

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open
Changes from 7 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
23 changes: 19 additions & 4 deletions ticdc/ticdc-integrity-check.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,23 @@ TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功

## Checksum 算法

Checksum 算法演进,只影响 TiCDC 内部对 Checksum 的校验过程,不影响下游 Kafka Consumer 校验 Checksum 的规则。
3AceShowHand marked this conversation as resolved.
Show resolved Hide resolved

### Checksum V1

在 v8.4.0 之前,TiDB 和 TiCDC 采用 Checksum v1 算法进行 Checksum 计算和校验。
从 v7.1.0 到 v8.2.0,TiDB 和 TiCDC 采用 Checksum v1 算法进行 Checksum 计算和校验。
3AceShowHand marked this conversation as resolved.
Show resolved Hide resolved

在启用单行数据 Checksum 正确性校验功能后,TiDB 会使用 CRC32 算法计算每行数据的 Checksum 值,并将这个值与该行数据一并存储在 TiKV 中。随后,TiCDC 从 TiKV 读取这些数据,并使用相同的算法重新计算 Checksum,如果得到的 Checksum 值与 TiDB 写入的 Checksum 值相同,则表明数据在从 TiDB 到 TiCDC 的传输过程中是正确的。

TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取数据后,可以使用与 TiDB 相同的 CRC32 算法计算得到新的 Checksum,将此值与数据中携带的 Checksum 值进行比较,若二者一致,则表明从 TiCDC 到 Kafka Consumer 的传输链路上的数据是正确的。

### Checksum V2

从 v8.4.0 开始,TiDB 和 TiCDC 引入 Checksum V2 算法,解决了 Checksum V1 在执行 `ADD COLUMN` 或 `DROP COLUMN` 后无法正确校验 Update 或 Delete 事件中 Old Value 数据的问题。
在 v8.3.0 版本 TiDB 和 TiCDC 使用 Checksum V2 算法,解决了 Checksum V1 在执行 `ADD COLUMN` 或 `DROP COLUMN` 后无法正确校验 Update 或 Delete 事件中 Old Value 数据的问题。Checksum V2 算法基于 Key-Value 对计算 Bytes 级别的 Checksum 值。Key 由表 ID 和行 ID 两部分组成。
3AceShowHand marked this conversation as resolved.
Show resolved Hide resolved

### Checksum V3

对于 v8.4.0 及之后新创建的集群,或从之前版本升级到 v8.4.0 的集群,启用单行数据 Checksum 正确性校验功能后,TiDB 默认使用 Checksum V2 算法进行 Checksum 计算和校验。TiCDC 支持同时处理 V1 和 V2 两种 Checksum。该变更仅影响 TiDB 和 TiCDC 内部实现,不影响下游 Kafka consumer 的 Checksum 计算校验方法
v8.4.0 版本之后,TiDB 和 TiCDC 使用 Checksum V3 算法。该算法解决了 Checksum V2 算法中,由于包含 Table ID 信息,在 BR 恢复场景下由于改写 Table ID 导致的 Old Value 部分 Checksum 无法被校验的问题。Checksum V3 基于表 ID 和 Value 部分计算 Bytes 级别的 Checksum
3AceShowHand marked this conversation as resolved.
Show resolved Hide resolved

## Checksum 计算规则

Expand Down Expand Up @@ -109,4 +113,15 @@ fn checksum(columns) {
> **注意:**
>
> - 开启 Checksum 校验功能后,DECIMAL 和 UNSIGNED BIGINT 类型的数据会被转换为字符串类型。因此在下游消费者代码中需要将其转换为对应的数值类型,然后进行 Checksum 相关计算。
> - Delete 事件只含有 Handle Key 列的内容,而 Checksum 是基于所有列计算的,所以 Delete 事件不参与到 Checksum 的校验中。
> - Delete 事件只含有 Handle Key 列的内容,而 Checksum 是基于所有列计算的,所以 Delete 事件不参与到 Checksum 的校验中。

## 兼容性问题

### 升级场景兼容性

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
升级集群时,需要先升级 TiCDC,后升级 TiDB。升级过程中,TiCDC 处于高版本,TiDB 处于低版本时,支持处理由低版本 TiDB 写入的 Checksum。升级完成后,应该保证 TiDB 和 TiCDC 使用相同的版本的 Checksum 校验算法
在升级集群时,需要首先升级 TiCDC,然后升级 TiDB。
在升级过程中,如果 TiCDC 版本高于 TiDB 版本时,TiCDC 可以处理由较低版本 TiDB 写入的 Checksum 数据。
升级完成后,为确保数据一致性,需要确保 TiDB 和 TiCDC 使用相同版本的 Checksum 校验算法。否则,可能会导致校验不一致或数据丢失的问题。

用户如何查看 TiDB 和 TiCDC 的 Checksum 校验算法版本,如果有对应的文档请添加对应链接

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

用户不需要关心 checksum 校验算法的版本,这是 tidb 和 ticdc 内部校验机制。具体对应的版本,在文中有提及。

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

升级完成后,应该保证 TiDB 和 TiCDC 使用相同的版本的 Checksum 校验算法。

@3AceShowHand 如果用户不需要关心,那这里“应该保证 TiDB 和 TiCDC 使用相同的版本的 Checksum 校验算法”主语是谁呢

升级集群时,需要先升级 TiCDC,后升级 TiDB。升级过程中,TiCDC 处于高版本,TiDB 处于低版本时,支持处理由低版本 TiDB 写入的 Checksum。升级完成后,应该保证 TiDB 和 TiCDC 使用相同的版本的 Checksum 校验算法。

### BR 恢复场景兼容性
Oreoxmt marked this conversation as resolved.
Show resolved Hide resolved
v8.3.0 和 v8.4.0 的 Checksum 功能有如下兼容性问题:

3AceShowHand marked this conversation as resolved.
Show resolved Hide resolved
使用 BR 工具备份 v8.3.0 的数据,恢复到 v8.3.0 及更高版本的 TiDB 集群。在 Changefeed 同步过程中如果遇到了 Update 和 Delete 事件,在 TiCDC 内部可能发生校验 Old Value 的 Checksum 失败的情况。具体原因是,在 BR 恢复数据的时候,如果发现当前被恢复的表的 ID 已经在下游目标集群上被占用,就会改写表 ID,但是没有改写 Checksum,从而导致 Changefeed 内部校验数据的时候使用的表 ID 和数据在老集群上被写入时候的表 ID 不一致,最终导致校验失败。如果存在上述使用场景,需要关闭 changefeed 的 checksum 校验功能。
Loading