Kafka-backup: Поддержка резервного копирования на определенный момент времени

Созданный на 8 апр. 2020  ·  13Комментарии  ·  Источник: itadventurer/kafka-backup

Это одноразовый инструмент (это означает, что его не нужно запускать в фоновом режиме после завершения резервного копирования), поэтому использование фонового процесса демона забавно. Нет необходимости запускать kafka-connect как демон.

enhancement help wanted

Все 13 Комментарий

Вы правы насчет процедуры восстановления. Восстановление - это разовое мероприятие.
Резервное копирование - это непрерывное действие. В Kafka нет сообщения «Я закончил резервное копирование», поскольку данные Kafka - это поток, и ему нет конца. Конечно, вы можете предположить, что если вы не получали никаких новых данных в течение x секунд, значит, вы «закончили», но вы не можете обобщать это.
Взгляните на # 46 и # 54, чтобы узнать больше.

56: затем:

@itadventurer

Резервное копирование - это непрерывное действие.

Это предполагает непрерывный поток данных 24x7x365, что не относится ко всем случаям. В нашем случае поток выполняется только X часов в день, резервное копирование происходит только после этого и фактически предназначено как ежедневное резервное копирование / снимок данных.

Я думаю, что должен быть способ (внутренне) обнаружить, что не было никаких новых сообщений в течение X времени (возможно, настраиваемого интервала), после которого процесс резервного копирования будет корректно завершен и, таким образом, завершится процесс.

Другой (возможно, более простой) альтернативой этому было бы резервное копирование сообщений только до отметки времени, когда резервное копирование было начато. Не уверен, как это будет работать вместе с резервными смещениями. Может быть, сначала резервные смещения, затем мы узнаем временную метку, в которую мы создали резервные копии смещений, и мы можем создавать резервные копии сообщений до этой временной метки.

Я понимаю вашу точку зрения. Да, наверное, было бы неплохо иметь способ делать резервные копии на определенный момент времени: думаю:
Хотя это нетривиально, так как нет простого способа решить, «закончился» ли поток.

Что вы можете сделать в вашем случае:

  • Пусть Kafka Backup работает в фоновом режиме
  • Kafka Backup непрерывно записывает данные в файловую систему в фоновом режиме.
  • kill -9 Kafka Backup, как только он "завершится", т.е. закончит запись ваших данных. Это должно произойти сразу после того, как вы закончили создание данных.
  • переместите данные Kafka Backup в новое место назначения.

Я понимаю, что это довольно распространенный вариант использования, и я предоставлю дополнительную документацию по этому поводу с №2. Для v0.1 документация - это последняя большая проблема, поэтому, надеюсь, это должно произойти в ближайшее время;)


Я вижу следующий подход

  • # 54 представляет новый автономный инструмент командной строки. Инструмент CLI должен поддерживать это.
  • Мы добавляем новый флаг --snapshot к инструменту CLI (или добавляем новый инструмент под названием backup-snapshot.sh )

Как определить, когда резервное копирование "завершено" (применимо, только если установлен флаг --snapshot ):

  • Мы запоминаем время, когда началось резервное копирование. Все записи с более новой меткой времени игнорируются во время резервного копирования.
  • Когда раздел не производит никаких новых данных в течение некоторого времени (например, 20 секунд), мы предполагаем, что новых данных нет.

Что вы думаете?

Пусть Kafka Backup работает в фоновом режиме

Проблема именно в этом шаге. Мы не можем держать его в фоновом режиме. У нас есть только определенное окно, когда мы можем сделать снимок. Не нам решать, когда мы можем сделать резервную копию, это внешние нормативные требования.

Мы запоминаем время, когда началось резервное копирование. Все записи с более новой меткой времени игнорируются во время резервного копирования.

Да, это именно то, что я имел в виду, и я думаю, что это устранит необходимость запуска в фоновом режиме (и попытки поймать момент, когда все продюсеры закончат).

Когда раздел не производит никаких новых данных в течение некоторого времени (например, 20 секунд), мы предполагаем, что новых данных нет.

