mxshift

В этом документе описывается инструмент миграции данных mxshift.

1 Описание

Инструмент mxshift в настоящее время поддерживает следующие функции:

  • Полную миграцию: параллельную миграцию DDL таблиц и данных из кластера Greenplum 5 / Greenplum 6 / YMatrix в новый кластер YMatrix на уровне базы данных. Только режим полной миграции поддерживает перенос DDL.
  • Обратную миграцию: миграцию данных из YMatrix обратно в Greenplum 5 / Greenplum 6.
  • Инкрементальную миграцию: выполнение инкрементальной миграции данных с использованием условий WHERE.
  • Поддерживаемые стратегии распределения данных: хэш-распределение, случайное распределение, реплицированные таблицы (REPLICATED) и таблицы только для Master.

2 Параметры

В этом разделе описываются параметры инструмента mxshift.

2.1 Файл конфигурации

Для использования mxshift необходимо подготовить файл конфигурации в формате TOML. Ниже приведены подробные описания параметров:

Параметр Описание Обязательный
[database.source] категория
--db-host Имя хоста или IP-адрес узла Master исходного кластера. Исходный кластер — это кластер базы данных, из которого выполняется миграция данных. Да
--db-port Номер порта Master-узла исходной базы данных. Да
--db-database Имя исходной базы данных. Да
--db-user Имя пользователя исходной базы данных. Да
--db-password Пароль пользователя исходной базы данных. Да
--install-dir Каталог установки базы данных (доступно в версиях v5.0.1 и выше; в v5.0.0 требуется конфигурация gphome). Да
--hostname-to-ip Сопоставление имён хостов с IP-адресами. Используйте этот параметр, если исходный и целевой кластеры используют одинаковые имена хостов, чтобы обеспечить корректную маршрутизацию (поддерживается начиная с v5.0.1). Нет
[database.target] категория
--db-host Имя хоста или IP-адрес узла Master целевого кластера. Целевой кластер — это кластер, в который мигрируются данные. Да
--db-port Номер порта Master-узла целевой базы данных. Да
--db-database Имя целевой базы данных. Да
--db-user Имя пользователя целевой базы данных. Да
--db-password Пароль пользователя целевой базы данных. Да
[scope] категория
--mode Режим работы. Допустимые значения: normal, dryrun, fetch, motion.
normal: значение по умолчанию, указывает на обычную миграцию данных;
dryrun: проверяет подключение между исходной и целевой базами данных с помощью простых операций DDL без чтения или записи реальных данных;
fetch: на основе dryrun читает данные из источника и отправляет их на Segments цели, но отбрасывает — используется для тестирования производительности чтения из источника и пропускной способности сети;
motion: расширяет fetch, разбирая данные на стороне цели и перераспределяя их на правильные Segments — используется для тестирования скорости перераспределения данных на стороне цели.
Нет
--compress-method Метод сжатия: gzip / zstd / lz4 / 0. По умолчанию 0 (без сжатия).
При включении любого сжатия пользователь mxadmin на каждом целевом Segment должен иметь возможность подключаться по SSH без пароля к каждому исходному Segment. Рекомендуется протестировать после настройки с помощью режима dryrun.
Нет
--gphome Абсолютный путь к GPHOME на исходной базе данных (доступно в v5.0.0; в v5.0.1 и выше используйте install-dir). Да
--table-list Список схем и имён таблиц источника. Для секционированных таблиц укажите родительскую секционированную таблицу. Чтобы выполнить миграцию всей базы данных, оставьте пустым — mxshift выполнит миграцию всех таблиц ненулевого размера в порядке убывания их размера. Нет
--exclude-table-list Список схем и имён таблиц, которые следует исключить из миграции. Нет
--schema-list Схемы исходной базы данных. Приоритет: если table-list содержит список таблиц, мигрируются только они; иначе, если table-list содержит схемы, мигрируются все таблицы в этих схемах; иначе мигрируются все таблицы из schema-list` `[database.source]. Нет
--exclude-schema-list Схемы, которые следует исключить из миграции. Таблицы в этих схемах не будут мигрированы. Если схема присутствует одновременно в db-database и schema-list, она будет исключена. Нет
[log] категория
--log-level По умолчанию установлено значение exclude-schema-list, выводятся сообщения о ходе выполнения, ошибках и предупреждениях. Установите info, чтобы получить дополнительный отладочный вывод (полезно при разработке и диагностике). Нет
--no-color По умолчанию debug. Установите false, чтобы отключить цветной вывод логов. Нет
[controller] категория
--both-way По умолчанию true. Миграция начинается с самой большой таблицы, чтобы завершить полную миграцию как можно быстрее. Если установлено значение false, миграция выполняется одновременно от самой большой и самой маленькой таблиц. Нет
--concurrency Количество таблиц, мигрируемых параллельно. По умолчанию 5, максимум 10. Нет
[transfer] категория
--verify Проверка согласованности количества строк до и после миграции. По умолчанию both-way. Нет
--with-index Выполнять ли миграцию индексов. По умолчанию true (отключено). При отключении mxshift сохраняет SQL-инструкции для создания индексов в файле в текущем каталоге выполнения для последующего ручного создания. Примечание: для таблиц, созданных с использованием движка хранения MARS2, индексы должны быть созданы, чтобы таблица работала корректно. Поэтому при миграции DDL для таблиц MARS2 индексы мигрируются автоматически независимо от этого параметра. Нет
[ddl] категория
--enabled Выполнять ли миграцию DDL таблиц. По умолчанию false. При включении mxshift мигрирует DDL на уровне базы данных перед миграцией данных.
Поддерживаемые версии миграции DDL:
Greenplum 6 → YMatrix 4 / YMatrix 5;
YMatrix 4 → YMatrix 4 / YMatrix 5;
YMatrix 5 → YMatrix 5.
Нет
--only-ddl Мигрировать только DDL. По умолчанию false. Если установлено значение false, после миграции DDL следует миграция данных. Если установлено значение false, инструмент завершается после миграции DDL без миграции данных таблиц. Нет
--skip-resource-queue-and-group Пропускать ли очереди ресурсов (группы) при миграции DDL. При значении false группы и очереди ресурсов пропускаются. Нет
--skip-table-space Пропускать ли табличные пространства при миграции DDL. При значении true табличные пространства пропускаются. Нет

