mxshift

1 描述

mxshift 工具目前支持以下功能:

  • 全量迁移:以数据库为单位,实现从 Greenplum 5 / Greenplum 6/ MatrixDB 集群并行迁移数据到新的 MatrixDB 集群
  • 反向迁移:从 MatrixDB 到 Greenplum 5 / Greenplum 6 反向迁移
  • 增量迁移:通过 WHERE 条件实现增量数据迁移
  • 迁移复制表(Replicated Table)

2 使用

此部分主要介绍编写启动 mxshift 工具所需的配置文件 config.json 的使用方法、相关参数,以及 mxshift 命令行相关参数。

2.1 编写配置文件

使用 mxshift 工具需要先准备一个 JSON 文件 config.json,内容如下:

{
    "mode":            "normal",
    "verify":          true,
    "bothway":         true,
    "concurrency":     5,
    "compress_method": "lz4",
    "log_level":       "info",
    "gphome":          "/usr/local/greenplum-db-6.7.1",
    "src_host":        "sdw3",
    "src_db":          "testdb",
    "src_user":        "gpadmin",
    "src_password":    "xxxx",
    "src_port":        54322,
    "target_host":     "172.16.100.32",
    "target_db":       "destdb",
    "target_user":     "mxadmin",
    "target_password": "yyyy",
    "target_port":     5432,
    "where": {
        "enabled":  false,
        "global":   "txdate >= '2022-10-01' AND batchnum >= 100000000",
        "override": [
            {
                "schema": "test_schema_1",
                "name":   "table_001",
                "where":  "abc > 10"
            },
            {
                "schema": "test_schema_2",
                "name":   "another_table",
                "where":  "tag != 'aabbcc' AND ts > '2022-01-01'"
            }
        ]
    },
    "schema_list": [
        "test_schema_1",
        "test_schema_2"
    ],
    "exclude_schema_list": [
         "test_schema_5",
         "test_schema_8"
    ],
    "table_list": [
        {
            "schema": "test_schema_1",
            "name":   "table_001"
        },
        {
            "schema": "test_schema_2",
            "name":   "table_002"
        }
    ],
    "exclude_table_list":[
        {
            "schema": "test_schema_3",
            "name":   "table_003"
        }
    ]
}

以下是配置文件中的详细参数介绍:

参数名 描述
--mode 运行模式。允许下列几个值:normal,dryrun,fetch,motion。normal:默认值,指正常的数据迁移流程;dryrun:验证两边数据库的连通性,使用简单的数据库定义语言(DDL)进行验证操作,但不进行数据的读取和写入;fetch:在 dryrun 的基础上,读取源端的数据并发送到目标端数据节点(Segment),但直接丢弃,不进行处理,此选项用于验证源端读取效率和源端到目标端网络传输效率;motion:在 fetch 的基础上,在目标端数据库解析数据并交换到真正的目标 Segment,此选项用于进一步测试目标端数据库的数据交换速率
--verify 默认值为 false。校验数据迁移前后的行数是否匹配
--bothway mxshift 默认会先迁移最大的表,以达到最短时间内迁移完全体数据。如果设置 bothway 为 true,则 mxshift 会从最大的表和最小的表两端同时消费
--concurrency 最大并行迁移多少张表,默认值为 5,不超过 10
--compress_method 压缩方式:gzip / zstd / lz4 / 0,默认值为 0 ,即不压缩。目前开启任何压缩算法,都需要目标端的每个 Segment 的 mxadmin 用户可以免密 ssh 登陆到源端的每个 Segment,建议配置后用 dryrun 进行测试
--deduplicate(实验特性 如果前一次 mxshift 迁移没有完成就退出了,打开这个选项可以使 mxshift 再次执行时继续完成剩余的表,忽略已经迁移成功的表。这个功能目前尚在实验阶段
--log_level 默认值为 info,会打印正常的进度信息以及错误和警告信息。如果改为 debug,则会输出更多调试信息,仅用于开发和故障定位
--gphome 源端数据库的 GPHOME 绝对路径
--src_host 需要迁出数据的源 GP 集群 Master 节点主机名(Host)或 IP 地址
--src_db 需要迁出数据的源 GP 数据库
--src_user 需要迁出数据的源 GP 数据用户名
--src_password 需要迁出数据的源 GP 数据用户密码
--src_port 需要迁出数据的源 GP 数据库的端口号
--target_host 需要迁入数据的目标 MatrixDB 集群 master 节点 Host 或 IP 地址
--target_db 需要迁入数据的目标 MatrixDB 数据库
--target_user 需要迁入数据的目标 MatrixDB 数据库用户名
--target_password 需要迁入数据的目标 MatrixDB 数据库用户密码
--target_port 需要迁入数据的目标 MatrixDB 数据库的端口号
--table_list 需要迁移的源 GP 数据表的列表,如果是分区表需填写分区表,如果需要迁移整个 GP 数据库,只需要配置 src_db 参数,该 table_list 参数配置为空即可,mxshift 会从大到小开始迁移所有大小不为 0 的表
--exclude_table_list 需排除的表的模式(schema)和名称列表
--schema_list 需要迁出数据的目标 GP 数据库的 schema,优先级是如果 table_list 有配置具体的表,则只传输 table_list 中的表,如果没有,则检查 schema_list 中是否配置了 schema,如果配置了 schema,则传输该 schema 下的所有表,如果没有 schema,则传输 src_db 下的所有表
--exclude_schema_list 排除需要迁出数据的目标 GP 数据库的 schema,不对该 schema 下的表进行数据迁移,如果 schema_listexclude_schema_list 中配置了同名的 schema,那么该 schema 会被排除掉
--no-color 关闭颜色标签

如果你想要通过 WHERE 条件实现增量数据迁移,那么可能会使用到以下参数:

参数名 描述
--enabled 本功能默认关闭,启用需手动指认 true
--global SQL 的 WHERE 表达式,会对本次迁移的所有表尝试附加此条件表达式,如果表上不包含 WHERE 子句里的字段名导致 SQL 语句错误,则会自动跳过该表。为此,mxshift 会对这种无法迁移的表提示 SKIPPED
--override 是一个数组,可以包含多个 schema 名 + 表名 + WHERE 表达式的对象,会覆盖 global 的指定的 WHERE 表达式

2.2 命令行参数

mxshift 命令行参数如下:

参数名 描述
-c 或 --config_path mxshift 工具全局配置文件路径
-n 或 --no-color 打印非彩色日志
-v 或 --version mxshift 工具版本

3 示例

3.1 全量迁移

配置文件 config_path.json 示例如下:

{
    "mode": "normal",
    "verify": false,
    "bothway": true,
    "concurrency": 5,
    "compress_method": "",
    "log_level": "info",
    "gphome": "/usr/local/greenplum-db-6.7.1",
    "src_host": "sdw3",
    "src_db": "testdb",
    "src_user": "gpadmin",
    "src_password": "greenplum@2020",
    "src_port": 54322,
    "target_host": "172.16.100.32",
    "target_db": "ms",
    "target_user": "mxadmin",
    "target_password": "xxxx",
    "target_port": 5432,
    "schema_list":["test_schema_1", "test_schema_2"],
    "exclude_schema_list":["test_schema_5", "test_schema_8"],
    "table_list":[
        {
           "schema":"test_schema_1",
           "name":"table_001"
        },
        {
           "schema":"test_schema_2",
           "name":"table_002"
        }
    ],
    "exclude_table_list":[
        {
            "name":"test_schema_3",
            "schema":"table_003"
        }
    ]
}

准备好 JSON 文件后,执行如下命令以启动 mxshift 进行全量迁移。

mxshift -c config_path.json

3.2 增量迁移

通过 WHERE 条件实现增量数据迁移:

{
    "mode": "normal",
    "verify": false,
    "bothway": true,
    "concurrency": 5,
    "compress_method": "",
    "log_level": "info",
    "gphome": "/usr/local/greenplum-db-6.7.1",
    "src_host": "sdw3",
    "src_db": "testdb",
    "src_user": "gpadmin",
    "src_password": "greenplum@2020",
    "src_port": 54322,
    "target_host": "172.16.100.32",
    "target_db": "ms",
    "target_user": "mxadmin",
    "target_password": "xxxx",
    "target_port": 5432,
    "where": {
        "enabled": false,
        "global": "txdate >= '2022-10-01' AND batchnum >= 100000000",
        "override": [
            {
                "schema":"test_schema_1",
                "name":"table_001",
                "where": "abc > 10"
            }
        ]
    },
    "schema_list":["test_schema_1", "test_schema_2"],
    "exclude_schema_list":["test_schema_5", "test_schema_8"],
    "table_list":[
        ...
    ],
    "exclude_table_list":[
        ...
    ]
}

准备好 JSON 文件后,执行如下命令以启动 mxshift 进行增量迁移。

mxshift -c config_path.json

3.3 迁移复制表(Replicated Table)

  • 如果是迁移某个数据库,或者某个模式下的所有复制表,不需要在 config_path.json 里面做额外的配置,mxshfit 会自动判断哪些表是复制表,执行相应的迁移策略,防止重复迁移数据的问题发生。
  • 如果是在 table_list 中手动配置的某张表为复制表,则需要单独为该复制表声明一个 policyType 字段,值为 “r” 表示该表为复制表。
    "table_list":[
          {
                  "schema":"public",
                  "name":"tbl_test_replica",
                  "policyType":"r"
          }
      ],

    准备好 JSON 文件后,执行如下命令以启动 mxshift 进行复制表迁移。

    mxshift -c config_path.json

注意!
数据迁移思路及完整步骤介绍请见 数据迁移