数据校验

功能介绍

数据校验工具 gs_datacheck,分为check服务和extract服务。check服务用于数据校验,extract服务用于数据抽取和规整。

原理介绍

全量校验:

在全量数据迁移完成后,由extract服务对MySQL源端和openGauss目标端数据通过JDBC方式进行数据抽取然后规整计算,并将计算后的中间数据推送到kafka中。最后由check服务提取kafka中的中间数据,构建默克尔树,通过默克尔树比对实现表数据校验且输出校验结果。

增量校验:

由debezium服务侦听源端MySQL数据库的增量数据,到指定topic。再由源端extract服务处理该topic增量数据,触发check增量校验。

环境准备

  • ARM+openEuler 20.03 或 X86+CentOS 5.7
  • JDK : JDK11+
  • MYSQL:要求5.7+版本
  • openGauss:openGauss3.0.0+

操作步骤

全量校验 gs_datacheck 依赖MySQL一键式迁移工具gs_rep_portal,可实现全量迁移的安装、启动、停止、卸载整个过程。

  • 下载gs_rep_portal

1. wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/tools/portal/PortalControl-5.0.0.tar.gz

解压,并进入portal对应目录

1. tar -zxvf PortalControl-5.0.0.tar.gz 2. cd portal - 修改gs_rep_portal配置文件

配置文件位于config目录内,数据校验相关的配置文件主要包含如下三个,相关参数含义简要说明如下:

  • application.yml

``` 1. #校验服务配置 修改application.yml文件 2. server: 3. port: 9000 # 为校验服务web端口,默认可不修改 4. logging: 5. config: # absolute_path/config/log4j2.xml 设置校验服务日志路径为config/log4j2.xml文件绝对路径 6. spring: 7. kafka: 8. bootstrap-servers: localhost:9092 # 为kafka工作地址,默认安装可不修改 9. data: 10. check: 11. data-path: ./check_result # 校验结果输出地址,默认配置可不修改 12. source-uri: http://127.0.0.1:9001 # server.port=9001 源端服务请求地址,默认配置可不修改 13. sink-uri: http://127.0.0.1:9002 # server.port=9002 目标端服务请求地址,默认配置可不修改 14. auto-delete-topic: 2 #配置是否自动删除Topic,0不删除,1校验全部完成后删除,2表校验完 15. 成后删除,默认值为2 16. increment-max-diff-count: 10 #增量校验表最大处理差异数,超过则暂停校验,差异降低则重新自动开启增量校验 17. core-pool-size: 10 #并发线程数设置,根据当前环境配置,可不修改,默认10,设置为0则系统自动分配 18. max-retry-times: 1000 # 心跳等最大尝试次数,默认1000 19. retry-interval-times: 10000 # 心跳、进度等最大间隔时间单位毫秒 默认10000

  1. 提供三种过滤规则,分别是表级、行级、列级。规则是以列表集合的形式配置的。

  2. rules:
  3. enable: false # 过滤规则开关:enable=true启用过滤规则,enable=false关闭过滤规则

  4. 表级过滤规则:通过配置黑白列表来过滤当前数据库表。

  5. 黑白列表配置是互斥的,即不能同时配置黑白列表,如果同时配置黑名单和白名单,则只有白名单才会生效。

  6. 黑名单和白名单配置规则必须遵守:

  7. 配置的name属性必须是white或black,否则规则无效,我们将自动过滤无效规则

  8. 如果配置的text属性不不符合正则表达式,或者为空,则该规则无效,将自动丢弃该规则

  9. 如果配置的TEXT重复,则规则项将自动筛选重复项。

  10. table:
  11. - name: white

  12. text: ^[a-zA-Z][a-zA-Z_]+$

  13. - name: black

  14. text: ^[a-zA-Z][a-zA-Z_]+$

  15. 行级过滤是通过添加规则来过滤所有表中需要验证的记录。

  16. 根据主键对表数据进行升序排序,并根据用户配置的抽取范围来进行数据抽取。

  17. 如果表规则和行规则同时配置,则行规则将根据表规则进行适配。

  18. 行级规则配置规则 例如:10,100

  19. 如果表名为table_name,主键为id,给当前表添加该行级过滤规则,则SQL等效为select * from table_name order by id asc limit 10 , 100

  20. 行配置规则必须遵守:

  21. 如果配置的文本与正则表达式^\d+(\,\d+)不匹配,则该规则无效,将自动筛选

  22. 如果配置的名称不不符合正则表达式,或者为空,则该规则无效,将自动筛选

  23. 如果配置的名称重复,则规则项将自动筛选重复的名称

  24. 行过滤规则配置

  25. row:
  26. - name: ^[a-zA-Z][a-zA-Z_]+$

  27. text: 10,100

  28. - name: ^[a-zA-Z][a-zA-Z_]+$

  29. text: 100,100

  30. - name: ^[a-zA-Z]+$a-zA-Z_]+$

  31. text: 100,300

  32. - name: ^[a-zA-Z]+$

  33. text: 10a,100

  34. - name: ^[a-zA-Z][a-zA-Z0-9_]+$

  35. text: 10,100

  36. 列级过滤是通过添加的规则来过滤当前表中需要校验的字段列。列级过滤分为两类:包含规则和排他规则。它们之间是互斥的。

  37. 包含规则只校验已配置的字段列表,排他规则不校验已配置字段列表。由于我们进行数据校验时,要求待校验表必须包含主键。因此,如果包含规则中没有配置主键字段,包含规则将自动添加主键列。此外,如果排它规则中配置了主键字段,则排它规则将自动删除主键列

  38. 列级规则配置

  39. name: 表名称 表名称不能为空,会自动过滤重复表配置

  40. text: field1,field2,...field

  41. attribute: include 表示包含规则 或者 exclude表示排它规则

  42. column:
  43. - name: t_test_1

  44. text: id,portal_id,func_id,name,width,last_upd_time

  45. attribute: include

  46. - name: t_test_2

  47. text: id,portal_id,func_id,name

  48. attribute: include

  49. - name: t_test_2

  50. text: name,height,last_upd_time,last_upd_time

  51. attribute: include

  52. - name: t_test_4

  53. text: name,height,last_upd_time

  54. attribute: exclude

    ```

  55. application-source.yml

