Резервное копирование, импорт и перемещение данных Apache Kafka в Ubuntu 18.04

Резервное копирование данных Apache Kafka является важной частью работы с данными. Регулярный бэкап поможет восстановиться после случайной потери данных или устранить неправильные данные, добавленные в кластер по ошибке пользователя. Эффективным способом резервного копирования и восстановления являются дампы данных кластера и разделов.

Импорт и миграция резервных копий данных на отдельный сервер полезны в ситуациях, когда экземпляр Kafka становится непригодным для работы из-за аппаратного или сетевого сбоя, и вам необходимо создать новый экземпляр со старыми данными. Также эти процедуры полезны при перемещении экземпляра Kafka на другой сервер из-за изменения в использовании ресурсов.

Данный мануал научит вас выполнять резервное копирование, импортировать и перемещать данные Kafka в Ubuntu 18.04 (как на одном, так и на нескольких серверах). ZooKeeper – неотъемлемый компонент работы Kafka. Он хранит информацию о состоянии кластера, пользовательские данные, состояние других брокеров в кластере. Потому мануал включает и бэкап данных ZooKeeper.

Требования

  • Сервер Ubuntu 18.04, настроенный по этому мануалу (4 Гб RAM минимум).
  • Сервер Ubuntu 18.04 с экземпляром Apache Kafka. Этот сервер будет источником данных для бэкапа. Чтобы установить Apache Kafka, выполните мануал Установка Apache Kafka в Ubuntu 18.04.
  • OpenJDK 8 (установить эту версию поможет этот мануал).
  • Опционально (для раздела 7) еще один сервер Ubuntu 18.04 с установкой Apache Kafka. Он будет целевым сервером для передачи резервных копий. Этот сервер нужен только в том случае, если вы собираетесь переместить данные Apache Kafka с одной машины на другую.

1: Создание тестовой темы и добавление сообщений

Сообщение в Kafka – самая основная единица хранения данных, это объект, который можно опубликовать и на который можно подписаться. Тема Kafka – это что-то типа контейнера для группы связанных сообщений. Когда вы подписываетесь на определенную тему, вы будете получать только сообщения, которые были опубликованы в этой конкретной теме. Сейчас войдите на сервер, данные которого вы хотите скопировать (исходный сервер), и добавите тему Kafka и сообщение, чтобы у вас были какие-то тестовые данные.

В этом мануале предполагается, что вы установили Kafka в домашний каталог пользователя kafka (/home/kafka/kafka). Если ваша установка находится в другом каталоге, измените часть ~/kafka в командах, в которых указан путь к установке.

Подключитесь по SSH:

ssh 8host@source_server_ip

Запустите эту команду, чтобы войти как пользователь kafka:

sudo -iu kafka

Создайте тему BackupTopic, используя служебный файл оболочки kafka-topics.sh в каталоге bin вашей установки Kafka:

~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic BackupTopic

Опубликуйте строку «Test Message 1» в теме BackupTopic с помощью служебного сценария оболочки ~/kafka/bin/kafka-console-producer.sh.

Если вы хотите добавить дополнительные сообщения, вы можете сделать это сейчас.

echo "Test Message 1" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic BackupTopic > /dev/null

Файл ~/kafka/bin/kafka-console-producer.sh позволяет публиковать сообщения непосредственно из командной строки. Обычно сообщения публикуются через клиентскую библиотеку Kafka, внутри вашей программы, но поскольку для этого требуются разные настройки для разных языков программирования, вы можете использовать сценарий оболочки как независимый от языка способ публикации сообщений во время тестирования или выполнения административных задач. Флаг —topic указывает тему, в которой будет опубликовано сообщение.

Затем убедитесь, что сценарий kafka-console-producer.sh опубликовал сообщение(я), выполнив следующую команду:

~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic BackupTopic --from-beginning

