Миграция данных с YMatrix 4 на YMatrix 5

В этом разделе документации основное внимание уделяется лучшим практикам миграции данных с YMatrix 4 на YMatrix 5.

1. Подготовка среды

После принятия решения о выполнении важной операции необходимо тщательно подготовиться, как в техническом, так и в психологическом плане (поскольку вы можете столкнуться с проблемами в любой момент). Каждый человек имеет свой способ психологической подготовки. Мы предоставим вам относительно полный план, включая опциональные шаги, как показано ниже:

Номер Шаги подготовки Инструкции Опционально
1 Резервное копирование данных кластера источника Миграция данных выполняет только чтение из кластера источника, без записи, поэтому не несёт риска повреждения данных в результате миграции Да
2 Установка и развертывание целевого программного обеспечения базы данных Нет, обязательный шаг
3 Развертывание мониторинга для целевого кластера Зависит от требований Да
4 Запретить все DDL-операции со стороны бизнеса Этот шаг критически важен и может создать риски для процесса миграции. Отнеситесь к нему серьёзно. Нет, обязательный шаг
5 Прервать все бизнес-соединения Этот шаг критически важен и может создать риски для процесса миграции. Отнеситесь к нему серьёзно. Нет, обязательный шаг
6 Сбор информации о кластере источника и целевом кластере Информация о программном и аппаратном обеспечении, топология кластера источника, топология целевого кластера и т.д. Нет, обязательный шаг
7 Резервное копирование исходной информации кластера источника DDL, имена схем, информация о пользователях и т.д. Нет, обязательный шаг
8 Добавить белый список для мастера кластера источника Нет, обязательный шаг
9 Создать пользователя для целевого кластера Нет, обязательный шаг
10 Создать DDL для целевого кластера В YMatrix эффективнее пересоздавать индексы после выполнения операции миграции. Поэтому при создании DDL для целевого кластера до миграции рекомендуется создавать таблицы без индексов Да, в настоящее время mxshift поддерживает автоматическую миграцию DDL, см. mxshift
11 Восстановить структуру таблиц Да, в настоящее время mxshift поддерживает автоматическую миграцию индексов. Подробности см. в mxshift

На основе приведённой таблицы приведём конкретные примеры.

1.1 Резервное копирование данных кластера источника (опционально)

Миграция данных выполняет только операции чтения и не производит запись в данные кластера источника, поэтому не несёт риска повреждения данных в результате миграции. Однако, если вы всё ещё обеспокоены или имеете другие бизнес-требования, требующие сохранения данных, вы можете использовать инструмент mxbackup для параллельного резервного копирования кластера.

1.2 Установка и развертывание целевого программного обеспечения базы данных

Примечание!
Рекомендуем не развертывать зеркальные узлы (Mirrors) при развертывании кластера, а добавлять их после завершения миграции для повышения эффективности миграции.

Примечание!
Имена хостов целевого кластера не должны совпадать с именами хостов кластера источника!

См. стандартную документацию по развертыванию кластера:

1.3 Развертывание мониторинга для целевого кластера (опционально)

См. документацию по мониторингу и оповещениям:

1.4 Запретить все DDL-операции со стороны бизнеса

Примечание!
До официальной остановки всех сервисов со стороны бизнеса на стороне кластера YMatrix 4 источник не допускается выполнение любых DDL-операций, включая создание объектов, изменение объектов, добавление или удаление полей, а также запрещается выполнение операторов CREATE, ALTER, TRUNCATE и DROP.

1.5 Прервать все бизнес-соединения

Измените файл pg_hba.conf на мастере кластера YMatrix 4 источник.

$ vim  pg_hba.conf

Добавьте адрес бизнес-клиента в следующем формате, чтобы отключить удалённый доступ.

host     all         all         <Client IP Address>/<Subnet Mask Bits>       reject

Затем перезагрузите конфигурацию, чтобы применить изменения:

$ mxstop -u

1.6 Сбор информации о кластере источника и целевом кластере

Соберите информацию о кластере источника и целевом кластере, включая количество физических машин, операционную систему, процессоры, память, тип дисков, использование дисков, информацию о сетевых картах, топологию кластера источника, топологию целевого кластера, лицензию базы данных, конфигурацию групп ресурсов и т.д. Используйте эти данные в зависимости от конкретной ситуации для всесторонней подготовки к миграции. Ниже приведены возможные команды:

Номер Команда Цель
1 free -g Просмотр информации о памяти операционной системы
2 lscpu Просмотр количества процессоров
3 cat /etc/system-release Просмотр версии операционной системы
4 uname -a Вывод всей информации ядра в следующем порядке (результаты -p и -i опущены, если они не определены): имя ядра; имя хоста в сети; номер выпуска ядра; версия ядра; имя аппаратной архитектуры хоста; тип процессора (не переносимый); аппаратная платформа или (не переносимый); имя операционной системы
5 tail -11 /proc/cpuinfo Просмотр информации о процессоре
6 gpcheckperf Проверка производительности сети, пропускной способности, производительности дискового ввода-вывода

1.7 Резервное копирование исходной информации кластера источника

Под суперпользователем используйте инструмент pg_dump для резервного копирования DDL, имён схем, информации о пользователях и т.д. кластера YMatrix 4 источник.

# Backup global user objects
$ pg_dumpall -g -f global_user.sql

# Backup table structure
$ pg_dump <Source Database Name> -s -f orig.sql          

# Copy a backup
$ cp orig.sql copy.sql                        

Генерирует SQL-файл для создания индексов.

$ cat get_index.sql 
WITH soi (oid, toid, SIZE, tschema, tname) AS
  ( SELECT soioid,
           soitableoid,
           soisize,
           soitableschemaname,
           soitablename
   FROM gp_toolkit.gp_size_of_index 
  ),
  childrel (oid, coid)AS
  ( SELECT t.parentrelid::oid, 
           t.relid::oid 
    FROM pg_partitioned_table, pg_partition_tree(partrelid) t 
    where t.isleaf
  ),
  irn (oid, toid, SIZE, tschema, tname, rn) AS
  ( SELECT *,
           row_number() OVER (
            ORDER BY dt.ssize DESC) rn
   FROM
     ( SELECT soi.oid,
              soi.toid ,
              sum(coalesce(dt2.SIZE, soi.SIZE)) ssize ,
                                                soi.tschema,
                                                soi.tname
      FROM soi
      LEFT JOIN
        ( SELECT childrel.oid,
                 soi.SIZE
         FROM soi
         INNER JOIN childrel ON soi.toid = childrel.coid ) dt2 ON soi.toid = dt2.oid
      GROUP BY 1,
               2,
               4,
               5 ) dt )
SELECT SQL || ';'
FROM
  ( SELECT pg_get_indexdef(oid) AS SQL ,
           (rn % 12 + (rn / 12)::int) % 12 AS orderkey
   FROM irn
   WHERE toid NOT IN
       (SELECT coid
        FROM childrel) ) dt
WHERE SQL NOT LIKE 'CREATE UNIQUE INDEX%'
ORDER BY dt.orderkey ;

Выполните вышеуказанный SQL через psql.

$ psql -d <Source Database Name> -U mxadmin -t -f get_index.sql > index.sql

1.8 Добавить белый список для мастера кластера источника

Примечание!
Если кластер источника и целевой кластер работают на одном сервере, просто пропустите этот шаг.

На мастере кластера источника добавьте IP-адрес хоста мастера целевого кластера в файл pg_hba.conf. Пример ниже с IP-адресом 172.16.100.2:

host    all    all    172.16.100.2    md5

На мастере целевого кластера выполните следующую команду, чтобы добавить IP-адрес и имя хоста мастера кластера источника в файл /etc/hosts. В примере IP-адрес хоста — 172.16.100.195, а имя хоста — sdw1.

$ cat  add_hosts.sh 

``

#!/bin/bash
for line  in `psql -Atc "select distinct  hostname from gp_segment_configuration order by datadir desc"`
do
    gpssh -h $hostname -v -e "echo 172.16.100.195 sdw1 >> /etc/hosts"
done

Then reload the configuration to make the modified configuration file take effect

$ mxstop -u

1.9 Create a user for the target cluster

Execute the following command in the YMatrix 5 cluster environment.

$ psql -h <YMatrix Server IP Address> -p  <target cluster port number> -d <target database> -U <Target database superuser name> -f global_user.sql

1.10 Create DDL for the target cluster (optional)

mxshift now supports automatic migration of DDL. For details, please refer to "2 Migration Execution". If you need to create a DDL manually, refer to the "1.10" and "1.11" sections.

Execute the following command in the YMatrix 5 cluster environment.

$ psql -h <YMatrix Server IP Address> -p  <target cluster port number> -d <target database> -U <Target database superuser name> -f orig.sql 

1.11 Restore table structure (optional)

Use the backup orig.sql file to restore the table structure in the target cluster YMatrix 5.

$ time psql -d <target database name> -f orig.sql > restoreddl.log  2>&1 &   

2 Migration execution

Notes!
For detailed parameters, please refer to mxshift

First write the configuration file config_path.toml.