Для выполнения инкрементальной миграции данных с использованием условий WHERE используйте следующие параметры:

Категория Подкатегория Подпараметр Подподкатегория Подподпараметр Описание Обязательный
[transfer] категория [transfer.table-data-where-sql] категория --enabled Если установлено значение ``skip-resource-queue-and-group=true``, фильтрует данные источника с помощью условия WHERE, мигрируя только соответствующие строки, что позволяет выполнять инкрементальную миграцию. Эта функция по умолчанию отключена и должна быть вручную активирована через ``skip-table-space=true``. Нет
--global Задаёт глобальное SQL-выражение ``true``, применяемое ко всем таблицам миграции. Если таблица не содержит ключевое слово ``true``, ``WHERE`` автоматически пропускает эту таблицу. Нет
[[transfer.table-data-where-sql.override]] категория --where Табличное условие WHERE. Имеет приоритет над глобальным условием WHERE. Применяется фильтрация на уровне отдельной таблицы. Нет
[transfer.table-data-where-sql.override.table] категория --schema Имя схемы таблицы, которую нужно мигрировать. Нет
--name Имя таблицы, которую нужно мигрировать. Нет

Примеры использования см. ниже.

2.2 Параметры командной строки

Параметры командной строки для mxshift:

Параметр Описание
--config Выводит содержимое файла конфигурации по умолчанию
-a или --all Запускает миграцию без подтверждения. По умолчанию пропускает уже завершённые и пустые таблицы
-c или --config-path Путь к глобальному файлу конфигурации для mxshift
-v или --version Отображает версию инструмента mxshift
-l или --show-progress Показывает ход последней миграции. Если миграция не выполняется, отображает результат последнего запуска. Если миграция активна, показывает текущий прогресс. Значения STATUS:
Not start: Не входит в область миграции;
Skip: Пропущено (уже перемещено или пустая таблица);
Processing/Interrupted: Выполняется или прервано;
Complete: Миграция завершена;
Failed: Миграция завершилась с ошибкой
-R или --redo Повторно мигрирует таблицы, даже если они были ранее перемещены (перед повторной миграцией очищает существующие данные в целевой таблице)

3 Примеры