``` 1. 源端服务配置 修改application-source.yml文件 2. server: 3. port: 9001 # 为源端抽取服务web端口,默认可不修改 4. logging: 5. config: # absolute_path/log4j2source.xml 设置校验服务日志路径为config/log4j2source.xml文件绝对路径

  1. spring:
  2. check:
  3. server-uri: http://127.0.0.1:9000 # 校验服务请求地址,默认配置可不修改
  4. max-core-pool-size: 10 # 并发线程数设置,可不修改,默认10,设置为0则系统自动分配
  5. max-retry-times: 1000 # 最大尝试次数
  6. retry-interval-times: 10000 # 最大间隔时间单位毫秒 默认10000

  7. extract:

  8. schema: test # 当前校验数据schema,mysql 数据库名称
  9. databaseType: MS # 当前校验数据库类型 mysql MS , opengauss OG
  10. query-dop: 8 # 表JDBC并行查询度,当表数据量超过百万时自动生效,默认为8,最大64
  11. debezium-enable: false # 是否开启增量配置
  12. debezium-topic: data_check_avro_inc_topic_w1 # debezium topic
  13. debezium-serializer: AvroSerializer # 序列化类型 StringSerializer or AvroSerializer
  14. debezium-avro-registry: http://localhost:8081 # avro schema 注册地址
  15. debezium-groupId: debezium-extract-group # debezium topic groupId
  16. debezium-time-period: 1 # 增量校验配置周期(单位分钟): 24 * 60 unit: Min
  17. debezium-num-period: 1000 # 增量校验数量周期,最小值100,默认1000

  18. kafka:

  19. bootstrap-servers: localhost:9092 # 为kafka工作地址,默认安装可不修改

  20. 数据源配置,工具默认采用druid数据源,用户可以自定义配置连接池参数,可根据当前校验数据库任务数量(表数量)进行调整

  21. datasource:
  22. druid:
  23. dataSourceOne:
  24. driver-class-name: com.mysql.cj.jdbc.Driver
  25. url: jdbc:mysql://127.0.0.1:3306/mysql?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true
  26. username:
  27. password: 'xxxx' #
  28. initialSize: 5 # 默认初始连接大小
  29. minIdle: 10 # 默认最小连接池数量
  30. maxActive: 20 # 最大连接数 maxActive 大于query-dop 一般为query-dop 的2-3倍 ```

  31. application-sink.yml

``` 1. # 目标端服务配置 修改application-sink.yml文件 2. server: 3. port: 9002 # 为目标端抽取服务web端口,默认可不修改 4. logging: 5. config: # absolute_path/log4j2sink.xml 设置校验服务日志路径为config/log4j2sink.xml文件绝对路径

  1. spring:
  2. check:
  3. server-uri: http://127.0.0.1:9000 # 校验服务请求地址,默认配置可不修改
  4. max-core-pool-size: 10 # 并发线程数设置,可不修改,默认10,设置为0则系统自动分配
  5. max-retry-times: 1000 # 最大尝试次数
  6. retry-interval-times: 10000 # 最大间隔时间单位毫秒 默认10000

  7. extract:

  8. schema: test # 当前校验数据schema,mysql 数据库名称
  9. databaseType: OG # 当前校验数据库类型 mysql MS , opengauss OG
  10. query-dop: 8 # 表JDBC并行查询度,当表数据量超过百万时自动生效,默认为8,最大64
  11. debezium-enable: false # debezium相关配置,在sink 端无需配置
  12. debezium-topic: data_check_avro_inc_topic_w1 # debezium topic
  13. debezium-serializer: AvroSerializer # 序列化类型 StringSerializer or AvroSerializer
  14. debezium-avro-registry: http://localhost:8081 # avro schema 注册地址
  15. debezium-groupId: debezium-extract-group # debezium topic groupId
  16. debezium-time-period: 1 # 增量校验配置周期(单位分钟): 24 * 60 unit: Min
  17. debezium-num-period: 1000 # 增量校验数量周期,最小值100,默认1000

  18. kafka:

  19. bootstrap-servers: localhost:9092 # 为kafka工作地址,默认安装可不修改

  20. 数据源配置,工具默认采用druid数据源,用户可以自定义配置连接池参数,可根据当前校验数据库任务数量(表数量)进行调整

  21. datasource:
  22. druid:
  23. dataSourceOne:
  24. driver-class-name: org.opengauss.Driver
  25. url: jdbc:opengauss://xxxxx:xxx/xxxx?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
  26. username:
  27. password: 'xxxx' #
  28. initialSize: 5 # 默认初始连接大小
  29. minIdle: 10 # 默认最小连接池数量
  30. maxActive: 20 # 最大连接数 maxActive 大于query-dop 一般为query-dop 的2-3倍 ```
  31. 安装

1. # 全量校验 2. sh gs_datacheck.sh install full workspace.id 3. # 增量校验 4. sh gs_datacheck.sh install incremental workspace.id

其中workspace.id表示迁移任务id,取值为一个整数,不同的id区分不同的校验任务,不同校验任务可并行启动。full 表示全量校验 ,incremental 表示增量校验 - 启动

1. # 全量校验 2. sh gs_datacheck.sh start full workspace.id 3. # 增量校验 4. sh gs_datacheck.sh start incremental workspace.id - 停止

1. # 全量校验 2. sh gs_datacheck.sh stop full workspace.id 3. # 增量校验 4. sh gs_datacheck.sh stop incremental workspace.id - 卸载

1. # 全量校验 2. sh gs_datacheck.sh uninstall full workspace.id 3. # 增量校验 4. sh gs_datacheck.sh uninstall incremental workspace.id

注意事项

  • JDK版本要求JDK11+
  • 当前版本仅支持对源端MySQL,目标端openGauss数据校验
  • 当前版本仅支持数据校验,不支持表对象校验
  • MYSQL需要5.7+版本
  • 当前版本不支持地理位置几何图形数据校验
  • 校验工具当前不支持校验中断(网络故障、kill进程等)自动恢复。
  • 数据校验行级过滤规则配置,只支持[offset,count]指定范围内抽取,不支持排除[offset,count]范围之内的数据过滤。
  • 行过滤规则抽取中间范围内数据(例如:[10,100]),如果源端在该范围之前的数据[0,10]发生删除操作,则会导致该表在指定范围内数据发生偏移,从而导致数据校验结果产生差异。此时需要扩大前置下标范围,以及增加相应的抽取数量。即[3,107]。
  • 当对主键的update语句没有通过增量迁移同步到目的端 或 主键同步发生错误的时候,进行数据校验,源端update后的新数据和目标端的旧数据是两条独立的数据,对校验差异进行处理时,会生成两条语句,即对旧数据进行删除,对新数据做插入。此场景会将一条主键update语句拆分为两条语句(insert+delete)来执行,且分解到两个事务中执行,无法保证原子性。
  • 增量校验不支持表级规则
  • 增量校验不支持行级规则
  • 增量校验目前只支持数据增删改校验,暂时不支持表结构(对象)校验(包括多表少表)