[database]
        [database.source]
        ## Имя базы данных
        db-database= "testdb"
        ## Имя хоста мастера базы данных
        db-host="sdw3"
        ## Пароль базы данных
        db-password="xxxx"
        ## Порт мастера базы данных
        db-port=54322
        ## Имя пользователя базы данных
        db-user="mxadmin"
        ## Версия базы данных (используйте результат 'SELECT version();' в качестве значения). Требуется только при:
        ## 1. Недоступности исходной базы данных и включённой опции 'ddl.only-ddl' с 'ddl.mode' = 'input'
        ## 2. Недоступности целевой базы данных и 'ddl.mode' = 'output'
         # db-version="PostgreSQL 12 (MatrixDB 5.2.0-enterprise) (Greenplum Database 7.0.0+dev.17410.gedbdb5ef84 build dev) on arm-apple-darwin21.5.0, compiled by Apple clang version 13.0.0 (clang-1300.0.27.3), 64-bit compiled on Jun 5 2023 15:45:24"
         ## Путь установки MatrixDB
         install-dir="/usr/local/greenplum-db-6.7.1"
         [[database.source.hostname-to-ip]]
             ## Содержимое внутри <> должно быть заменено на фактические данные, а <> удалено
             node-hostname="<mdw>" 
             node-ip="<127.0.0.1>"
         [[database.source.hostname-to-ip]]
             node-hostname="<sdw1>"
             node-ip="<127.0.0.2>"
         [[database.source.hostname-to-ip]]
             node-hostname="<sdw2>"
             node-ip="<127.0.0.3>"

        [database.target]
        ## Имя базы данных
        db-database="destdb"
        ## Имя хоста мастера базы данных
        db-host="172.16.100.32"
        ## Пароль базы данных
        db-password="yyyy"
        ## Порт мастера базы данных
        db-port=5432
        ## Имя пользователя базы данных
        db-user="mxadmin"
        ## Версия базы данных (используйте результат 'SELECT version();' в качестве значения). Требуется только при:
        ## 1. Недоступности исходной базы данных и включённой опции 'ddl.only-ddl' с 'ddl.mode' = 'input'
        ## 2. Недоступности целевой базы данных и 'ddl.mode' = 'output'
         # db-version="PostgreSQL 12 (MatrixDB 5.2.0-enterprise) (Greenplum Database 7.0.0+dev.17410.gedbdb5ef84 build dev) on arm-apple-darwin21.5.0, compiled by Apple clang version 13.0.0 (clang-1300.0.27.3), 64-bit compiled on Jun 5 2023 15:45:24"

[scope]
## Метод сжатия для передачи данных, допустимые значения: 0/gzip/lz4/zstd
compress-method="lz4"
## Режим передачи данных из исходной базы в целевую, допустимые значения: normal/dryrun/fetch/motion.
## dryrun — только выполнение DDL, без передачи данных
## fetch — извлечение данных из источника и отбрасывание
## motion — извлечение данных из источника, перераспределение и последующее отбрасывание
mode="normal"
## SQL-запрос для получения информации о сегментах из исходной базы
# select-source-segment-sql="SELECT dbid, content, port, hostname FROM gp_segment_configuration WHERE status = 'u' AND role = 'p' ORDER BY CONTENT;"
## SQL-запрос для получения информации о сегментах из целевой базы
# 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"]
## Отключить инкрементальную миграцию данных, по умолчанию — true.
# disable-data-increment=true

[log]
## Уровень логирования, допустимые значения: debug/verbose/info.
log-level="info"
## Выводить лог без цвета.
# no-color=false

[controller]
## По умолчанию передача начинается с самой большой таблицы. Если установлено 'bothway', передача начинается одновременно с самой большой и самой маленькой таблицей
both-way=true
## Количество таблиц, передаваемых одновременно
concurrency=3

[transfer]
## Проверять количество записей в каждой таблице
verify=true
with-index=true

[ddl]
enabled=true
# file-path="/tmp/mxshift.sql"
# mode="output"
only-ddl=false
## Во время передачи DDL пропускать передачу очередей или групп ресурсов, по умолчанию — true.
# skip-resource-queue-and-group=true
## Во время передачи DDL пропускать передачу tablespace, по умолчанию — true.
# skip-table-space=true
        [[ddl.replace]]
        ## Применимо только для случая миграции из Greenplum в YMatrix  
category="role"  
[[ddl.replace.pairs]]  
        old="mxadmin"  
        new="mxadmin"  

## Отключить ли инкрементальную миграцию DDL, по умолчанию — true.  

# disable-ddl-increment=true  

Then perform data migration on the target YMatrix 5 cluster.

$ mxshift -c config_path.toml  

3 Follow-up tasks

3.1 Execute to create an index (optional)

Perform the creation of an index on the target cluster YMatrix 5.

$ psql -h localhost -p <номер порта целевого кластера> -d <имя целевой базы данных> -U <имя суперпользователя целевой базы данных> -f index.sql >>idx.out 2>&1 &  

3.2 Execute the analyzedb command

Update the library statistics on the target cluster YMatrix 5.

$ export PGPORT=<номер порта целевого кластера>  
time analyzedb -d <имя целевой базы данных> -p 10 -a   

3.3 Adding Mirror

Add Mirror on the target cluster YMatrix 5. The steps are as follows:


# Сначала проверьте текущую информацию о экземплярах кластера  
postgres=# SELECT * from gp_segment_configuration order by 1;  
 dbid | content | role | preferred_role | mode | status | port | hostname | address |                   datadir  
-----+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
    1 |      -1 | p    | p              | n    | u      | 5432 | mdw      | mdw     | /home/mxdata_20220925154450/master/mxseg-1  
    2 |       0 | p    | p              | n    | u      | 6000 | sdw2     | sdw2    | /home/mxdata_20220925154450/primary/mxseg0  
    3 |       1 | p    | p              | n    | u      | 6001 | sdw2     | sdw2    | /home/mxdata_20220925154450/primary/mxseg1  
    4 |       2 | p    | p              | n    | u      | 6000 | sdw3     | sdw3    | /home/mxdata_20220925154450/primary/mxseg2  
    5 |       3 | p    | p              | n    | u      | 6001 | sdw3     | sdw3    | /home/mxdata_20220925154450/primary/mxseg3  
    6 |      -1 | m    | m              | s    | u      | 5432 | sdw1     | sdw1    | /home/mxdata_20220925154450/standby/mxseg-1  
(6 rows)  

# Создайте файл со всеми именами хостов  
$ cat /home/mxadmin/seg_hosts   
sdw1  
sdw2  
sdw3  
sdw4  

# Пакетное добавление директорий Mirror с помощью команды gpssh  
$ gpssh -f /home/mxadmin/seg_hosts -e 'mkdir -p /home/mxdata_20220925154450/mirror'  

# Сгенерируйте шаблонный файл Mirror  
$ mxaddmirrors -o ./addmirror  

# Просмотрите шаблонный файл Mirror  
$ cat addmirror  

# Выполните операцию добавления Mirror  
$ mxaddmirrors -i addmirror  

# Наконец, снова проверьте конфигурацию экземпляров кластера  
postgres=# SELECT * from gp_segment_configuration order by 1;  
 dbid | content | role | preferred_role | mode | status | port | hostname | address |                   datadir  
-----+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
    1 |      -1 | p    | p              | n    | u      | 5432 | mdw      | mdw     | /home/mxdata_20220925154450/master/mxseg-1  
    2 |       0 | p    | p              | n    | u      | 6000 | sdw2     | sdw2    | /home/mxdata_20220925154450/primary/mxseg0  
    3 |       1 | p    | p              | s    | u      | 6001 | sdw2     | sdw2    | /home/mxdata_20220925154450/primary/mxseg1  
    4 |       2 | p    | p              | s    | u      | 6000 | sdw3     | sdw3    | /home/mxdata_20220925154450/primary/mxseg2  
    5 |       3 | p    | p              | s    | u      | 6001 | sdw3     | sdw3    | /home/mxdata_20220925154450/primary/mxseg3  
    6 |      -1 | m    | m              | s    | u      | 5432 | sdw1     | sdw1    | /home/mxdata_20220925154450/standby/mxseg-1  
    7 |       0 | m    | m              | n    | d      | 7000 | sdw3     | sdw3    | /home/mxdata_20220925154450/mirror/mxseg0  
    8 |       1 | m    | m              | s    | u      | 7001 | sdw3     | sdw3    | /home/mxdata_20220925154450/mirror/mxseg1  
    9 |       2 | m    | m              | s    | u      | 7000 | sdw2     | sdw2    | /home/mxdata_20220925154450/mirror/mxseg2  
   10 |       3 | m    | m              | s    | u      | 7001 | sdw2     | sdw2    | /home/mxdata_20220925154450/mirror/mxseg3  
(10 rows)  
``  

После завершения вышеуказанных шагов восстановите доступ к бизнес-приложениям, отслеживайте состояние их работы и наблюдайте за ними в течение определённого периода времени (точное время зависит от конкретного сценария). Если система работает стабильно — поздравляем, миграция данных успешно завершена!