Сценарий оболочки ~/kafka/bin/kafka-console-consumer.sh запускает потребителя. После запуска он будет подписываться на сообщения из темы, опубликованной вами в сообщении «Test Message 1» в предыдущей команде. Флаг —from-begin в команде позволяет получить доступ к сообщениям, опубликованным до запуска потребителя. Если этот флажок не установлен, будут отображаться только сообщения, опубликованные после запуска потребителя. Запустив команду, вы увидите следующий вывод в терминале:

Test Message 1

Нажмите CTRL+C, чтобы остановить потребителя.

Теперь у вас есть тестовые данные, и вы можете получить к ним доступ.

2: Резервное копирование данных ZooKeeper

Прежде чем приступить к бэкапу данных Kafka, нужно скопировать состояние кластера, которое хранит ZooKeeper.

ZooKeeper хранит свои данные в каталоге, указанном в поле dataDir в файле конфигурации ~/kafka/config/zookeeper.properties. Вам необходимо прочитать значение этого поля, чтобы определить каталог для резервного копирования. По умолчанию dataDir указывает на каталог /tmp/zookeeper . Если в вашей установке значение отличается, замените /tmp/zookeeper этим значением в следующих командах.

Вот примерный вывод ~/kafka/config/zookeeper.properties:

...
...
...
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
...
...
...

Теперь, когда у вас есть путь к каталогу, вы можете создать сжатый файл его содержимого. Сжатые архивные файлы лучше простых файлов, они экономят место на диске. Запустите следующую команду:

tar -czf /home/kafka/zookeeper-backup.tar.gz /tmp/zookeeper/*

Вывод команды можно смело игнорировать:

tar: Removing leading / from member names

Флаги -c и -z создают архив и применяют к нему сжатие gzip. Флаг -f указывает имя выходного сжатого архивного файла, в данном случае это zookeeper-backup.tar.gz.

Запустите ls в текущем каталоге и убедитесь, что в нем есть zookeeper-backup.tar.gz.

Если файл есть – значит, бэкап прошел успешно.

3: Резервное копирование тем и сообщений Kafka

В этом разделе вы создадите резервную копию каталога данных Kafka в сжатый tar-файл, как вы делали это для ZooKeeper на предыдущем шаге.

Kafka хранит темы, сообщения и внутренние файлы в каталоге, указанном в поле log.dirs в файле конфигурации ~/kafka/config/server.properties. Вам необходимо прочитать значение этого поля, чтобы определить каталог для резервного копирования. По умолчанию и в вашей текущей установке log.dirs указывает на каталог /tmp/kafka-logs. Если в вашей установке это не так, укажите в следующих командах правильное значение.

Вот так примерно выглядит вывод файла ~/kafka/config/server.properties:

...
...
...
############################# Log Basics #############################
# A comma separated list of directories under which to store log files
log.dirs=/tmp/kafka-logs
# The default number of log partitions per topic. More partitions allow greater
# parallelism for consumption, but this will also result in more files across
# the brokers.
num.partitions=1
# The number of threads per data directory to be used for log recovery at startup and flushing at shutdown.
# This value is recommended to be increased for installations with data dirs located in RAID array.
num.recovery.threads.per.data.dir=1
...
...
...

Сначала остановите сервис Kafka, чтобы данные в каталоге log.dirs находились в согласованном состоянии при создании архива tar. Чтобы сделать это, вернитесь в сессию пользователя без прав root на сервере, введя команду exit, а затем выполните следующую команду:

sudo systemctl stop kafka

После остановки Kafka войдите в систему как пользователь kafka:

sudo -iu kafka

Останавливать/запускать сервисы Kafka и ZooKeeper нужно от имени пользователя sudo (не root), поскольку согласно мануалу по установке Apache Kafka вы ограничили пользователя kafka в качестве меры безопасности. Это отключает доступ sudo для пользователя kafka, что приводит к невозможности выполнения команд.

Теперь создайте сжатый файл содержимого каталога, выполнив следующую команду:

tar -czf /home/kafka/kafka-backup.tar.gz /tmp/kafka-logs/*

Снова можете спокойно игнорировать вывод команды:

tar: Removing leading / from member names

Вы можете запустить ls в текущем каталоге, чтобы увидеть в нем файл kafka-backup.tar.gz.

Затем можно снова запустить Kafka – если вы не хотите сразу восстанавливать данные. Введите команду exit, чтобы переключиться на пользователя без полномочий root, и затем запустите:

sudo systemctl start kafka

Войдите как пользователь kafka:

sudo -iu kafka

Вы успешно создали резервную копию данных Kafka. Теперь вы можете попробовать восстановить данные о состоянии кластера, хранящиеся в ZooKeeper.

4: Восстановление данных ZooKeeper

В этом разделе мы восстановим данные о состоянии кластера, которые Kafka создает, когда пользователь выполняет такие операции, как создание раздела, добавление/удаление дополнительных нод, добавление и потребление сообщений и так далее. Вы узнаете, как восстановить данные в существующей исходной установке, удалив каталог данных ZooKeeper и восстановив содержимое файла zookeeper-backup.tar.gz. Если вы хотите восстановить данные на другом сервере, см. раздел 7.

Сейчас нужно остановить Kafka и ZooKeeper, чтобы сохранить целостность данных.

Остановите Kafka. Введите exit, чтобы переключиться на пользователя sudo, а затем запустите:

sudo systemctl stop kafka

Затем остановите сервис ZooKeeper:

sudo systemctl stop zookeeper

Переключитесь на пользователя kafka:

sudo -iu kafka

Затем вы можете безопасно удалить существующий каталог данных кластера с помощью следующей команды:

rm -r /tmp/zookeeper/*

Теперь восстановите данные, резервные копии которых вы создали в разделе 2:

tar -C /tmp/zookeeper -xzf /home/kafka/zookeeper-backup.tar.gz --strip-components 2

Флаг -C переходит в каталог /tmp/zookeeper перед извлечением данных. Флаг —strip 2 извлечет содержимое архива в /tmp/zookeeper, а не в другой каталог (например, /tmp/zookeeper/tmp/zookeeper/)  внутри него.

Теперь попробуем восстановить данные Kafka.

5: Восстановление данных Kafka

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

Удалите каталог данных Kafka:

rm -r /tmp/kafka-logs/*

Теперь, когда вы удалили данные, ваша установка Kafka напоминает свежую установку, в которой нет тем и сообщений. Чтобы восстановить резервные копии данных, распакуйте файлы:

tar -C /tmp/kafka-logs -xzf /home/kafka/kafka-backup.tar.gz --strip-components 2

Флаг -C переходит в каталог /tmp/kafka-logs перед извлечением данных. Флаг —strip 2 извлечет содержимое архива в /tmp/kafka-logs, а не в другой каталог (например, /tmp/kafka-logs/kafka-logs/) внутри него.

Теперь, когда вы успешно извлекли данные, вы можете снова запустить сервисы Kafka и ZooKeeper. Введите команду exit, чтобы переключиться на пользователя sudo, а затем запустите:

sudo systemctl start kafka

Чтобы запустить ZooKeeper, введите:

sudo systemctl start zookeeper

Вернитесь к пользователю kafka:

sudo -iu kafka

Вы восстановили данные kafka, а теперь нужно проверить, насколько это было успешно.

6: Проверка восстановления

Чтобы проверить восстановленные данные Kafka, нужно использовать сообщения из темы, созданной в разделе 1.

Подождите несколько минут, пока Kafka запустится, а затем выполните следующую команду, чтобы прочитать сообщения из BackupTopic:

~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic BackupTopic --from-beginning

Если вы получили такое предупреждение, вам нужно подождать, пока Kafka полностью запустится.

[2018-09-13 15:52:45,234] WARN [Consumer clientId=consumer-1, groupId=console-consumer-87747] Connection to node -1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

Повторите предыдущую команду через несколько минут или запустите:

sudo systemctl restart kafka

от имени пользователя sudo. Если данные восстановились без проблем, вы увидите следующий вывод:

Test Message 1

Если вы не получили это сообщение, убедитесь, что вы выполнили все команды в предыдущем разделе.

Проверив восстановленные данные Kafka, вы знаете, что успешно создали резервную копию и можете восстановить свои данные в рамках одного сервера Kafka.

7: Перемещение и восстановление резервной копии Kafka между серверами (опционально)

В этом разделе вы узнаете, как перенести данные Kafka с исходного сервера на целевой. Для этого нужна команда scp – она позволяет загрузить сжатый файл tar.gz в локальную систему. После этого с помощью этой же команды scp вы можете загрузить файлы на целевой сервер. После того как файлы появятся на конечном сервере, вы сможете восстановить резервную копию и убедиться, что миграция прошла успешно.

Файлы резервных копий нужно сначала загрузить локально, а затем – на целевой сервер. Скопировать их непосредственно с исходного на целевой сервер не получится, поскольку у последнего нет SSH-ключа вашего исходного сервера в файле /home/8host/.ssh/authorized_keys и он не может подключиться к нему. Однако локальный компьютер может подключаться к обоим серверам, что избавляет вас от дополнительных настроек SSH-доступа между серверами.

Загрузите файл zookeeper-backup.tar.gz на локальную машину.

scp 8host@source_server_ip:/home/kafka/zookeeper-backup.tar.gz .

Вы получите:

zookeeper-backup.tar.gz                                                   100%   68KB 128.0KB/s   00:00

Затем запустите следующую команду, чтобы загрузить kafka-backup.tar.gz на локальную машину:

scp 8host@source_server_ip:/home/kafka/kafka-backup.tar.gz .

Команда вернет:

kafka-backup.tar.gz                                                                                                       100% 1031KB 488.3KB/s   00:02

В текущем каталоге на локальной машине запустите ls, чтобы проверить наличие этих файлов.

kafka-backup.tar.gz zookeeper.tar.gz

Выполните следующую команду, чтобы передать файл zookeeper-backup.tar.gz в /home/kafka/ на целевом сервере:

scp zookeeper-backup.tar.gz 8host@destination_server_ip:/home/8host/zookeeper-backup.tar.gz

Теперь выполните следующую команду, чтобы передать файл kafka-backup.tar.gz /home/kafka/ на целевом сервере:

scp kafka-backup.tar.gz 8host@destination_server_ip:/home/8host/kafka-backup.tar.gz

Вы успешно загрузили файлы резервных копий на целевой сервер. Поскольку файлы находятся в каталоге /home/8host/, а к нему у пользователя kafka нет доступа, вы можете переместить файлы в каталог /home/kafka/ и изменить права на них.

Подключитесь к целевому серверу по SSH:

ssh 8host@destination_server_ip

Переместите zookeeper-backup.tar.gz в /home/kafka/:

sudo mv zookeeper-backup.tar.gz /home/8host/zookeeper-backup.tar.gz

Затем переместите файл kafka-backup.tar.gz в /home/kafka/:

vsudo mv kafka-backup.tar.gz /home/kafka/kafka-backup.tar.gz

Передайте права на резервные копии пользователю kafka:

sudo chown kafka /home/kafka/zookeeper-backup.tar.gz /home/kafka/kafka-backup.tar.gz

Предыдущие команды mv и chown не будут отображать никаких выходных данных.

Теперь, когда файлы резервных копий находятся на целевом сервере и в правильном каталоге, следуйте командам, перечисленным в разделах 4–6 этого мануала, чтобы восстановить и проверить данные на целевом сервере.

Заключение

В этом мануале вы научились создавать бэкап, импортировать и перемещать данные Kafka в рамках одной установки и между серверами. Чтобы узнать больше о других полезных функциях Kafka, обратитесь к официальной документации Kafka.

Для удаленного хранения резервных копий файлов (zookeeper-backup.tar.gz и kafka-backup.tar.gz) вы можете использовать хранилища объектов. Если Kafka – единственный сервис на вашем сервере, вы также можете рассмотреть другие способы бэкапа, например полное резервное копирование экземпляра.

Tags: , , ,