Данный документ описывает лучшие практики миграции данных из Greenplum 6 в YMatrix 5.
Перед выполнением критической операции необходима тщательная подготовка — как техническая, так и психологическая (поскольку проблемы могут возникнуть в любой момент). Хотя психологическая готовка индивидуальна, мы предоставляем подробный чек-лист для технической настройки. Некоторые шаги являются опциональными:
| № | Шаг подготовки | Описание | Опционально |
|---|---|---|---|
| 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 | Да |
Ниже приведены подробные примеры для каждого шага.
Миграция выполняет только операции чтения с кластера источника, поэтому риск повреждения данных отсутствует. Однако, если требуется дополнительная безопасность или есть другие бизнес-потребности, связанные с данными, используйте инструмент mxbackup для параллельного резервного копирования кластера.
Примечание!
Рекомендуется не развертывать зеркальные сегменты при первоначальном развертывании кластера. Добавляйте зеркала после завершения миграции для повышения эффективности миграции.
Примечание!
Имена хостов целевого кластера не должны конфликтовать с именами хостов кластера источника.
Следуйте стандартным руководствам по развертыванию кластера:
См. документацию по мониторингу и оповещениям:
Примечание!
До остановки всего трафика приложений не должно быть разрешено никаких DDL-операций на кластере Greenplum 6 источника. Это включает создание или изменение объектов, добавление или удаление столбцов, а также выполнение инструкцийCREATE,ALTER,TRUNCATEилиDROP.
На Master-узле кластера Greenplum 6 источника отредактируйте файл pg_hba.conf.
$ vim pg_hba.conf
Добавьте IP-адреса клиентов в следующем формате для отключения удаленного доступа:
host all all <Client IP Address>/<CIDR Mask> reject
Перезагрузите конфигурацию для применения изменений:
$ gpstop -u
Соберите данные, включая количество физических машин, ОС, CPU, память, тип дисков, использование дисков, информацию о сетевых интерфейсах, топологии кластеров источника и назначения, лицензию базы данных, настройки групп ресурсов и т.д. Адаптируйте их под вашу конкретную ситуацию, чтобы обеспечить полную готовность к миграции. Полезные команды:
| № | Команда | Цель |
|---|---|---|
| 1 | free -g |
Просмотр системной памяти |
| 2 | lscpu |
Просмотр количества CPU |
| 3 | cat /etc/system-release |
Просмотр версии ОС |
| 4 | uname -a |
Вывод информации ядра: имя ядра, hostname, версия ядра, архитектура, тип процессора, платформа, имя ОС |
| 5 | tail -11 /proc/cpuinfo |
Просмотр деталей CPU |
| 6 | gpcheckperf |
Тест производительности сетевого канала и дискового ввода-вывода |
От имени пользователя 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
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
Пояснение:
quicklz.plpython3u.zstd.После создания таблиц установите индексируемые столбцы на сортировку 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;
Примечание!
Пропустите этот шаг, если кластеры источника и назначения работают на одном сервере.
На 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
Выполните следующее на кластере YMatrix:
$ psql -h <YMatrix_Server_IP> -p <target_port> -d <target_db> -U <target_superuser> -f global_user.sql
Выполните на кластере YMatrix:
$ psql -h <YMatrix_Server_IP> -p <target_port> -d <target_db> -U <target_superuser> -f orig.sql
Используйте созданную резервную копию orig.sql для восстановления структур таблиц на целевом кластере YMatrix:
$ time psql -d <target_db_name> -f orig.sql > restoreddl.log 2>&1 &
$ time psql -d <target_db_name> -f collate.sql
Примечание!
Подробное описание параметров см. в документации 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
Создайте индексы на целевом кластере YMatrix:
psql -h localhost -p <target_port> -d <target_db_name> -U mxadmin -f index.sql >>idx.out 2>&1 &
Обновите статистику для всей базы данных на целевом кластере YMatrix:
export PGPORT=<target_port>
time analyzedb -d <target_db_name> -p 10 -a
Добавьте зеркальные сегменты на целевой кластер 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)
После завершения вышеуказанных шагов возобновите бизнес-операции и отслеживайте поведение системы. Наблюдайте за кластером в течение продолжительного периода (продолжительность зависит от конкретных паттернов нагрузки). Если система работает стабильно — поздравляем! Миграция данных успешно завершена!