Для принятия управленческих решений компании должны анализировать данные о ходе бизнес-процессов в реальном времени. Чтобы сократить время получения информации из источников, импортируются не все данные, а только те, которые изменились с момента последней загрузки. Технология захвата изменений данных позволяет обнаружить новые или измененные записи и оперативно доставлять их в хранилища данных.
Анализ транзакций, хранящихся в OLTP-системах, играет важную роль для понимания состояния бизнес-процессов компании и в разработке решений по их совершенствованию. Однако ценность данных со временем снижается, поэтому организациям необходимо анализировать их практически в момент поступления. Как правило, данные в OLTP-системах являются «сырыми», поэтому перед анализом их сначала перемещают в хранилище данных (ХД), где они интегрируются, подвергаются очистке и предобработке.
Затрачиваемое время является важным фактором, поскольку информация быстро теряет актуальность, как и результаты ее анализа. Традиционно компании использовали пакетный подход для перемещения данных из источников в целевые системы хранения — один или несколько раз в сутки. Однако такой подход приводит к задержкам доступа к данным от нескольких часов до нескольких суток и снижает операционную эффективность бизнеса. Именно эту проблему и призвана решать технология захвата изменений в данных (Change Data Capture — CDC) путем непрерывной репликации новых или измененных записей из источников в целевые системы хранения.
Применение технологий CDC имеет следующие преимущества:
Простыми словами, захват изменений данных — это обнаружение и отслеживание новых и измененных строк в источниках, а также обеспечение их перемещения в целевые среды хранения в режиме реального времени (или почти в нем).
В CDC используют несколько методов отслеживания изменений данных в источниках, которые выбираются в зависимости от требований бизнеса и допустимых вычислительных затрат.
Для этого в таблицы вводятся дополнительные поля, в которых фиксируется время создания или последнего обновления записей (например, «LAST_UPDATED» или «DATE_MODIFIED»). Тогда при каждом перемещении данных следует извлекать только те записи, которые были созданы или изменены со времени прошлой выгрузки.
Источник данных | Целевая таблица | ||
---|---|---|---|
Время создания | Время обновления | Время создания | Время обновления |
09:00 | 19:00 | 13:00 | 16:00 |
17:00 | 20:00 | 15:00 | 17:00 |
15:30 | 12:00 | 12:00 | 18:00 |
12:00 | 19:30 | 11:00 | 17:00 |
16:00 | 17:00 | 12:50 | 17:00 |
Логика CDC для этого метода будет следующей:
Таким образом в целевую таблицу будут включены строки, выбранные в п.2, т.е. с метками времени создания 17:00, 15:30 и 16:00. При этом строка, созданная в 17.00 будет еще и обновлена в 20:00. Результирующая целевая таблица будет иметь вид:
Время создания | Время обновления |
---|---|
13:00 | 16:00 |
15:00 | 17:00 |
12:00 | 18:00 |
11:00 | 17:00 |
12:50 | 17:00 |
17:00 | 20:00 |
15:30 | 12:00 |
16:00 | 17:00 |
Плюсы метода в том, что он может быть реализован с использованием собственных ресурсов приложения и не требует каких-либо внешних инструментов. Минусами являются дополнительные вычислительные затраты на сканирование полей, а также склонность к ошибкам и проблемам с согласованностью данных.
Две таблицы сравнивают на предмет несовпадения и формируют подмножество несовпадающих записей или «дельта». Затем используются сценарии для переноса «дельт» из исходной таблицы в целевую.
Новый снимок | Предыдущий снимок | ||
---|---|---|---|
ID клиента | Последняя покупка | ID клиента | Последняя покупка |
10 | 08-28-2021 | 10 | 04-23-2020 |
11 | 05-07-2021 | 11 | 05-07-2021 |
12 | 01-28-2021 | 12 | 01-28-2021 |
13 | 08-02-2021 | 13 | 08-02-2021 |
14 | 08-29-2021 |
Результирующая таблица, которая и будет загружена в целевую систему хранения, будет иметь вид:
ID клиента | Последняя покупка |
---|---|
10 | 04-23-2020 |
14 | 08-29-2021 |
Преимущество подхода заключается в том, что он обеспечивает точное представление изменений данных. Недостаток — высокие вычислительные затраты, поскольку требуется создавать и хранить три набора данных: исходное состояние таблицы, текущее состояние и «дельту». Кроме того, нагрузка на ХД значительно возрастает, поскольку метод плохо масштабируется в приложениях с высокими транзакционными нагрузками, что снижает скорость обновления данных.
Другой метод сбора данных об изменениях на уровне приложения — использование триггеров базы данных и создание собственного журнала изменений в теневых таблицах. Триггеры срабатывают до или после команд INSERT, UPDATE или DELETE и используются для создания журнала изменений, на который «подписываются» целевые системы хранения.
Недостаток подхода в том, что триггеры необходимы для каждой таблицы в источнике, что также снижает производительность. Преимущества — теневые таблицы обеспечивают качественное описание изменений.
Базы данных содержат журналы транзакций, в которых хранятся все события, что позволяет восстановить их в случае сбоя. При сборе данных об изменениях новые транзакции считываются из собственных журналов исходных баз данных. Новые записи фиксируются без внесения изменений на уровне приложения и без необходимости сканирования таблиц.
Поиск изменений на основе журналов
Преимущества подхода: минимальное влияние на производительность системы, поскольку для каждой транзакции не требуется дополнительных запросов, нет необходимости добавлять дополнительные таблицы. Недостаток этого подхода в том, что анализ внутреннего формата БД представляет собой сложную задачу, поскольку большинство систем не документируют этот формат и не информируют об изменениях в нем при выходе новых версий. Это потенциально потребует изменения логики анализа журнала с каждой новой версией. Кроме того, понадобится система для управления метаданными событий изменений исходной базы данных.
Таким образом, когда в таблице источника данных добавляется, обновляется или удаляется строка, CDC формирует запись о произошедшем изменении с указанием первичного ключа строки и передает поток изменений в ХД (или иную целевую систему хранения).
При этом должны соблюдаться следующие требования:
В некоторых случаях в потоке изменений поддерживаются записи только об обновлении и удалении, а добавление строки рассматривается как частный случай обновления. В этом случае запись о добавлении строки будет выглядеть так же, как запись об обновлении.
Другие материалы по теме: