actiontech/dtle

ColumnMap vs reversed job

c0494133d4 opened this issue · 4 comments

考虑两种反向机制

  • job finish & reversed job WaitOn
    • 以“创建反向任务”指代
    • #643
  • TwoWaySync
考虑
正向任务: (id, val1, val2) -> (id, val2) -- ColumnMapFrom = [id, val2]
反向任务: (id, val1, val2) <- (id, val2) -- ColumnMapFrom = ?

问题在于反向任务没有ColumnMap, 无法处理列数量不同的问题.

该案例中反向任务可以使用

ColumnMapFrom = [id, val2]
ColumnMapTo = [id, val2]

但要求val1 nullable, 或有默认值.

建立反向任务需要有自动/手动填写ColumnMap的机制.

关于“创建反向复制任务”

  • 正向和反向job不同时进行.
  • 反向任务创建后, 暂时挂起, 等待正向任务finish
  • 正向任务触发finish后, 记录正向任务源端Gtid为targetGtid, 此时正向任务目标端未必执行完毕
  • 反向任务等待正向任务执行到targetGtid后, 反向任务启动

适用于切换复制方向的场景.

关于TwoWaySync

  • 持续进行双向复制
  • 代替之前双job方案
    • 双job有潜在的无限循环问题

目前TwoWaySync会在反向任务使用正向任务的ColumnMap, 实为Bug.

方案1

对于反向任务, 交换 使用正向任务的ColumnMapFrom/To (参数行为见文档).

考虑下列几个场景, 都能满足使用意图

选择列

正向

  • src table (id, val1, val2)
  • dst table (id, val2)
  • ColumnMapFrom (id, val2)
  • ColumnMapTo (id, val2)

反向

  • from (id, val2)
  • to (id, val2)
  • 要求val1 可空或有默认值

选择列 + 重建自增id + 列重命名

正向

  • src table (id auto_increment, val1, val2)
  • dst table (id auto_increment, val1x, val2x)
  • from (val1, val2)
  • to (val1x, val2x)

reverse job

  • from (val1x, val2x)
  • to (val1, val2)

目标端多出列(有默认值)

正向

  • src table (id, val1)
  • dst table (id, val2 default 42, val1x)
  • from (id, val1)
  • to (id, val1x)

反向

  • from (id, val1x)
  • to (id, val1)

verified:
version:
9.9.9.9-master-6075dea

验证点:

  • reversed job
    -- 源端多出列
    -- 目标端多出列
    -- 列重命名
    -- 列乱序
  • TwoWaySync
    -- 源端多出列
    -- 目标端多出列
    -- 列重命名
    -- 列乱序