From 4791d884ec68db2a5f627b79c55851b04f7d442c Mon Sep 17 00:00:00 2001 From: 3AceShowHand Date: Mon, 5 Aug 2024 14:46:39 +0800 Subject: [PATCH 01/12] add description about checksum v2 --- ticdc/ticdc-integrity-check.md | 78 +++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 21 deletions(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index a91ede7e88bb..6e6153c882f2 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -5,15 +5,7 @@ summary: 介绍 TiCDC 数据正确性校验功能的实现原理和使用方法 # TiCDC 单行数据正确性校验 -从 v7.1.0 开始,TiCDC 引入了单行数据正确性校验功能。该功能基于 Checksum 算法,校验一行数据从 TiDB 写入、通过 TiCDC 同步,到写入 Kafka 集群的过程中数据内容是否发生错误。TiCDC 数据正确性校验功能仅支持下游是 Kafka 的 Changefeed,目前支持 Avro 协议。 - -## 实现原理 - -在启用单行数据 Checksum 正确性校验功能后,TiDB 使用 CRC32 算法计算该行数据的 Checksum 值,并将其一并写入 TiKV。TiCDC 从 TiKV 读取数据,根据相同的算法重新计算 Checksum,如果该值与 TiDB 写入的值相同,则可以证明数据在 TiDB 至 TiCDC 的传输过程中是正确的。 - -TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取数据后,可以使用与 TiDB 相同的算法计算得到新的 Checksum,将此值与数据中携带的 Checksum 值进行比较,若二者一致,则可证明从 TiCDC 至 Kafka Consumer 的传输链路上的数据是正确的。 - -关于 Checksum 值的计算规则,请参考 [Checksum 计算规则](#checksum-计算规则)。 +从 v7.1.0 开始,TiCDC 引入了单行数据正确性校验功能。该功能基于 Checksum 算法,校验一行数据从 TiDB 写入、通过 TiCDC 同步,到写入 Kafka 集群的过程中数据内容是否发生错误。TiCDC 数据正确性校验功能仅支持下游是 Kafka 的 Changefeed,目前支持 Simple, Avro 协议。 ## 启用功能 @@ -35,18 +27,6 @@ TiCDC 数据正确性校验功能默认关闭,要使用该功能,请执行 corruption-handle-level = "warn" ``` -3. 当使用 Avro 作为数据编码格式时,你需要在 [`sink-uri`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) 中设置 [`enable-tidb-extension=true`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。同时,为了防止数值类型在网络传输过程中发生精度丢失,导致 Checksum 校验失败,还需要设置 [`avro-decimal-handling-mode=string`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) 和 [`avro-bigint-unsigned-handling-mode=string`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。下面是一个配置示例: - - ```shell - cdc cli changefeed create --server=http://127.0.0.1:8300 --changefeed-id="kafka-avro-checksum" --sink-uri="kafka://127.0.0.1:9092/topic-name?protocol=avro&enable-tidb-extension=true&avro-decimal-handling-mode=string&avro-bigint-unsigned-handling-mode=string" --schema-registry=http://127.0.0.1:8081 --config changefeed_config.toml - ``` - - 通过上述配置,Changefeed 会在每条写入 Kafka 的消息中携带该消息对应数据的 Checksum,你可以根据此 Checksum 的值进行数据一致性校验。 - - > **注意:** - > - > 对于已有 Changefeed,如果未设置 `avro-decimal-handling-mode` 和 `avro-bigint-unsigned-handling-mode`,开启 Checksum 校验功能时会引起 Schema 不兼容问题。可以通过修改 Schema Registry 的兼容性为 `NONE` 解决该问题。详情可参考 [Schema 兼容性](https://docs.confluent.io/platform/current/schema-registry/fundamentals/avro.html#no-compatibility-checking)。 - ## 关闭功能 TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功能后将其关闭,请执行以下步骤: @@ -67,6 +47,62 @@ TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功 上述配置仅对新创建的会话生效。在所有写入 TiDB 的客户端都完成数据库连接重建后,Changefeed 写入 Kafka 的消息中将不再携带该条消息对应数据的 Checksum 值。 +## Checksum V2 + +从 v8.4.0 开始,TiDB 和 TiCDC 引入了新的 Checksum 校验计算算法。当开启 Checksum 功能之后,默认使用该算法进行 Checksum 计算和校验。之前的版本集群升级到 v8.4.0 之后,TiDB 默认使用 Checksum V2 对新写入的数据计算 Checksum 并且写入到 TiKV。TiCDC 支持同时处理 V1 和 V2 两种 Checksum,对外不感知。 + +引入新算法的原因是,使用之前的 Checksum 计算算法,TiCDC 无法应对在 Add Column / Drop Column 之后执行的 Update / Delete 事件的 Old Value 部分的正确校验。 + +* 如果 Old Value 部分是由 Checksum V1 写入,并且有执行过 Add Column / Drop Column 语句,那么这部分的 Old Value Checksum,TiCDC 无法正确解析计算。 + + +7.5.0 -> 8.4.0 + +``` + +create table t (a int primary key, b int); + +insert into t values (1, 2); -> 7.5 write in, checksum v1 + +alter table t add column c int default 3; + +-- upgrade cluster -> v8.4.0 + +update t set b = 1 where a = 1; -> 7.4 write in + +old value -> v1 + +value -> v2 + +``` + + +2. 对于 checksum v1 的 old value 部分,做校验,如果不成功,那么打印 warn log,说明可能出现了 add column,drop column 的情况。 + +changefeed 不失败;不打日志 / 打日志,避免打太多。 + +## Checksum V1 实现原理 + +在启用单行数据 Checksum 正确性校验功能后,TiDB 使用 CRC32 算法计算该行数据的 Checksum 值,并将其一并写入 TiKV。TiCDC 从 TiKV 读取数据,根据相同的算法重新计算 Checksum,如果该值与 TiDB 写入的值相同,则可以证明数据在 TiDB 至 TiCDC 的传输过程中是正确的。 + +TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取数据后,可以使用与 TiDB 相同的算法计算得到新的 Checksum,将此值与数据中携带的 Checksum 值进行比较,若二者一致,则可证明从 TiCDC 至 Kafka Consumer 的传输链路上的数据是正确的。 + +关于 Checksum 值的计算规则,请参考 [Checksum 计算规则](#checksum-计算规则)。 + + +3. 当使用 Avro 作为数据编码格式时,你需要在 [`sink-uri`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) 中设置 [`enable-tidb-extension=true`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。同时,为了防止数值类型在网络传输过程中发生精度丢失,导致 Checksum 校验失败,还需要设置 [`avro-decimal-handling-mode=string`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) 和 [`avro-bigint-unsigned-handling-mode=string`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。下面是一个配置示例: + + ```shell + cdc cli changefeed create --server=http://127.0.0.1:8300 --changefeed-id="kafka-avro-checksum" --sink-uri="kafka://127.0.0.1:9092/topic-name?protocol=avro&enable-tidb-extension=true&avro-decimal-handling-mode=string&avro-bigint-unsigned-handling-mode=string" --schema-registry=http://127.0.0.1:8081 --config changefeed_config.toml + ``` + + 通过上述配置,Changefeed 会在每条写入 Kafka 的消息中携带该消息对应数据的 Checksum,你可以根据此 Checksum 的值进行数据一致性校验。 + + > **注意:** + > + > 对于已有 Changefeed,如果未设置 `avro-decimal-handling-mode` 和 `avro-bigint-unsigned-handling-mode`,开启 Checksum 校验功能时会引起 Schema 不兼容问题。可以通过修改 Schema Registry 的兼容性为 `NONE` 解决该问题。详情可参考 [Schema 兼容性](https://docs.confluent.io/platform/current/schema-registry/fundamentals/avro.html#no-compatibility-checking)。 + + ## Checksum 计算规则 Checksum 计算算法的伪代码如下: From b6d6d1a7736fa1fb78c00a6387f47fdc7a3e7cba Mon Sep 17 00:00:00 2001 From: 3AceShowHand Date: Mon, 5 Aug 2024 15:21:45 +0800 Subject: [PATCH 02/12] update docs --- ticdc/ticdc-integrity-check.md | 34 ++++------------------------------ 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index 6e6153c882f2..983f340fab5e 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -49,41 +49,15 @@ TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功 ## Checksum V2 -从 v8.4.0 开始,TiDB 和 TiCDC 引入了新的 Checksum 校验计算算法。当开启 Checksum 功能之后,默认使用该算法进行 Checksum 计算和校验。之前的版本集群升级到 v8.4.0 之后,TiDB 默认使用 Checksum V2 对新写入的数据计算 Checksum 并且写入到 TiKV。TiCDC 支持同时处理 V1 和 V2 两种 Checksum,对外不感知。 +从 v8.4.0 开始,TiDB 和 TiCDC 引入了新的 Checksum 校验计算算法。当开启 Checksum 功能之后,默认使用该算法进行 Checksum 计算和校验。 -引入新算法的原因是,使用之前的 Checksum 计算算法,TiCDC 无法应对在 Add Column / Drop Column 之后执行的 Update / Delete 事件的 Old Value 部分的正确校验。 +引入新算法的原因是,使用之前的 Checksum 计算算法,TiCDC 无法应对在 Add Column / Drop Column 之后执行的 Update / Delete 事件的 Old Value 部分的正确校验。Checksum V2 可以正确地应对该场景。 -* 如果 Old Value 部分是由 Checksum V1 写入,并且有执行过 Add Column / Drop Column 语句,那么这部分的 Old Value Checksum,TiCDC 无法正确解析计算。 - - -7.5.0 -> 8.4.0 - -``` - -create table t (a int primary key, b int); - -insert into t values (1, 2); -> 7.5 write in, checksum v1 - -alter table t add column c int default 3; - --- upgrade cluster -> v8.4.0 - -update t set b = 1 where a = 1; -> 7.4 write in - -old value -> v1 - -value -> v2 - -``` - - -2. 对于 checksum v1 的 old value 部分,做校验,如果不成功,那么打印 warn log,说明可能出现了 add column,drop column 的情况。 - -changefeed 不失败;不打日志 / 打日志,避免打太多。 +之前的版本集群升级到 v8.4.0 之后,TiDB 默认使用 Checksum V2 对新写入的数据计算 Checksum 并且写入到 TiKV。TiCDC 支持同时处理 V1 和 V2 两种 Checksum,对外不感知。该功能只影响 TiDB 和 TiCDC 内部的实现细节,下游 Kafka consumer 的 Checksum 计算校验方法无变化。 ## Checksum V1 实现原理 -在启用单行数据 Checksum 正确性校验功能后,TiDB 使用 CRC32 算法计算该行数据的 Checksum 值,并将其一并写入 TiKV。TiCDC 从 TiKV 读取数据,根据相同的算法重新计算 Checksum,如果该值与 TiDB 写入的值相同,则可以证明数据在 TiDB 至 TiCDC 的传输过程中是正确的。 +在 v8.4.0 版本之前,TiDB 和 TiCDC 采用 Checksum v1 进行 Checksum 计算和校验。在启用单行数据 Checksum 正确性校验功能后,TiDB 使用 CRC32 算法计算该行数据的 Checksum 值,并将其一并写入 TiKV。TiCDC 从 TiKV 读取数据,根据相同的算法重新计算 Checksum,如果该值与 TiDB 写入的值相同,则可以证明数据在 TiDB 至 TiCDC 的传输过程中是正确的。 TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取数据后,可以使用与 TiDB 相同的算法计算得到新的 Checksum,将此值与数据中携带的 Checksum 值进行比较,若二者一致,则可证明从 TiCDC 至 Kafka Consumer 的传输链路上的数据是正确的。 From 93c645fc10727b542efbe1fa4fb148764ef5f633 Mon Sep 17 00:00:00 2001 From: Ling Jin <7138436+3AceShowHand@users.noreply.github.com> Date: Sat, 14 Sep 2024 11:21:43 +0800 Subject: [PATCH 03/12] Update ticdc/ticdc-integrity-check.md Co-authored-by: Aolin --- ticdc/ticdc-integrity-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index 983f340fab5e..e7b002c82480 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -5,7 +5,7 @@ summary: 介绍 TiCDC 数据正确性校验功能的实现原理和使用方法 # TiCDC 单行数据正确性校验 -从 v7.1.0 开始,TiCDC 引入了单行数据正确性校验功能。该功能基于 Checksum 算法,校验一行数据从 TiDB 写入、通过 TiCDC 同步,到写入 Kafka 集群的过程中数据内容是否发生错误。TiCDC 数据正确性校验功能仅支持下游是 Kafka 的 Changefeed,目前支持 Simple, Avro 协议。 +从 v7.1.0 开始,TiCDC 引入了单行数据正确性校验功能。该功能基于 Checksum 算法,校验一行数据从 TiDB 写入、通过 TiCDC 同步,到写入 Kafka 集群的过程中数据内容是否发生错误。TiCDC 数据正确性校验功能仅支持下游是 Kafka 的 Changefeed,目前支持 Simple 和 Avro 协议。 ## 启用功能 From dba1c67fe9aadd790507a7b30771c48606967359 Mon Sep 17 00:00:00 2001 From: 3AceShowHand Date: Sat, 14 Sep 2024 11:45:23 +0800 Subject: [PATCH 04/12] add description about checksum v2 --- ticdc/ticdc-integrity-check.md | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index e7b002c82480..a3d0f6021931 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -27,6 +27,18 @@ TiCDC 数据正确性校验功能默认关闭,要使用该功能,请执行 corruption-handle-level = "warn" ``` +3. 当使用 Avro 作为数据编码格式时,你需要在 [`sink-uri`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) 中设置 [`enable-tidb-extension=true`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。同时,为了防止数值类型在网络传输过程中发生精度丢失,导致 Checksum 校验失败,还需要设置 [`avro-decimal-handling-mode=string`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) 和 [`avro-bigint-unsigned-handling-mode=string`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。下面是一个配置示例: + + ```shell + cdc cli changefeed create --server=http://127.0.0.1:8300 --changefeed-id="kafka-avro-checksum" --sink-uri="kafka://127.0.0.1:9092/topic-name?protocol=avro&enable-tidb-extension=true&avro-decimal-handling-mode=string&avro-bigint-unsigned-handling-mode=string" --schema-registry=http://127.0.0.1:8081 --config changefeed_config.toml + ``` + + 通过上述配置,Changefeed 会在每条写入 Kafka 的消息中携带该消息对应数据的 Checksum,你可以根据此 Checksum 的值进行数据一致性校验。 + + > **注意:** + > + > 对于已有 Changefeed,如果未设置 `avro-decimal-handling-mode` 和 `avro-bigint-unsigned-handling-mode`,开启 Checksum 校验功能时会引起 Schema 不兼容问题。可以通过修改 Schema Registry 的兼容性为 `NONE` 解决该问题。详情可参考 [Schema 兼容性](https://docs.confluent.io/platform/current/schema-registry/fundamentals/avro.html#no-compatibility-checking)。 + ## 关闭功能 TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功能后将其关闭,请执行以下步骤: @@ -63,20 +75,6 @@ TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取 关于 Checksum 值的计算规则,请参考 [Checksum 计算规则](#checksum-计算规则)。 - -3. 当使用 Avro 作为数据编码格式时,你需要在 [`sink-uri`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) 中设置 [`enable-tidb-extension=true`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。同时,为了防止数值类型在网络传输过程中发生精度丢失,导致 Checksum 校验失败,还需要设置 [`avro-decimal-handling-mode=string`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) 和 [`avro-bigint-unsigned-handling-mode=string`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。下面是一个配置示例: - - ```shell - cdc cli changefeed create --server=http://127.0.0.1:8300 --changefeed-id="kafka-avro-checksum" --sink-uri="kafka://127.0.0.1:9092/topic-name?protocol=avro&enable-tidb-extension=true&avro-decimal-handling-mode=string&avro-bigint-unsigned-handling-mode=string" --schema-registry=http://127.0.0.1:8081 --config changefeed_config.toml - ``` - - 通过上述配置,Changefeed 会在每条写入 Kafka 的消息中携带该消息对应数据的 Checksum,你可以根据此 Checksum 的值进行数据一致性校验。 - - > **注意:** - > - > 对于已有 Changefeed,如果未设置 `avro-decimal-handling-mode` 和 `avro-bigint-unsigned-handling-mode`,开启 Checksum 校验功能时会引起 Schema 不兼容问题。可以通过修改 Schema Registry 的兼容性为 `NONE` 解决该问题。详情可参考 [Schema 兼容性](https://docs.confluent.io/platform/current/schema-registry/fundamentals/avro.html#no-compatibility-checking)。 - - ## Checksum 计算规则 Checksum 计算算法的伪代码如下: From 11612db1f7023202a2a6e997e8157904ec6d3d5b Mon Sep 17 00:00:00 2001 From: Ling Jin <7138436+3AceShowHand@users.noreply.github.com> Date: Thu, 19 Sep 2024 18:50:23 +0800 Subject: [PATCH 05/12] Update ticdc/ticdc-integrity-check.md Co-authored-by: Aolin --- ticdc/ticdc-integrity-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index a3d0f6021931..218d6a122663 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -5,7 +5,7 @@ summary: 介绍 TiCDC 数据正确性校验功能的实现原理和使用方法 # TiCDC 单行数据正确性校验 -从 v7.1.0 开始,TiCDC 引入了单行数据正确性校验功能。该功能基于 Checksum 算法,校验一行数据从 TiDB 写入、通过 TiCDC 同步,到写入 Kafka 集群的过程中数据内容是否发生错误。TiCDC 数据正确性校验功能仅支持下游是 Kafka 的 Changefeed,目前支持 Simple 和 Avro 协议。 +从 v7.1.0 开始,TiCDC 引入了单行数据正确性校验功能。该功能基于 [Checksum 算法](#checksum-算法),校验一行数据从 TiDB 写入、通过 TiCDC 同步,到写入 Kafka 集群的过程中数据内容是否发生错误。TiCDC 数据正确性校验功能仅支持下游是 Kafka 的 Changefeed,目前支持 Simple 和 Avro 协议。关于 Checksum 值的计算规则,请参考 [Checksum 计算规则](#checksum-计算规则)。 ## 启用功能 From 6893e7d7f0cd001eed51c3a9163e765f88a4fb6e Mon Sep 17 00:00:00 2001 From: Ling Jin <7138436+3AceShowHand@users.noreply.github.com> Date: Thu, 19 Sep 2024 19:09:21 +0800 Subject: [PATCH 06/12] Update ticdc/ticdc-integrity-check.md Co-authored-by: Aolin --- ticdc/ticdc-integrity-check.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index 218d6a122663..41cae07e917c 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -59,21 +59,23 @@ TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功 上述配置仅对新创建的会话生效。在所有写入 TiDB 的客户端都完成数据库连接重建后,Changefeed 写入 Kafka 的消息中将不再携带该条消息对应数据的 Checksum 值。 -## Checksum V2 +## Checksum 算法 -从 v8.4.0 开始,TiDB 和 TiCDC 引入了新的 Checksum 校验计算算法。当开启 Checksum 功能之后,默认使用该算法进行 Checksum 计算和校验。 +TiCDC 支持两种 Checksum 算法:[Checksum V1](#checksum-v1) 和 [Checksum V2](#checksum-v2)。 -引入新算法的原因是,使用之前的 Checksum 计算算法,TiCDC 无法应对在 Add Column / Drop Column 之后执行的 Update / Delete 事件的 Old Value 部分的正确校验。Checksum V2 可以正确地应对该场景。 +### Checksum V1 -之前的版本集群升级到 v8.4.0 之后,TiDB 默认使用 Checksum V2 对新写入的数据计算 Checksum 并且写入到 TiKV。TiCDC 支持同时处理 V1 和 V2 两种 Checksum,对外不感知。该功能只影响 TiDB 和 TiCDC 内部的实现细节,下游 Kafka consumer 的 Checksum 计算校验方法无变化。 +在 v8.4.0 之前,TiDB 和 TiCDC 采用 Checksum v1 进行 Checksum 计算和校验。 -## Checksum V1 实现原理 - -在 v8.4.0 版本之前,TiDB 和 TiCDC 采用 Checksum v1 进行 Checksum 计算和校验。在启用单行数据 Checksum 正确性校验功能后,TiDB 使用 CRC32 算法计算该行数据的 Checksum 值,并将其一并写入 TiKV。TiCDC 从 TiKV 读取数据,根据相同的算法重新计算 Checksum,如果该值与 TiDB 写入的值相同,则可以证明数据在 TiDB 至 TiCDC 的传输过程中是正确的。 +在启用单行数据 Checksum 正确性校验功能后,TiDB 使用 CRC32 算法计算该行数据的 Checksum 值,并将其一并写入 TiKV。TiCDC 从 TiKV 读取数据,根据相同的算法重新计算 Checksum,如果该值与 TiDB 写入的值相同,则可以证明数据在 TiDB 至 TiCDC 的传输过程中是正确的。 TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取数据后,可以使用与 TiDB 相同的算法计算得到新的 Checksum,将此值与数据中携带的 Checksum 值进行比较,若二者一致,则可证明从 TiCDC 至 Kafka Consumer 的传输链路上的数据是正确的。 -关于 Checksum 值的计算规则,请参考 [Checksum 计算规则](#checksum-计算规则)。 +### Checksum V2 + +从 v8.4.0 开始,TiDB 和 TiCDC 引入 Checksum V2 算法,解决了 Checksum V1 在执行 Add Column 或 Drop Column 后无法正确校验 Update 或 Delete 事件中 Old Value 数据的问题。 + +对于 v8.4.0 及之后新创建的集群,或从之前版本升级到 v8.4.0 的集群,启用单行数据 Checksum 正确性校验功能后,TiDB 默认使用 Checksum V2 算法进行 Checksum 计算和校验。TiCDC 支持同时处理 V1 和 V2 两种 Checksum。该变更仅影响 TiDB 和 TiCDC 内部实现,不影响下游 Kafka consumer 的 Checksum 计算校验方法。 ## Checksum 计算规则 From f493e1a9f2c644d080d1427dbed5abfc8ee214c6 Mon Sep 17 00:00:00 2001 From: 3AceShowHand Date: Thu, 19 Sep 2024 19:52:11 +0800 Subject: [PATCH 07/12] remove redundant --- ticdc/ticdc-integrity-check.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index 41cae07e917c..84d4e2cb283b 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -61,8 +61,6 @@ TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功 ## Checksum 算法 -TiCDC 支持两种 Checksum 算法:[Checksum V1](#checksum-v1) 和 [Checksum V2](#checksum-v2)。 - ### Checksum V1 在 v8.4.0 之前,TiDB 和 TiCDC 采用 Checksum v1 进行 Checksum 计算和校验。 From eef79678400aad045924b3c116fdfcb2e2910102 Mon Sep 17 00:00:00 2001 From: Ling Jin <7138436+3AceShowHand@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:49:11 +0800 Subject: [PATCH 08/12] Update ticdc/ticdc-integrity-check.md Co-authored-by: Grace Cai --- ticdc/ticdc-integrity-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index 84d4e2cb283b..9749303d85a4 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -63,7 +63,7 @@ TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功 ### Checksum V1 -在 v8.4.0 之前,TiDB 和 TiCDC 采用 Checksum v1 进行 Checksum 计算和校验。 +在 v8.4.0 之前,TiDB 和 TiCDC 采用 Checksum v1 算法进行 Checksum 计算和校验。 在启用单行数据 Checksum 正确性校验功能后,TiDB 使用 CRC32 算法计算该行数据的 Checksum 值,并将其一并写入 TiKV。TiCDC 从 TiKV 读取数据,根据相同的算法重新计算 Checksum,如果该值与 TiDB 写入的值相同,则可以证明数据在 TiDB 至 TiCDC 的传输过程中是正确的。 From fdfda4a594d09d3f981175fcb78f330a5abf1751 Mon Sep 17 00:00:00 2001 From: Ling Jin <7138436+3AceShowHand@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:49:45 +0800 Subject: [PATCH 09/12] Update ticdc/ticdc-integrity-check.md Co-authored-by: Grace Cai --- ticdc/ticdc-integrity-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index 9749303d85a4..3ae4d9feb84b 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -65,7 +65,7 @@ TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功 在 v8.4.0 之前,TiDB 和 TiCDC 采用 Checksum v1 算法进行 Checksum 计算和校验。 -在启用单行数据 Checksum 正确性校验功能后,TiDB 使用 CRC32 算法计算该行数据的 Checksum 值,并将其一并写入 TiKV。TiCDC 从 TiKV 读取数据,根据相同的算法重新计算 Checksum,如果该值与 TiDB 写入的值相同,则可以证明数据在 TiDB 至 TiCDC 的传输过程中是正确的。 +在启用单行数据 Checksum 正确性校验功能后,TiDB 会使用 CRC32 算法计算该行数据的 Checksum 值,并将这个值与该行数据一并存储在 TiKV 中。随后,TiCDC 从 TiKV 读取这些数据,并使用相同的算法重新计算 Checksum,如果得到的 Checksum 值与 TiDB 写入的 Checksum 值相同,则表明数据在从 TiDB 到 TiCDC 的传输过程中是正确的。 TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取数据后,可以使用与 TiDB 相同的算法计算得到新的 Checksum,将此值与数据中携带的 Checksum 值进行比较,若二者一致,则可证明从 TiCDC 至 Kafka Consumer 的传输链路上的数据是正确的。 From 71b6dee1ea98ab2abefa7b751583de5f8c29ee61 Mon Sep 17 00:00:00 2001 From: Ling Jin <7138436+3AceShowHand@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:49:55 +0800 Subject: [PATCH 10/12] Update ticdc/ticdc-integrity-check.md Co-authored-by: Grace Cai --- ticdc/ticdc-integrity-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index 3ae4d9feb84b..6ac27bb60426 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -67,7 +67,7 @@ TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功 在启用单行数据 Checksum 正确性校验功能后,TiDB 会使用 CRC32 算法计算该行数据的 Checksum 值,并将这个值与该行数据一并存储在 TiKV 中。随后,TiCDC 从 TiKV 读取这些数据,并使用相同的算法重新计算 Checksum,如果得到的 Checksum 值与 TiDB 写入的 Checksum 值相同,则表明数据在从 TiDB 到 TiCDC 的传输过程中是正确的。 -TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取数据后,可以使用与 TiDB 相同的算法计算得到新的 Checksum,将此值与数据中携带的 Checksum 值进行比较,若二者一致,则可证明从 TiCDC 至 Kafka Consumer 的传输链路上的数据是正确的。 +TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取数据后,可以使用与 TiDB 相同的 CRC32 算法计算得到新的 Checksum,将此值与数据中携带的 Checksum 值进行比较,若二者一致,则表明从 TiCDC 到 Kafka Consumer 的传输链路上的数据是正确的。 ### Checksum V2 From d0628346f72cda504b98eac8da49f2a5d0ab49c3 Mon Sep 17 00:00:00 2001 From: Ling Jin <7138436+3AceShowHand@users.noreply.github.com> Date: Wed, 25 Sep 2024 16:50:03 +0800 Subject: [PATCH 11/12] Update ticdc/ticdc-integrity-check.md Co-authored-by: Grace Cai --- ticdc/ticdc-integrity-check.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index 6ac27bb60426..261f0b3e0d7f 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -71,7 +71,7 @@ TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取 ### Checksum V2 -从 v8.4.0 开始,TiDB 和 TiCDC 引入 Checksum V2 算法,解决了 Checksum V1 在执行 Add Column 或 Drop Column 后无法正确校验 Update 或 Delete 事件中 Old Value 数据的问题。 +从 v8.4.0 开始,TiDB 和 TiCDC 引入 Checksum V2 算法,解决了 Checksum V1 在执行 `ADD COLUMN` 或 `DROP COLUMN` 后无法正确校验 Update 或 Delete 事件中 Old Value 数据的问题。 对于 v8.4.0 及之后新创建的集群,或从之前版本升级到 v8.4.0 的集群,启用单行数据 Checksum 正确性校验功能后,TiDB 默认使用 Checksum V2 算法进行 Checksum 计算和校验。TiCDC 支持同时处理 V1 和 V2 两种 Checksum。该变更仅影响 TiDB 和 TiCDC 内部实现,不影响下游 Kafka consumer 的 Checksum 计算校验方法。 From 4ade2aea2b1af4e59b31524795099a61fcfb4b3a Mon Sep 17 00:00:00 2001 From: Aolin Date: Fri, 27 Sep 2024 16:17:08 +0800 Subject: [PATCH 12/12] Apply suggestions from code review Co-authored-by: Grace Cai --- ticdc/ticdc-integrity-check.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ticdc/ticdc-integrity-check.md b/ticdc/ticdc-integrity-check.md index 261f0b3e0d7f..a9f46ce2ce80 100644 --- a/ticdc/ticdc-integrity-check.md +++ b/ticdc/ticdc-integrity-check.md @@ -5,7 +5,7 @@ summary: 介绍 TiCDC 数据正确性校验功能的实现原理和使用方法 # TiCDC 单行数据正确性校验 -从 v7.1.0 开始,TiCDC 引入了单行数据正确性校验功能。该功能基于 [Checksum 算法](#checksum-算法),校验一行数据从 TiDB 写入、通过 TiCDC 同步,到写入 Kafka 集群的过程中数据内容是否发生错误。TiCDC 数据正确性校验功能仅支持下游是 Kafka 的 Changefeed,目前支持 Simple 和 Avro 协议。关于 Checksum 值的计算规则,请参考 [Checksum 计算规则](#checksum-计算规则)。 +从 v7.1.0 开始,TiCDC 引入了单行数据正确性校验功能。该功能基于 [Checksum 算法](#checksum-算法),校验一行数据从 TiDB 写入、通过 TiCDC 同步,到写入 Kafka 集群的过程中数据内容是否发生错误。目前,仅下游为 Kafka 且协议为 Simple 或 Avro 的 Changefeed 支持该功能。关于 Checksum 值的计算规则,请参考 [Checksum 计算规则](#checksum-计算规则)。 ## 启用功能 @@ -65,7 +65,7 @@ TiCDC 默认关闭单行数据的 Checksum 校验功能。若要在开启此功 在 v8.4.0 之前,TiDB 和 TiCDC 采用 Checksum v1 算法进行 Checksum 计算和校验。 -在启用单行数据 Checksum 正确性校验功能后,TiDB 会使用 CRC32 算法计算该行数据的 Checksum 值,并将这个值与该行数据一并存储在 TiKV 中。随后,TiCDC 从 TiKV 读取这些数据,并使用相同的算法重新计算 Checksum,如果得到的 Checksum 值与 TiDB 写入的 Checksum 值相同,则表明数据在从 TiDB 到 TiCDC 的传输过程中是正确的。 +在启用单行数据 Checksum 正确性校验功能后,TiDB 会使用 CRC32 算法计算每行数据的 Checksum 值,并将这个值与该行数据一并存储在 TiKV 中。随后,TiCDC 从 TiKV 读取这些数据,并使用相同的算法重新计算 Checksum,如果得到的 Checksum 值与 TiDB 写入的 Checksum 值相同,则表明数据在从 TiDB 到 TiCDC 的传输过程中是正确的。 TiCDC 将数据编码成特定格式并发送至 Kafka。Kafka Consumer 读取数据后,可以使用与 TiDB 相同的 CRC32 算法计算得到新的 Checksum,将此值与数据中携带的 Checksum 值进行比较,若二者一致,则表明从 TiCDC 到 Kafka Consumer 的传输链路上的数据是正确的。