Я считаю, что этот вариант является взаимоисключающим с другим. И я думаю, что первый лучше, поскольку он дает конкретную точку отсчета и не полагается на поиск окна, когда нет сообщений.

На самом деле я хотел написать, что это практически невозможно с Kafka, но во время написания у меня появилась идея решения:

kafka-consumer-groups возвращает текущую позицию потребителя в разделе, но, что более интересно, возвращает текущее конечное смещение каждого конкретного раздела. Это означает, что есть способ получить последнее смещение для раздела в определенный момент времени. В настоящее время я не знаю, как это достигается (нужно проверить код).

Итак, теперь есть четкий путь к созданию (более или менее) резервной копии на определенный момент времени:

  1. Получите смещение конца раздела для каждого раздела, подлежащего резервному копированию (где-то здесь: https://github.com/itadventurer/kafka-backup/blob/master/src/main/java/de/azapps/kafkabackup/sink /BackupSinkTask.java#L81)
  2. Использовать каждый раздел
  3. Как только потребляемая запись имеет смещение >= сохраненная для этого раздела помните об этом. Игнорировать все записи в резервной копии. (См. Https://github.com/itadventurer/kafka-backup/blob/master/src/main/java/de/azapps/kafkabackup/sink/BackupSinkTask.java#L63)
  4. Как только все разделы будут обновлены, выведите сообщение в STDOUT
  5. Используйте сценарий оболочки, чтобы обнаружить это сообщение и корректно завершить соединение kafka. Аналогично тому, как это решается при восстановлении: https://github.com/itadventurer/kafka-backup/blob/master/bin/restore-standalone.sh#L232 -L252

Вы видите, что это действительно не так уж и тривиально.

В настоящее время я сосредоточен на улучшении набора тестов и стабилизации Kafka Backup для первого выпуска (см. Https://github.com/itadventurer/kafka-backup/milestone/1). Я не могу дать вам расчетное время прибытия для этой функции. Я был бы более чем счастлив просмотреть PR для этого (и я также ищу дополнительных сопровождающих;)) Я рад помочь, если есть какие-либо вопросы

Вы видите, что это действительно не так уж и тривиально.

Я больше занимаюсь операциями (например, настройка, мониторинг кластеров Kafka и т. Д.). Так что я доверяю вам в этом вопросе. Я хочу сказать, что с моей стороны работы это то, что мне (и почти наверняка многим другим) действительно нужно.

Я был бы более чем счастлив просмотреть PR для этого (и я также ищу дополнительных сопровождающих;))

Я не настолько хорош в Java / Scala, чтобы мне здесь сильно помочь. Если бы это был Python, C / C ++ или хотя бы Go, я мог бы помочь: P

Привет!
сначала - я рад найти ваше решение, потому что мне нужно сделать резервную копию данных темы kafka
во-вторых - к сожалению, я не смог ничего написать на Java / Scala, поэтому я подготовил для вас «оболочку» backup-standalone.sh с python для решения полного резервного копирования.
https://gist.github.com/FloMko/7adf2e00cd80fe7cc88bb587cde999ce
Было бы приятно видеть любые обновления о любой встроенной поддержке резервного копирования на определенный момент времени.

Привет,
Спасибо вам за вашу работу! В качестве временного обходного пути я мог бы представить, чтобы добавить это как дополнительный скрипт к этому репо и заменить его позже встроенным решением. Не стесняйтесь добавить это как запрос на вытягивание :) (в ./bin/kafka-backup-point-in-time.py или что-то еще;))

Я собираюсь опубликовать совершенно отдельную реализацию, написанную на Go, которая не полагается на API подключения. Просто к вашему сведению. Мы уже используем его в нашей производственной среде.

@akamensky не могли бы вы поделиться своим решением? насколько вы протестировали свое решение, все будет в порядке

@FloMko, мы только что опубликовали его. Вы можете найти его (а также перестроенный двоичный файл) здесь

Спасибо @WesselVS за ваш PR # 99! Я только что слил его в master. Вскоре будет выпущен выпуск с этим улучшением и некоторыми другими исправлениями.

@akamensky Круто! Приятно видеть еще кое-что, связанное с резервным копированием Kafka;)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги