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

Документ описывает лучшие практики миграции данных с YMatrix 4/5 на YMatrix 6.

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

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

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

Ниже приведены подробные примеры для каждого шага.

1.1 Создание резервной копии данных кластера источника (необязательно)

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

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

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

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

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

1.3 Настройка мониторинга целевого кластера (необязательно)

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

1.4 Отключение всех DDL-операций от приложений

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

1.5 Завершение всех подключений приложений

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

$ vim pg_hba.conf

Добавьте IP-адреса клиентов в следующем формате для отключения удаленного доступа:

host     all         all         <Client IP Address>/<CIDR Mask>       reject

Перезагрузите конфигурацию для применения изменений:

$ mxstop -u

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

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

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

1.7 Создание резервной копии метаданных кластера источника

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

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

# Back up table schemas
$ pg_dump <source_database_name> -s -f orig.sql          

# Make a copy for 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 Добавление записи в белый список на Master кластера источника

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

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

host    all    all    172.16.100.2    md5

На Master целевого кластера добавьте IP-адрес и имя хоста Master кластера источника в /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

Reload configuration to apply changes:

$ mxstop -u

1.9 Create Users on Target Cluster

Run the following command in the YMatrix 6 environment:

$ psql -h <YMatrix Server IP> -p <target_cluster_port> -d <target_database> -U <superuser_name> -f global_user.sql

1.10 Создание DDL на целевом кластере (необязательно)

mxshift теперь поддерживает автоматическую миграцию DDL. Подробности см. в разделе "2. Выполнение миграции". Если требуется ручное создание DDL, обратитесь к разделам "1.10" и "1.11".

В среде YMatrix 6:

$ psql -h <YMatrix Server IP> -p <target_cluster_port> -d <target_database> -U <superuser_name> -f orig.sql 

1.11 Восстановление структуры таблиц (необязательно)

Используйте созданную резервную копию файла orig.sql для восстановления структуры таблиц на целевом кластере YMatrix 6:

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

2 Выполнение миграции

Примечание!
Подробное описание параметров mxshift см. в mxshift.

Сначала создайте файл конфигурации config_path.toml:

[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="mxadmin"
        ## Version of database(Please use the result of 'SELECT version();' as value). Required only when
        ##       1. Source database is un-reachable, and 'ddl.only-ddl' is enabled and 'ddl.mode' is 'input'
        ##       2. Target database is un-reachable, and 'ddl.mode' is '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"
         ## The installation directory of matrixdb
         install-dir="/usr/local/greenplum-db-6.7.1"
         [[database.source.hostname-to-ip]]
             ## Replace content within <> with actual values and remove <>
             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]
        ## 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"
        ## Version of database(Please use the result of 'SELECT version();' as value). Required only when
        ##       1. Source database is un-reachable, and 'ddl.only-ddl' is enabled and 'ddl.mode' is 'input'
        ##       2. Target database is un-reachable, and 'ddl.mode' is '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]
## Compression method for data transfer; allowed values: 0/gzip/lz4/zstd        
compress-method="lz4"
## Mode for transferring data from source to target; allowed values: normal/dryrun/fetch/motion.
## dryrun: execute DDL only, no data transfer
## fetch: fetch data from source and discard
## motion: fetch data, redistribute, then discard
mode="normal"
## SQL to select segment info 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 to select segment info 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"]
## Whether to disable incremental data migration; default is true.
# disable-data-increment=true

[log]
## Log level: debug/verbose/info
log-level="info"
## Print log without color
# no-color=false

[controller]
## By default, transfer starts from largest table. Use 'bothway' to start from both largest and smallest
both-way=true
## Number of tables to transfer concurrently
concurrency=3

[transfer]
## Verify record count for each table
verify=true
with-index=true

[ddl]
enabled=true
# file-path="/tmp/mxshift.sql"
# mode="output"
only-ddl=false
## During DDL transfer, skip resource queue/group migration; default is true
# skip-resource-queue-and-group=true
## During DDL transfer, skip tablespace migration; default is true
# skip-table-space=true
        [[ddl.replace]]
        ## Only applicable for Greenplum to YMatrix migration
                category="role"
                [[ddl.replace.pairs]]
                        old="mxadmin"
                        new="mxadmin"
## Whether to disable incremental DDL migration; default is true
# disable-ddl-increment=true   

Затем выполните миграцию на целевом кластере YMatrix 6:

$ mxshift -c config_path.toml

3 Задачи после миграции

3.1 Создание индексов (необязательно)

Создайте индексы на целевом кластере YMatrix 6:

$ psql -h localhost -p <target_cluster_port> -d <target_database_name> -U <superuser_name> -f index.sql >>idx.out 2>&1 &

3.2 Выполнение команды analyzedb

Обновите статистику для всей базы данных на целевом кластере YMatrix 6:

$ export PGPORT=<target_cluster_port>
time analyzedb -d <target_database_name> -p 10 -a 

3.3 Добавление зеркальных сегментов

Добавьте зеркальные сегменты на целевой кластер YMatrix 6. Пример шагов:

# First, check current cluster instance information
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)

# Create a file containing all hostnames
$ cat /home/mxadmin/seg_hosts 
sdw1
sdw2
sdw3
sdw4

# Use gpssh to batch-create mirror directories
$ gpssh -f /home/mxadmin/seg_hosts -e 'mkdir -p /home/mxdata_20220925154450/mirror'

# Generate mirror template file
$ mxaddmirrors -o ./addmirror

# View mirror template
$ cat addmirror

# Execute mirror addition
$ mxaddmirrors -i addmirror

# Finally, verify updated cluster configuration
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)

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