文档中心MogDBMogDB StackUqbar

文档:v3.4

支持的版本:

其他版本:

MVD 对比模式说明

MVD 对于表数据,支持多种对比模式,包括:

  1. 分区分片对比:按照分区边界进行数据分片并使用多进程并发对比,对应模式 "Partition"
  2. 动态分片对比:随机选取表中部分数据分片并使用多进程并发对比,对应模式 "Sample"
  3. 全量分片对比:属于动态分片的一种特殊情况,当采样比例为 1 的的分片并发对比,对应模式 "Sample"
  4. 手动分片对比:手动划分数据分片并使用多进程并发对比,对应模式 "Split"
  5. 部分数据对比:手动指定数据过滤条件并由单一进程完成对比,对应模式 "Partial"
  6. 常规数据对比:不满足以上对比模式的情况下,使用默认的对比模式 "Normal"
  7. 全量特征对比:与上述逐行对比模式不同,全量特征对比针对全表数据计算整体 Hash 值,通过一次比较识别表数据是否有差异

分区分片对比

背景

分区对比的主要思想,是考虑各个数据库中,分区表查询基本都会有相应的分区裁剪优化,且分区表一般数据量较大,单次查询对比会比较耗时。

通过对源和目标表的分区边界值进行查询与合并,可以得到整体的数据区域划分,即分片,其中每个分片均会落在源库和目标库中的某一个分区,使得分区裁剪策略可以生效。

而得到的多个分片,可以交由多个子进程并发进行数据对比,从而加快分区大表的数据对比效率。

限制

  1. 目前仅支持 RANGE 和 LIST 分区两种,且分区字段必须为单个字段。
  2. 必须双方均为同字段同类分区,才可使用分区分片对比

流程

分区分片对比的大概流程如下:

  1. 获取源和目标表的分区类型,分区字段,以及分区边界列表
  2. 判断是否满足分区分片对比要求,不满足则使用常规对比
  3. 合并双方分区边界,例如源库 [<1, <10, <100] 目标库 [<1, <50, <100],则合并后的分片为 [<1, <10, <50, <100]
  4. 根据合并后的边界范围,转换为源库与目标库的分片过滤条件
  5. 将不同的过滤条件交由不同的子进程进行分区数据对比
  6. 待到所有分区的数据均对比完成后,解析合并各个分片的对比结果
  7. 返回合并后的对比结果

动态分片对比

背景

动态对比的主要思想,是考虑各个数据库中,可能存在单表巨大的表,这些大表并未创建为分区表,常规对比的单次查询会比较耗时。

可通过对源和目标表的主键/唯一键数据进行分析,将其划分为若干个分区,并从中随机选择若干比例的分区,通过对比这些分区数据来检查表数据是否有差异,这是一种部分数据对比的方案。

而得到的多个分片,可以交由多个子进程并发进行数据对比,从而加快分区大表的数据对比效率。

参数

动态分片对比涉及两个参数:

  1. --sample-size: 动态采样阈值,只有源表或目标表大小超过这个阈值,才会启用动态分片对比
  2. --sample-pct: 动态分片对比时的采样比例 (范围:(0, 1]),最终转换为数据对比的百分比

限制

  1. 目前支持:单一字段的主键/唯一键表,或者具有较高唯一值的索引前导字段,字段类型为常见类型(不包括 BLOB,CLOB 等大对象类型)
  2. 必须双方表中均为同字段的主键/唯一键/高选择前导索引字段,才可使用动态分片对比
  3. 仅对表大小超过指定阈值的表,评估使用动态分片对比

流程

动态分片对比的大概流程如下:

  1. 获取源和目标表的结构信息:字段,约束等
  2. 判断是否满足动态分片对比要求,不满足则使用常规对比
  3. 分别获取双方的真实数据区间:通过 percent_rank() 或同类功能的分析函数,将主键/唯一键字段值划分为相对均匀的 100 份
  4. 根据采样比例,从 100 份分片中随机选择若干分片
  5. 考虑到在极限值情况下存在数据差异的可能性较大,会强制加入 0 和 99 号分片
  6. 合并所有已选择的分片,得到最终的分片列表,并转换为相关的数据过滤条件
  7. 将不同的过滤条件交由不同的子进程进行分区数据对比
  8. 待到所有分片的数据均对比完成后,解析合并各个分片的对比结果
  9. 返回合并后的对比结果

示例

假设场景: 表中 ID 列有 1-1000 这 1000 条记录,但还有两条异常极限值, -1000000 和 1000000,数据倾斜严重。

原始数据: -1000000, 1, 2, 3 ... 99, 100, 1000000

若根据最大值最小值均匀划分,则区间总跨度为 200w,划分到 100 个区间,每个区间的跨度为 2w:

最大最小值分片:< -980000, (980000, 960000], (960000, 940000] ... (0, 20000] ... (960000, 980000], (980000, 1000000]

此时,表中 1-1000 这 1000 条数据只落到一个区间,而动态随机采样取到的区间,大概率数据量均为 0.

而动态分片对比中,我们使用 percent_rank() 能获取到每一条数据的真实位置,根据其真实位置划分 100 个区间,即 percent_rank() 每隔 0.01 为一个区间:

真实值分片: <10, (10, 20], (20, 30] ... (980, 990], (980, 1000000]。

此时,两个极限值分布于首尾区间中,并不会影响其他区间的数据分布,这种分片方式在数据存在其他各类数据倾斜的场景下,均会有不错的分片效果。

全量分片对比

在动态分片对比过程中,若采样比例设置为 1,即对全量数据进行对比,此时分片字段限制为仅支持单一的主键字段。

手动分片对比

通过参数文件中的 DATA_FILTER 选项,可以手动对某些大表进行数据分片拆分,拆分后的分片也会交由不同的子进程并发执行对比。

具体选项的配置说明请参考:配置文件

部分数据对比

可以通过参数文件中的 DATA_FILTER 选项,或者命令行中的 --data-filter 选项,实现部分数据对比功能,即仅对比表中的某一部分用户比较关心的数据,通过缩小数据对比范围,加快数据对比效率。

具体选项的配置说明请参考:配置文件

常规数据对比

常规数据对比会在单一的进程中,分别查询源和目标表,并完成最终的数据对比。

全量特征对比

全量特征并非逐行对比模式,它是针对全表数据计算整体 Hash 值,并通过一次比较识别表数据是否有差异。

全量特征对比的效率远高于逐行对比模式,通过持续的 Hash 计算与一次性的比较,能将数据对比的耗时降低 50% ~ 70% 左右,实现快速异常表定位。

结合 -m/--mode 选项,可以使用先全量特征对比识别具体差异表,再逐行对比识别具体差异的行,实现快速且精准的数据差异对比。

注意:若参与对比的大部分表均有差异,则使用 -m a 模式对比的时间可能会超过逐行对比模式。

Copyright © 2011-2024 www.enmotech.com All rights reserved.