MySQL CDC в BigQuery: почему периодические синхронизации теряют данные, и как binlog это исправляет
MySQL CDC to BigQuery: what periodic syncs miss, and how binlog avoids it

Периодические SELECT-синхронизации видят только текущее состояние таблицы: они пропускают удаления и промежуточные изменения строк. Change Data Capture (CDC) читает бинарный лог MySQL (binlog) и захватывает каждое INSERT, UPDATE и DELETE в порядке их выполнения. В статье разбираются обязательные настройки MySQL для CDC: ROW-формат, FULL row images, отключение PARTIAL_JSON, права REPLICATION SLAVE/CLIENT, уникальный server-id и достаточный срок хранения binlog. Также рассматривается загрузка изменений в BigQuery и сравнение с полными батч-синками.
Пайплайн, который доставляет неполные данные вовремя, хуже, чем тот, который иногда отстаёт на несколько минут, но никогда не ошибается.
- karakanb
Дисклеймер: я сооснователь Bruin (https://github.com/bruin-data/bruin), мы конкурент Erathos.
Похоже, это относительно прямолинейная маркетинговая статья. Тем не менее, я был приятно удивлён, узнав о Erathos — хороший продукт!
Лично я не большой фанат CDC в проде. Потоковая передача данных в целом подвержена путанице и способствует плохим паттернам данных, таким как жёсткие удаления без журналов аудита, отсутствие временных меток при обновлениях или удалениях и т.д., что обычно является причиной, по которой нельзя использовать пакетные загрузки. Они требуют приличного операционного понимания базовой базы данных и имеют некоторые подводные камни, о которых упомянули ребята из Erathos в статье. Мы предлагаем CDC как в нашей облачной платформе, так и в наших инструментах с открытым исходным кодом, но если бы я мог выбирать, я бы всегда выбрал инкрементальную пакетную загрузку с курсором вместо CDC-соединения.
Я понимаю, что иногда это требуется из-за организационной сложности или устаревших баз данных, это лишь моё личное предпочтение.
Если кто-то ищет инструмент CDC с открытым исходным кодом, работающий как автономный Go CLI, обратите внимание на ingestr: https://github.com/bruin-data/ingestr
- gpaulbagetti
Написал это после того, как слишком много раз видел один и тот же сбой: задание синхронизации MySQL, которое выглядит нормально на дашборде, но месяцами молча теряет удаления и промежуточные обновления, потому что сравнивает снимки вместо чтения binlog. Попытался изложить, что именно должно быть настроено на стороне MySQL (row image, binlog_row_value_options, server-id, retention), чтобы CDC действительно был полным, а не просто «в конечном счёте согласованным». Готов углубиться в любую из этих тем в комментариях.