Миграция данных из 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/32 и 172.16.100.3/32.

Примечание!
Если имеется несколько хостов, необходимо записать все IP-адреса хостов в скрипт.

$ cat  config_hba.sh
#!/bin/bash
for line  in `psql -Atc "select hostname||','|| datadir
 from gp_segment_configuration order by datadir desc"`
do
    hostname=`echo $line|awk -F "," '{print $1}'`
    datadir=`echo $line|awk -F "," '{print $2}'`

    gpssh -h $hostname -v -e "echo host    all    all    172.16.100.2/32    md5>> ${datadir}/pg_hba.conf"
    gpssh -h $hostname -v -e "echo host    all    all    172.16.100.3/32    md5>> ${datadir}/pg_hba.conf"

done

In the source cluster and the target cluster master, execute the following command to add the host IP address and host name of all nodes of the source cluster and the target cluster to the /etc/hosts file. In the example, the host IP address is 172.16.100.195 and the host name is 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.1.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.1.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 пропускать ли передачу табличных пространств, по умолчанию — 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 <Target cluster port number> -d <Target database name> -U <Target database superuser name> -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=<Target cluster port number>  
time analyzedb -d <Target database name> -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)  
``  

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