Logo
数据一致性校验算法

数据一致性校验算法 #

CRC32 一致性校验 #

类型 : CRC32_MATCH

可配置属性

说明:适用于 MySQL 及衍生数据库,仅限存量数据,需要停写,匹配所有记录的 CRC32。

使用示例

CHECK MIGRATION jobId BY TYPE (NAME='CRC32_MATCH');

CHECK RESHARDING jobId BY TYPE (NAME='CRC32_MATCH');

数据匹配一致性校验 #

类型 : DATA_MATCH

可配置属性 :

属性名称数据类型默认值说明
chunk-sizeint1000一次查询操作返回的最大记录数

说明:适用于所有数据库,仅限存量数据,需要停写,匹配所有记录的所有字段值。

使用示例 :

CHECK MIGRATION jobId BY TYPE (NAME='DATA_MATCH', PROPERTIES('chunk-size'='1000'));

CHECK RESHARDING jobId BY TYPE (NAME='DATA_MATCH', PROPERTIES('chunk-size'='1000'));

CRC32 一致性校验(商业版) #

类型 : SphereEx:BATCH_CRC32_MATCH, SphereEx:DATA_CONSISTENCY_CHECK_CRC32_MATCH

可配置属性:

无。

说明:适用于 MySQL 及衍生数据库,仅限存量数据。需要停写,批量匹配所有记录的 CRC32。

使用示例 :

CHECK MIGRATION jobId BY TYPE (NAME='SphereEx:BATCH_CRC32_MATCH');

CHECK RESHARDING jobId BY TYPE (NAME='SphereEx:BATCH_CRC32_MATCH');

实时一致性校验(商业版) #

实验性功能

类型 : SphereEx:DATA_DIFF

可配置属性 :

属性名称数据类型默认值说明
chunk-sizeint1000一次查询操作返回的最大记录数
diff-storage-typeString数据差异存储介质类型。取值:DATABASE(存储到某个 proxy 存储单元)
diff-storage-unit-nameString数据差异存储到哪个 proxy 存储单元,比如 ds_0。diff-storage-typeDATABASE时必填
diff-table-nameString数据差异存储到哪个表(需要确保该表名没有被占用)。diff-storage-typeDATABASE时必填
incremental-idle-seconds-thresholdint5增量数据不再活动的时间阈值(单位:秒),超过这个时间即可认为本轮次没有增量数据了。diff-storage-typeDATABASE时必填
inventory-ignoredboolfalse是否忽略存量数据校验。数据同步场景可以设置为true
query-logic-table-nameString校验哪个业务表。选填。开启后会自动关闭增量数据校验
query-conditionString校验业务表的条件。选填。前后必须以英文括号开头和结尾(),示例:(id>=1001 AND id<2000)

说明:适用于所有数据库,支持存量数据和增量数据,不需要停写,动态匹配所有记录的所有字段值,源端和目标端的数据差异会记录到配置的存储介质(一般是差异表),当最终3个轮次检测到没有增量数据且没有差异数据即为校验通过。

使用示例 1:

CHECK MIGRATION jobId BY TYPE (NAME='SphereEx:DATA_DIFF', PROPERTIES('diff-storage-type'='DATABASE','chunk-size'='1000','diff-storage-unit-name'='ds_2','diff-table-name'='spex_cnschk_1','incremental-idle-seconds-threshold'='999999999'));

CHECK RESHARDING jobId BY TYPE (NAME='SphereEx:DATA_DIFF', PROPERTIES('diff-storage-type'='DATABASE','chunk-size'='1000','diff-storage-unit-name'='ds_2','diff-table-name'='spex_cnschk_1','incremental-idle-seconds-threshold'='999999999'));

以上示例代表分别给数据迁移和扩缩容做实时一致性校验,存储到 proxy ds_2存储单元、spex_cnschk_1表。 增量数据不再活动的时间阈值999999999秒。这种配置下数据一致性校验作业不会主动退出,需要人工判断好退出实际并手动执行 DistSQL 操控。

使用示例 2:

CHECK MIGRATION jobId BY TYPE (NAME='SphereEx:DATA_DIFF', PROPERTIES('diff-storage-type'='DATABASE','chunk-size'='1000','diff-storage-unit-name'='ds_2','diff-table-name'='spex_cnschk_2','query-logic-table-name'='sbtest1','query-condition'='(id>=1 AND id<2000)'));

CHECK RESHARDING jobId BY TYPE (NAME='SphereEx:DATA_DIFF', PROPERTIES('diff-storage-type'='DATABASE','chunk-size'='1000','diff-storage-unit-name'='ds_2','diff-table-name'='spex_cnschk_2','query-logic-table-name'='sbtest1','query-condition'='(id>=1 AND id<2000)'));

以上示例代表分别给数据迁移和扩缩容做实时一致性校验,只校验sbtest1表,限定校验范围(id>=1 AND id<2000);差异存储到 proxy ds_2存储单元、spex_cnschk_2表。

优势:

  • 适用于所有数据库。当前在 MySQL 数据库较为成熟
  • 不需要停写

流量切换时机评估 #

1,开启增量一致性校验的情况下,流量切换时机评估如下:

  • 查询一致性校验进度,status达到FINISHED
  • 提前在测试环境验证好,停写后多长时间可以消化完差异表的多少记录数。到线上环境后,查看差异表(配置的diff-table-name)的记录数以及里面的记录是否会快速迭代,预估差异表的记录数是否会在可接受的时间内消化完

2,关闭增量一致性校验的情况下,流量切换时机评估如下:

  • 给每个业务表分别指定校验范围做校验,校验通过后不断迭代校验范围继续校验。基于校验的数据量以及耗时可以大致推算出停写后需要的耗时