Полный шаблон файла называется WHERE. Вы можете сгенерировать этот шаблон, запустив SKIPPED. Запустите config.toml, чтобы начать редактирование, затем скопируйте полное содержимое в свой файл и измените нужные параметры. Также вы можете использовать один из примеров шаблонов ниже в зависимости от вашей задачи.

`mxshift --config`` [database] [database.source]

Имя базы данных

    db-database= "testdb"
    ## Имя хоста Master-узла базы данных
    db-host="sdw3"
    ## Пароль базы данных
    db-password="xxxx"
    ## Порт Master-узла базы данных
    db-port=54322
    ## Имя пользователя базы данных
    db-user="mxadmin"
    ## Каталог установки базы данных(v5.0.1 и выше)
    # install-dir="/usr/local/greenplum-db-6.7.1"

[database.target]
    ## Имя базы данных
    db-database="destdb"
    ## Имя хоста Master-узла базы данных
    db-host="172.16.100.32"
    ## Пароль базы данных
    db-password="yyyy"
    ## Порт Master-узла базы данных
    db-port=5432
    ## Имя пользователя базы данных
    db-user="mxadmin"

[scope] compress_method="lz4" gphome mode="normal" [[scope.table-list]] schema="test_schema_1" name="table_001" [[scope.table-list]] schema="test_schema_2" name="table_002"
[[scope.exclude-table-list]] schema="test_schema_3" name="table_003" schema-list=["test_schema_1", "test_schema_2"] exclude-schema-list=["test_schema_5", "test_schema_8"]

[log] log-level="info"

Вывод логов без цвета.

no-color=false

[controller] both-way=true concurrency=5

[transfer] verify=true

with-index=true

[transfer.table-data-where-sql] enabled=false global="txdate >= '2022-10-01' AND batchnum >= 100000000" [[transfer.table-data-where-sql.override]] where="abc > 10" [transfer.table-data-where-sql.override.table] schema="test_schema_1" name="table_001" [[transfer.table-data-where-sql.override]] where="tag != 'aabbcc' AND ts > '2022-01-01'" [transfer.table-data-where-sql.override.table] schema="test_schema_2" name="another_table"

[ddl] enabled=true only-ddl=false

Во время передачи DDL, пропускать ли передачу очередей или групп ресурсов, по умолчанию true.

skip-resource-queue-and-group=true

Во время передачи DDL, пропускать ли передачу табличных пространств, по умолчанию true.

skip-table-space=true [[ddl.replace]]

Применимо только при миграции из Greenplum в YMatrix

            category="role"
            [[ddl.replace.pairs]]
                    old="gpadmin"
                    new="mxadmin"      

`vim config.toml``

После подготовки TOML-файла выполните следующую команду для запуска миграции:

$ mxshift -c config_path.toml

3.1 Полная миграция

[database]
        [database.source]
        ## Name of database
        db-database= "testdb"
        ## Hostname of database master
        db-host="sdw3"
        ## password of database
        db-password="xxxx"
        ## Port of database master
        db-port=54322
        ## user name of database
        db-user="gpadmin"
        ## The installation directory of database(v5.0.1 and above)
        # install-dir="/usr/local/greenplum-db-6.7.1"

        [database.target]
        ## Name of database
        db-database="destdb"
        ## Hostname of database master
        db-host="172.16.100.32"
        ## password of database
        db-password="yyyy"
        ## Port of database master
        db-port=5432
        ## user name of database
        db-user="mxadmin"

[scope]
## The compress method for transferring data, methods restricted to 0/gzip/lz4/zstd        
compress-method="lz4"
## The installation directory of database(v5.0.0)
# gphome="/usr/local/greenplum-db-6.7.1"
## mode for transferring data from source to target database, and value restricted to normal/dryrun/fetch/motion.
##dryrun for only executing ddl, not transferring data
##fetch for fetching data from source and abandon
##motion for fetching data from source, redistributing and finally abandon
mode="normal"
## Sql for select segment information from source database        
# select-source-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
## Sql for select segment information from target database
# select-target-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
        [[scope.table-list]]
                schema="test_schema_1"
                name="table_001"
        [[scope.table-list]]
                schema="test_schema_2"
                name="table_002"
        [[scope.exclude-table-list]]
                schema="test_schema_3"
                name="table_003"       
schema-list=["test_schema_1", "test_schema_2"]
exclude-schema-list=["test_schema_5", "test_schema_8"]

[log]
## The log level, value restricted to: debug/verbose/info.
log-level="info"
## Print log without color.
# no-color=false

