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