Миграция данных в Managed Service for Sharded PostgreSQL
-
Можно ли создать "шард по умолчанию" для непривязанных ключей?
-
Как происходит перебалансировка данных при добавлении нового шарда?
Можно ли шардировать по композитному ключу?
Да. Для этого создайте композитный ключ:
CREATE DISTRIBUTION <имя_правила_шардирования> COLUMN TYPES integer, varchar;
ALTER DISTRIBUTION <имя_правила_шардирования> ATTACH RELATION orders DISTRIBUTION KEY user_id, order_date;
Подробнее о композитных ключах шардирования в документации SPQR
Можно ли создать шард по умолчанию для непривязанных ключей?
Да. Для этого используйте команду:
ALTER DISTRIBUTION <имя_правила_шардирования> ADD DEFAULT SHARD <имя_шарда>;
Подробнее о шардах по умолчанию в документации SPQR
Как добавить новый шард и перебалансировать данные?
- Создайте новый шард.
- Используйте команду
SYNC REFERENCE TABLESдля копирования справочных таблиц. - Перераспределите диапазоны ключей. Используйте команды:
SPLIT KEY RANGE— чтобы разделить диапазон ключей.REDISTRIBUTE KEY RANGE— чтобы перенести данные автоматически.
Как происходит перебалансировка данных при добавлении нового шарда?
При добавлении нового шарда нужно запустить ручной перенос данных с помощью команды REDISTRIBUTE KEY RANGE. В этом случае Sharded PostgreSQL перемещает небольшие диапазоны данных, чтобы минимизировать недоступность кластера на запись.
Как загружать большие объемы данных?
Для загрузки больших объемов данных доступны два варианта:
-
COPYс виртуальным параметром/* __spqr__allow_multishard: true */.Например, для загрузки из CSV-файла:
COPY <имя_таблицы> FROM 'data.csv' WITH DELIMITER ',' /* __spqr__allow_multishard: true */;Важно
Использование
COPYможет приводить к высокой нагрузке на роутер. Если вы регулярно используетеCOPY, рекомендуется создать для этой задачи отдельный роутер. -
Одновременная вставка нескольких строк в таблице (batch insert) с виртуальным параметром
/* __spqr__engine_v2: true */. В таком случае роутер анализирует каждую строку, определяет целевой шард на основе ключа шардирования и преобразовывает запрос в отдельные командыINSERTдля каждого шарда.Например, команда:
INSERT INTO users (id, name) VALUES (1, 'Alice'), -- отправляется на шард sh1 (100, 'Bob'), -- отправляется на шард sh2 (2, 'Charlie') -- отправляется на шард sh1 /* __spqr__engine_v2: true */; -- NOTICE: send query to shard(s) : sh1,sh2будет преобразована в:
INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Charlie');для шардаsh1.INSERT INTO users (id, name) VALUES (100, 'Bob');для шардаsh2.
Виртуальные параметры можно задавать комментариями в SQL или через SET.
Подробнее о вставке больших объемов данных в документации SPQR
Как ускорить миграцию больших объемов данных?
- Увеличьте размер чанка.
- Убедитесь, что на шардах есть индекс по ключу шардирования.
- Избегайте параллельных операций записи во время миграции.
Что происходит при сбое во время миграции данных?
Sharded PostgreSQL обеспечивает атомарность на уровне диапазона. При сбое данные могут временно находиться на обоих шардах. Операция будет отменена или возобновлена после восстановления.
Как переименовать таблицу, сохранив ее доступность?
Выполните последовательность ALTER TABLE в одной транзакции. Для включения этой возможности используйте виртуальный параметр /* __spqr__multishard_ddl: true */.
ALTER TABLE ... /* __spqr__multishard_ddl: true */;
Действие не транзакционно. Переименование таблиц требует осторожности.
Виртуальные параметры можно задавать комментариями в SQL или через SET.