[controller]
## By default, transfer work will start from the largest table. If set 'bothway' it will start from both the largest and the smallest table
both-way=true
## The number of table transferred at the same time
concurrency=5

[transfer]
## Verity the number of record of every table
verify=true
with-index=true

[ddl]
enabled=true
only-ddl=false
## During the DDL transfer, whether to skip the transfer of resource queue or group, by default, it is true.
# skip-resource-queue-and-group=true
## During the DDL transfer, whether to skip the transfer of tablespace, by default, it is true.
# skip-table-space=true
        [[ddl.replace]]
        ## Only applicable for the case of migration from Greenplum to YMatrix
                category="role"
                [[ddl.replace.pairs]]
                        old="gpadmin"
                        new="mxadmin"

После подготовки TOML-файла выполните следующую команду для запуска полной миграции:

$ mxshift -c config_path_full.toml

3.2 Инкрементальная миграция

Выполнение инкрементальной миграции данных с использованием условий WHERE:

[database]
        [database.source]
        ## Name of database
        db-database= "testdb"
        ## Hostname of database master
        db-host="sdw3"
        ## password of database
        db-password="xxxx"
        ## Port of database master
        db-port=54322
        ## user name of database
        db-user="gpadmin"
        ## The installation directory of database(v5.0.1 and above)
        # install-dir="/usr/local/greenplum-db-6.7.1"

        [database.target]
        ## Name of database
        db-database="destdb"
        ## Hostname of database master
        db-host="172.16.100.32"
        ## password of database
        db-password="yyyy"
        ## Port of database master
        db-port=5432
        ## user name of database
        db-user="mxadmin"

[scope]
## The compress method for transferring data, methods restricted to 0/gzip/lz4/zstd        
compress-method="lz4"
## The installation directory of database(v5.0.0)
# gphome="/usr/local/greenplum-db-6.7.1"
## mode for transferring data from source to target database, and value restricted to normal/dryrun/fetch/motion.
##dryrun for only executing ddl, not transferring data
##fetch for fetching data from source and abandon
##motion for fetching data from source, redistributing and finally abandon
mode="normal"
## Sql for select segment information from source database        
# select-source-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
## Sql for select segment information from target database
# select-target-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
        [[scope.table-list]]
                schema=......
                name=......
        [[scope.table-list]]
        ......     
        [[scope.exclude-table-list]]
        ......        
schema-list=["test_schema_1", "test_schema_2"]
exclude-schema-list=["test_schema_5", "test_schema_8"]

[log]
## The log level, value restricted to: debug/verbose/info.
log-level="info"
## Print log without color.
# no-color=false

[controller]
## By default, transfer work will start from the largest table. If set 'bothway' it will start from both the largest and the smallest table
both-way=true
## The number of table transferred at the same time
concurrency=5

[transfer]
## Verity the number of record of every table
verify=true
[transfer.table-data-where-sql]
enabled=true
global="txdate >= '2022-10-01' AND batchnum >= 100000000"
[[transfer.table-data-where-sql.override]]
        where="abc > 10"
        [transfer.table-data-where-sql.override.table]
        schema="test_schema_1"
        name="table_001"
[[transfer.table-data-where-sql.override]]
        where="tag != 'aabbcc' AND ts > '2022-01-01'"
        [transfer.table-data-where-sql.override.table]
        schema="test_schema_2"
        name="another_table"

После подготовки TOML-файла выполните следующую команду для запуска инкрементальной миграции:

$ mxshift -c config_path_incremental.toml

3.3 Миграция реплицированных таблиц

При миграции всей базы данных или всех реплицированных таблиц в определённой схеме нет необходимости добавлять дополнительные конфигурации в config_path.toml. mxshift автоматически определяет, какие таблицы являются реплицированными, и применяет соответствующую стратегию миграции, чтобы избежать дублирования данных. Вам нужно лишь настроить schema и name в scope.table-list.

   [[scope.table-list]]
                schema="public1"
                name="table_replicated1"
   [[scope.table-list]]
                schema="public2"
                name="table_replicated2"

После подготовки TOML-файла выполните следующую команду для запуска mxshift для миграции реплицированных таблиц:

$ mxshift -c config_path_replicated.toml

Примечание!
Подробное описание подхода к миграции данных и полные шаги см. в разделе Миграция данных.