В этом разделе документации основное внимание уделяется лучшим практикам миграции данных с YMatrix 4 на YMatrix 5.
После принятия решения о выполнении важной операции необходимо тщательно подготовиться, как в техническом, так и в психологическом плане (поскольку вы можете столкнуться с проблемами в любой момент). Каждый человек имеет свой способ психологической подготовки. Мы предоставим вам относительно полный план, включая опциональные шаги, как показано ниже:
| Номер | Шаги подготовки | Инструкции | Опционально |
|---|---|---|---|
| 1 | Резервное копирование данных кластера источника | Миграция данных выполняет только чтение из кластера источника, без записи, поэтому не несёт риска повреждения данных в результате миграции | Да |
| 2 | Установка и развертывание целевого программного обеспечения базы данных | Нет, обязательный шаг | |
| 3 | Развертывание мониторинга для целевого кластера | Зависит от требований | Да |
| 4 | Запретить все DDL-операции со стороны бизнеса | Этот шаг критически важен и может создать риски для процесса миграции. Отнеситесь к нему серьёзно. | Нет, обязательный шаг |
| 5 | Прервать все бизнес-соединения | Этот шаг критически важен и может создать риски для процесса миграции. Отнеситесь к нему серьёзно. | Нет, обязательный шаг |
| 6 | Сбор информации о кластере источника и целевом кластере | Информация о программном и аппаратном обеспечении, топология кластера источника, топология целевого кластера и т.д. | Нет, обязательный шаг |
| 7 | Резервное копирование исходной информации кластера источника | DDL, имена схем, информация о пользователях и т.д. | Нет, обязательный шаг |
| 8 | Добавить белый список для мастера кластера источника | Нет, обязательный шаг | |
| 9 | Создать пользователя для целевого кластера | Нет, обязательный шаг | |
| 10 | Создать DDL для целевого кластера | В YMatrix эффективнее пересоздавать индексы после выполнения операции миграции. Поэтому при создании DDL для целевого кластера до миграции рекомендуется создавать таблицы без индексов | Да, в настоящее время mxshift поддерживает автоматическую миграцию DDL, см. mxshift |
| 11 | Восстановить структуру таблиц | Да, в настоящее время mxshift поддерживает автоматическую миграцию индексов. Подробности см. в mxshift |
На основе приведённой таблицы приведём конкретные примеры.
Миграция данных выполняет только операции чтения и не производит запись в данные кластера источника, поэтому не несёт риска повреждения данных в результате миграции. Однако, если вы всё ещё обеспокоены или имеете другие бизнес-требования, требующие сохранения данных, вы можете использовать инструмент mxbackup для параллельного резервного копирования кластера.
Примечание!
Рекомендуем не развертывать зеркальные узлы (Mirrors) при развертывании кластера, а добавлять их после завершения миграции для повышения эффективности миграции.
Примечание!
Имена хостов целевого кластера не должны совпадать с именами хостов кластера источника!
См. стандартную документацию по развертыванию кластера:
См. документацию по мониторингу и оповещениям:
Примечание!
До официальной остановки всех сервисов со стороны бизнеса на стороне кластера YMatrix 4 источник не допускается выполнение любых DDL-операций, включая создание объектов, изменение объектов, добавление или удаление полей, а также запрещается выполнение операторов CREATE, ALTER, TRUNCATE и DROP.
Измените файл pg_hba.conf на мастере кластера YMatrix 4 источник.
$ vim pg_hba.conf
Добавьте адрес бизнес-клиента в следующем формате, чтобы отключить удалённый доступ.
host all all <Client IP Address>/<Subnet Mask Bits> reject
Затем перезагрузите конфигурацию, чтобы применить изменения:
$ mxstop -u
Соберите информацию о кластере источника и целевом кластере, включая количество физических машин, операционную систему, процессоры, память, тип дисков, использование дисков, информацию о сетевых картах, топологию кластера источника, топологию целевого кластера, лицензию базы данных, конфигурацию групп ресурсов и т.д. Используйте эти данные в зависимости от конкретной ситуации для всесторонней подготовки к миграции. Ниже приведены возможные команды:
| Номер | Команда | Цель |
|---|---|---|
| 1 | free -g | Просмотр информации о памяти операционной системы |
| 2 | lscpu | Просмотр количества процессоров |
| 3 | cat /etc/system-release | Просмотр версии операционной системы |
| 4 | uname -a | Вывод всей информации ядра в следующем порядке (результаты -p и -i опущены, если они не определены): имя ядра; имя хоста в сети; номер выпуска ядра; версия ядра; имя аппаратной архитектуры хоста; тип процессора (не переносимый); аппаратная платформа или (не переносимый); имя операционной системы |
| 5 | tail -11 /proc/cpuinfo | Просмотр информации о процессоре |
| 6 | gpcheckperf | Проверка производительности сети, пропускной способности, производительности дискового ввода-вывода |
Под суперпользователем используйте инструмент 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
Примечание!
Если кластер источника и целевой кластер работают на одном сервере, просто пропустите этот шаг.
На мастере кластера источника добавьте IP-адрес хоста мастера целевого кластера в файл pg_hba.conf. Пример ниже с IP-адресом 172.16.100.2:
host all all 172.16.100.2 md5
На мастере целевого кластера выполните следующую команду, чтобы добавить IP-адрес и имя хоста мастера кластера источника в файл /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
Then reload the configuration to make the modified configuration file take effect
$ mxstop -u
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
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
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 &
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.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"
## Путь установки 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.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]
## Метод сжатия для передачи данных, допустимые значения: 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 пропускать передачу tablespace, по умолчанию — 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
Perform the creation of an index on the target cluster YMatrix 5.
$ psql -h localhost -p <номер порта целевого кластера> -d <имя целевой базы данных> -U <имя суперпользователя целевой базы данных> -f index.sql >>idx.out 2>&1 &
Update the library statistics on the target cluster YMatrix 5.
$ export PGPORT=<номер порта целевого кластера>
time analyzedb -d <имя целевой базы данных> -p 10 -a
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)
``
После завершения вышеуказанных шагов восстановите доступ к бизнес-приложениям, отслеживайте состояние их работы и наблюдайте за ними в течение определённого периода времени (точное время зависит от конкретного сценария). Если система работает стабильно — поздравляем, миграция данных успешно завершена!