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

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

Вступление

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

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

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

Предпосылки

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

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

  • Сервер Debian 9 с установленным Apache Kafka, выступающий в качестве источника резервной копии. Следуйте инструкциям Как установить Apache Kafka на Debian 9, чтобы настроить установку Kafka, если Kafka еще не установлен на исходном сервере.

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

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

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

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

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

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

ssh @

Выполните следующую команду, чтобы войти в систему как пользователь * kafka *:

sudo -iu kafka

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

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

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

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

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

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

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

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

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

OutputTest Message 1

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

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

Шаг 2 - Резервное копирование данных о состоянии ZooKeeper

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

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

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

~ / Kafka / конфигурации / zookeeper.properties

...
...
...
# the directory where the snapshot is stored.
dataDir=/
# 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// //*

Вывод команды + tar: удаление начальных / из имен элементов +, которые можно смело игнорировать.

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

Вы можете запустить + ls + в вашем текущем каталоге, чтобы увидеть ++ как часть вашего вывода.

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

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

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

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

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

~ / Kafka / конфигурации / server.properties

...
...
...
############################# Log Basics #############################

# A comma separated list of directories under which to store log files
log.dirs=

# 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// *

Еще раз, вы можете спокойно игнорировать вывод команды (+ tar: Удаление начальных / из имен членов).

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

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

sudo systemctl start kafka

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

sudo -iu kafka

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

Шаг 4 - Восстановление данных ZooKeeper

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

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

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

sudo systemctl stop kafka

Далее остановите службу ZooKeeper:

sudo systemctl stop zookeeper

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

sudo -iu kafka

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

rm -r //*

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

tar -C / -xzf /home// --strip-components 2

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

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

Шаг 5 - Восстановление данных Кафки

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

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

rm -r *

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

tar -C  -xzf /home// --strip-components 2

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

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

sudo systemctl start kafka

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

sudo systemctl start zookeeper

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

sudo -iu kafka

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

Шаг 6 - Проверка восстановления

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

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

~//bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic  --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 + от имени пользователя root, не являющегося пользователем root. Если в восстановлении нет проблем, вы увидите следующий вывод:

OutputTest Message 1

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

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

Шаг 7. Перенос и восстановление резервной копии на другой сервер Kafka (необязательно)

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

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

Загрузите файлы ` и ` на свой локальный компьютер, выполнив:

scp @:/home// .

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

Output                                                                                                  100%   68KB 128.0KB/s   00:00

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

scp @:/home// .

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

Output                                                                                                       100% 1031KB 488.3KB/s   00:02

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

Output

Выполните следующую команду, чтобы передать файл ++ в + / home // + целевого сервера:

scp  @:/home//

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

scp  @:/home//

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

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

ssh @

Теперь переместите ++ в + / home // +, выполнив:

sudo mv  /home//

Аналогично, выполните следующую команду, чтобы скопировать ++ в + / home // +:

sudo mv  /home//

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

sudo chown kafka /home// /home//

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

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

Заключение

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

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

Related