Миграция данных из Greenplum 6 в YMatrix 5

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

На Master-узле кластера Greenplum 6 источника отредактируйте файл pg_hba.conf.

$ vim pg_hba.conf

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

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

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

$ gpstop -u

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

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

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

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

От имени пользователя gpadmin используйте pg_dump для создания резервной копии DDL, имен схем и информации о пользователях из кластера Greenplum 6 источника:

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

# Back up table schemas
pg_dump <source_db_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 pp.parrelid,
           ppr.parchildrelid
   FROM pg_partition pp
   INNER JOIN pg_partition_rule ppr ON pp.oid = ppr.paroid ),
     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 ;

Выполните через psql:

psql -d <source_db_name> -U <superuser> -t -f get_index.sql > index.sql

1.8 Настройка или оптимизация DDL (опционально)

mxshift теперь поддерживает автоматическую миграцию DDL — см. раздел «2 Выполнение миграции». Ниже описаны ручные корректировки.

Корректировки устраняют несовместимости между синтаксисом DDL Greenplum 6 и YMatrix (не требуются для миграции из YMatrix 4 в YMatrix 5). Оптимизация обеспечивает максимальную производительность с самого начала. Примеры команд, выполняемых на кластере Greenplum 6 источника:

# Change compression algorithm
sed -i 's/quicklz/zstd/g' orig.sql   

# Update plpython version
sed -i 's/plpythonu/plpython3u/g' orig.sql     

# Add extension creation command
sed -i '1s/^/create language plpython3u;/' orig.sql  

# Remove index creation statements
sed -i -e '/CREATE INDEX.*;/d' -e '/CREATE INDEX/,/;/d' orig.sql  

# Optimize compression method
sed -i 's/compresstype=zlib/compresstype=zstd/g' orig.sql  

# Adjust compression level
sed -i 's/compresslevel=5/compresslevel=1/g' orig.sql        

Пояснение:

  • Алгоритм сжатия: YMatrix не поддерживает quicklz.
  • Версия plpython: YMatrix поддерживает plpython3u.
  • Создание расширений: Необходимые расширения должны быть созданы в YMatrix.
  • Удаление инструкций индексов: Создание индексов во время создания таблиц увеличивает объем сканирования и снижает эффективность миграции. Рекомендуется удалить их и пересоздать после миграции.
  • Оптимизация сжатия: В YMatrix предпочтителен zstd.
  • Уровень сжатия: Уровень 1 является оптимальным в YMatrix.

1.9 Генерация SQL-файла для изменения столбцов таблиц (опционально)

После создания таблиц установите индексируемые столбцы на сортировку C для ускорения индексации и сокращения времени миграции.

$ cat collate.sql
SELECT 'alter table '||quote_ident(b.schemaname)||'.'||quote_ident(b.tablename)||' alter column '||quote_ident(b.colname)||' type '||d.coltype||' COLLATE "pg_catalog"."C";'
FROM
  (SELECT DISTINCT a.schemaname,
                   a.tablename,
                   regexp_split_to_table(replace(a.keyindex,' ',''),',') AS colname
   FROM
     (SELECT schemaname,
             tablename,
             rtrim(split_part(indexdef,'(',2),')') AS keyindex,
             indexdef
      FROM pg_indexes
      WHERE schemaname NOT IN ('pg_catalog')
        AND indexname NOT LIKE '%pkey'
        AND indexdef LIKE 'CREATE INDEX%') a) b
INNER JOIN
  (SELECT c.oid,
          n.nspname,
          c.relname
   FROM pg_catalog.pg_class c
   LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace) c ON b.schemaname=c.nspname
AND c.relname=b.tablename
INNER JOIN
  (SELECT e.attrelid,a.attname, pg_catalog.format_type(a.atttypid, a.atttypmod) AS coltype,
     (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid)
                       FOR 128)
      FROM pg_catalog.pg_attrdef d
      WHERE d.adrelid = a.attrelid
        AND d.adnum = a.attnum
        AND a.atthasdef), a.attnotnull,
                          a.attnum
   FROM pg_catalog.pg_attribute a
   LEFT OUTER JOIN pg_catalog.pg_attribute_encoding e ON e.attrelid = a .attrelid
   AND e.attnum = a.attnum
   WHERE a.attnum >0) d ON d.attrelid=c.oid
AND d.attname=b.colname;

1.10 Добавление белых списков на все узлы кластеров источника и назначения

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

На Master-узлах обоих кластеров добавьте все 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 | cut -d',' -f1)
    datadir=$(echo $line | cut -d',' -f2)

    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

Также добавьте IP-адреса и имена хостов в /etc/hosts. Пример: IP 172.16.100.195, имя хоста sdw1.

$ cat add_hosts.sh 
#!/bin/bash
for line  in $(psql -Atc "select hostname from gp_segment_configuration")
do
    gpssh -h $line -v -e "echo 172.16.100.195 sdw1 >> /etc/hosts"
done

Перезагрузите конфигурацию: Для Greenplum выполните:

$ gpstop -u

Для YMatrix 5 выполните:

$ mxstop -u

1.11 Создание пользователей на целевом кластере

Выполните следующее на кластере YMatrix:

$ psql -h <YMatrix_Server_IP> -p <target_port> -d <target_db> -U <target_superuser> -f global_user.sql

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

Выполните на кластере YMatrix:

$ psql -h <YMatrix_Server_IP> -p <target_port> -d <target_db> -U <target_superuser> -f orig.sql 

1.13 Восстановление структур таблиц (опционально)

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

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

1.14 Изменение сортировки таблиц на C (опционально)

$ time psql -d <target_db_name> -f collate.sql  

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

Примечание!
Подробное описание параметров см. в документации 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="gpadmin"

    [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]
compress_method="lz4"
gphome="/usr/local/greenplum-db-6.7.1"
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"
## Print log without color.
# 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
## 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"      

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

$ mxshift -c config_path.toml

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

3.1 Создание индексов (опционально)

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

psql -h localhost -p <target_port> -d <target_db_name> -U mxadmin -f index.sql >>idx.out 2>&1 &

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

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

export PGPORT=<target_port>
time analyzedb -d <target_db_name> -p 10 -a 

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

Добавьте зеркальные сегменты на целевой кластер YMatrix. Процедура следующая:

# First, check the 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 on all segment hosts
$ gpssh -f /home/mxadmin/seg_hosts -e 'mkdir -p /home/mxdata_20220925154450/mirror'

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

# View the generated mirror template file
$ cat addmirror

# Execute the command to add mirrors
$ mxaddmirrors -i addmirror

# Finally, verify the 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)

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