Проблема
- Атомарность в пределах одной таблицы для пакетной загрузки: распространенный подход — сначала выполнять вставку во временные частичные ключи, затем копировать записи в фактический ключ и удалять временные записи. Такой подход работает плохо — особенно на этапе удаления, который может занимать более 90% общего времени операции.
- Согласованность между несколькими таблицами: когда конвейер успешно загружает таблицу A, но завершается с ошибкой на таблице B, таблица A уже зафиксирована, и откатить изменения нельзя. Аналитики, выполняющие запросы к обеим таблицам, видят рассинхронизированные данные.
Предпосылки
INSERT выполняется успешно, все строки в этом блоке становятся видимыми; если завершается ошибкой — не видна ни одна. Однако встроенного механизма, позволяющего атомарно зафиксировать данные сразу в нескольких вставках или таблицах, нет.
Команды управления партициями (MOVE PARTITION TO TABLE, REPLACE PARTITION, ATTACH PARTITION FROM) работают на уровне метаданных, если исходная и целевая таблицы используют одну и ту же политику хранения.
Это означает, что они выполняются практически мгновенно независимо от объёма данных, поэтому они отлично подходят в качестве основы для шаблонов atomic-swap.
Рекомендуемое решение
Пошаговое руководство по обеспечению атомарности для одной таблицы
Создайте staging-таблицу
Используйте ту же схему, ключ партиционирования,ORDER BY и политику хранения, что и у продукционной таблицы.Вставьте данные в staging-таблицу
Выполняйте вставку в staging-таблицу, а не в продукционную таблицу.Если вставка завершилась ошибкой, очистите таблицу и повторите попытку
Очистите staging-таблицу и снова запустите загрузку. Данные в продакшн при этом не затрагиваются.Если вставка прошла успешно, переместите партиции в продакшн
Чтобы переместить данные в продакшн и удалить их из staging-таблицы, используйтеMOVE PARTITION.ATTACH PARTITION.Очистите staging-таблицу
После перемещения всех партиций очистите staging-таблицу, чтобы она оставалась пустой для следующей загрузки.Согласованность между несколькими таблицами
Требования и ограничения
MOVE PARTITION TO TABLE, REPLACE PARTITION и ATTACH PARTITION FROM исходная и целевая таблицы должны иметь:
- Одинаковую структуру столбцов
- Одинаковый ключ партиционирования, ключ
ORDER BYи первичный ключ - Одинаковую политику хранения
- Целевая таблица должна содержать все индексы и проекции из исходной таблицы
Пример
Справка
- Управление партициями и частями
- Подробнее об этой стратегии см. в блоге Ускорение загрузки больших объёмов данных в ClickHouse — часть 3: как сделать загрузку больших объёмов данных отказоустойчивой.