Как сделать резервную копию, импортировать и перенести данные Apache Kafka в Ubuntu 18.04

Автор выбралTech Education Fund для получения пожертвования в рамках программыWrite for DOnations.

Вступление

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

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

В этом руководстве вы будете выполнять резервное копирование, импорт и миграцию данных Kafka в одной установке Ubuntu 18.04, а также в нескольких установках Ubuntu 18.04 на отдельных серверах. ZooKeeper является критически важным компонентом работы Kafka. Он хранит информацию о состоянии кластера, такую ​​как данные о потребителе, данные о разделах и состояние других посредников в кластере. Таким образом, вы также создадите резервную копию данных ZooKeeper в этом руководстве.

Предпосылки

Чтобы следовать, вам понадобится:

  • Сервер Ubuntu 18.04 с как минимум 4 ГБ ОЗУ и пользователем sudo без полномочий root, настроенный следующим образомthe tutorial.

  • Сервер Ubuntu 18.04 с установленным Apache Kafka в качестве источника резервной копии. Следуйте руководствуHow To Install Apache Kafka on Ubuntu 18.04, чтобы настроить установку Kafka, если Kafka еще не установлен на исходном сервере.

  • OpenJDK 8 установлен на сервере. Чтобы установить эту версию, следуйте этимinstructions при установке определенных версий OpenJDK.

  • Необязательно для шага 7 - еще один сервер Ubuntu 18.04 с установленным Apache Kafka, который будет служить местом назначения резервной копии. Перейдите по ссылке в предыдущей статье, чтобы установить Kafka на конечном сервере. Это обязательное условие требуется только в том случае, если вы перемещаете данные Kafka с одного сервера на другой. Если вы хотите выполнить резервное копирование и импортировать данные Kafka на один сервер, вы можете пропустить это обязательное условие.

[[step-1 -—- created-a-test-topic-and-added-messages]] == Шаг 1. Создание тестовой темы и добавление сообщений

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

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

SSH на исходный сервер, выполнив:

ssh sammy@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-beginning в команде позволяет использовать сообщения, опубликованные до запуска потребителя. Если этот флажок не установлен, будут отображаться только сообщения, опубликованные после запуска потребителя. При запуске команды вы увидите следующий вывод в терминале:

OutputTest Message 1

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

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

[[step-2 -—- backing-up-the-zookeeper-state-data]] == Шаг 2. Резервное копирование данных состояния ZooKeeper

Перед резервным копированием фактических данных Kafka необходимо создать резервную копию состояния кластера, хранящегося в ZooKeeper.

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

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

~/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 сообщаютtar создать архив и применить к нему сжатие gzip. Флаг-f указывает имя выходного сжатого архивного файла, которым в данном случае являетсяzookeeper-backup.tar.gz.

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

Вы успешно создали резервную копию данных ZooKeeper. В следующем разделе вы создадите резервную копию фактических данных Kafka.

[[step-3 -—- backing-up-the-kafka-themes-and-messages]] == Шаг 3. Резервное копирование тем и сообщений Kafka

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

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

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

~/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, переключившись на пользователя sudo без полномочий root, а затем запустив:

sudo systemctl start kafka

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

sudo -iu kafka

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

[[step-4 -—- restoring-the-zookeeper-data]] == Шаг 4. Восстановление данных ZooKeeper

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

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

Сначала остановите службу Kafka, набравexit, чтобы переключиться на пользователя sudo без полномочий root, а затем запустите:

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 указываетtar перейти в каталог/tmp/zookeeper перед извлечением данных. Вы указываете флаг--strip 2, чтобыtar извлекал содержимое архива в самом/tmp/zookeeper/, а не в другом каталоге (таком как/tmp/zookeeper/tmp/zookeeper/) внутри него.

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

[[step-5 -—- restoring-the-kafka-data]] == Шаг 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 указываетtar перейти в каталог/tmp/kafka-logs перед извлечением данных. Вы указываете флаг--strip 2, чтобы гарантировать, что содержимое архива извлекается в самом/tmp/kafka-logs/, а не в другом каталоге (например,/tmp/kafka-logs/kafka-logs/) внутри него.

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

sudo systemctl start kafka

Запустите сервис ZooKeeper с помощью:

sudo systemctl start zookeeper

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

sudo -iu kafka

Вы восстановили данныеkafka, вы можете перейти к проверке успешности восстановления в следующем разделе.

[[шаг-6 -—- проверка-реставрация]] == Шаг 6 - Проверка реставрации

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

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

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

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

Output[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 без полномочий root. Если в восстановлении нет проблем, вы увидите следующий вывод:

OutputTest Message 1

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

Теперь, когда вы проверили восстановленные данные Kafka, это означает, что вы успешно создали резервную копию и восстановили свои данные в одной установке Kafka. Вы можете перейти к шагу 7, чтобы увидеть, как перенести данные кластера и разделов в установку на другом сервере.

[[step-7 -—- migrating-and-restoring-the-backup-to-another-kafka-server-optional]] == Шаг 7. Перенос и восстановление резервной копии на другой сервер Kafka (необязательно)

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

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

Загрузите файлыzookeeper-backup.tar.gz иkafka-backup.tar.gz на локальный компьютер, выполнив:

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

Вы увидите вывод, похожий на:

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

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

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

Вы увидите следующий вывод:

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

Запуститеls в текущем каталоге вашего локального компьютера, вы увидите оба файла:

Outputkafka-backup.tar.gz zookeeper.tar.gz

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

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

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

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

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

SSH на целевой сервер, выполнив:

ssh sammy@destination_server_ip

Теперь переместитеzookeeper-backup.tar.gz в/home/kafka/, выполнив:

sudo mv zookeeper-backup.tar.gz /home/sammy/zookeeper-backup.tar.gz

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

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

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

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

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

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

Заключение

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

Чтобы удаленно хранить резервные копии файлов, таких какzookeeper-backup.tar.gz иkafka-backup.tar.gz, вы можете изучитьDigital Ocean Spaces. Если Kafka - единственная служба, работающая на вашем сервере, вы также можете изучить другие методы резервного копирования, такие как полный экземплярbackups.

Related