РИТ++ 2017, Web-scale IT Сonference
Зал Владивосток, 6 июня, 18:00
Тезисы:
http://webscaleconf.ru/2017/abstracts/2833.html
Вводные:
1) Необходимо переносить данные с минимальным простоем БД.
2) Необходимо произвести трансформацию данных из-за отличий между DB2 и PG и перемещением BLOB'ов в Ceph.
3) Перенос должен быть произведен за приемлемое время.
4) Нужно учесть зависимости между таблицами.
Технологии:
1) Отслеживание изменений с помощью триггеров.
2) Анализ зависимостей с помощью доработанного SchemaSpy.
3) Перенос с помощью Spring Batch.
4) Разбиение на партиции (два подхода: деление диапазона id между min и max на равные части; деление на диапазоны с равным числом строк).
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Миграция БД больше 10Тб с DB2 на PostgreSQL без простоя БД / Дмитрий Погибенко (НИИ Восход)
1. Миграция больших БД без
остановки
Как перевести БД с DB2 for z/OS на PostgreSQL с
минимальным временем простоя
Дмитрий Погибенко
2. Требования к процессу миграции
Преобразование данных
Перенос данных без остановки БД
Зависимости между таблицами
Сжатые сроки перехода на PostgreSQL
Возможность мигрировать другие БД с минимальными
доработками
3. Требования к процессу миграции
Преобразование данных
В процессе переноса большие бинарные объекты(BLOB) сохраняются в
Ceph, а в БД сохраняются только их идентификаторы.
4. Требования к процессу миграции
Преобразование данных
Перенос данных без остановки БД
Нужно отслеживать и обрабатывать изменения в данных
5. Требования к процессу миграции
Преобразование данных
Перенос данных без остановки БД
Зависимости между таблицами
Во время переноса в целевой БД существуют все внешние ключи
6. Требования к процессу миграции
Преобразование данных
Перенос данных без остановки БД
Зависимости между таблицами
Сжатые сроки перехода на PostgreSQL
Возможность мигрировать другие БД с минимальными
доработками
11. Автоматизируем анализ зависимостей
SchemaSpy (http://schemaspy.sourceforge.net/)
Анализирует зависимости
Ищет циклические зависимости
Упорядочивает таблицы от независимых к зависимым
Через обертку встраивается в java-приложение и отдает информацию в
удобном виде
12. Переносим данные
Spring Batch (http://projects.spring.io/spring-batch/)
Управление транзакциями
Обработка по частям
Декларативная конфигурация
Запуск/останов/перезапуск
Гибкие стратегии пропуска/повтора при ошибках
20. Перенос изменений
Изменения в данных отслеживаются
триггерами
Идентификаторы измененных, добавленных
и удаленных строк записываются в
служебные таблицы
Система переноса данных периодически
читает служебные таблицы и переносит
соответствующие строки
22. Разбиение данных на диапазоны(простое)
SELECT MIN(id), MAX(id) FROM tablename;
long targetSize = ((max - min) / partitions) + 1;
while (start <= max) {
if (end >= max) { end = max;}
ranges.add(new Range<>(start, end));
start += targetSize;
end += targetSize;
}
23. Разбиение на диапазоны с равным числом строк
SELECT COUNT(*), MIN(id), MAX(Id)
FROM tablename;
partitionSize = (count / partitions);
SELECT id FROM tablename
WHERE id >= ? ORDER BY id
LIMIT 1 OFFSET partitionSize;
25. Каждая миграция имеет свои особенности
Снести индексы и восстановить после переноса.
Быстрее или нет?
В нашем случае нет.
Размер коммита и количество потоков нужно подбирать
экспериментально.
В нашем случае оптимальным оказалось 16 потоков(по числу ядер на
сервере Эльбрус) и 1000 строк в каждой транзакции.
26. Базы данных, которые легко мигрировать
Нет бизнес-логики в хранимых процедурах
Во всех таблицах есть первичный ключ
Нет циклических зависимостей
Основная операция - INSERT