Как установить Apache Kafka в Ubuntu 18.04

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

Вступление

Apache Kafka - популярный распределенный брокер сообщений, предназначенный для эффективной обработки больших объемов данных в реальном времени. Кластер Kafka не только обладает высокой масштабируемостью и отказоустойчивостью, но также имеет гораздо более высокую пропускную способность по сравнению с другими брокерами сообщений, такими какActiveMQ иRabbitMQ. Хотя он обычно используется в качестве системы обмена сообщениямиpublish/subscribe, многие организации также используют его для агрегирования журналов, поскольку он предлагает постоянное хранилище для опубликованных сообщений.

Система обмена сообщениями «публикация / подписка» позволяет одному или нескольким производителям публиковать сообщения, не учитывая количество потребителей или то, как они будут обрабатывать сообщения. Подписанные клиенты автоматически уведомляются об обновлениях и создании новых сообщений. Эта система более эффективна и масштабируема, чем системы, где клиенты периодически опрашивают, чтобы определить, доступны ли новые сообщения.

В этом руководстве вы установите и используете Apache Kafka 2.1.1 в Ubuntu 18.04.

Предпосылки

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

  • Один сервер Ubuntu 18.04 и пользователь без полномочий root с правами sudo. Следуйте инструкциям, указанным в этомguide, если у вас не настроен пользователь без полномочий root.

  • Не менее 4 ГБ оперативной памяти на сервере. Установки без этого объема ОЗУ могут вызвать сбой службы Kafka, при этомJava virtual machine (JVM) выдает исключение «Недостаточно памяти» во время запуска.

  • OpenJDK 8 установлен на вашем сервере. Чтобы установить эту версию, следуйтеthese instructions по установке определенных версий OpenJDK. Кафка написана на Java, поэтому она требует JVM; тем не менее, его сценарий оболочки запуска имеет ошибку определения версии, которая приводит к тому, что он не запускается с версиями JVM выше 8.

[[step-1 -—- created-a-user-for-kafka]] == Шаг 1. Создание пользователя для Kafka

Поскольку Kafka может обрабатывать запросы по сети, вы должны создать для нее выделенного пользователя. Это минимизирует повреждение вашего компьютера с Ubuntu в случае взлома сервера Kafka. На этом шаге мы создадим специального пользователяkafka, но вы должны создать другого пользователя без полномочий root для выполнения других задач на этом сервере после завершения настройки Kafka.

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

sudo useradd kafka -m

Флаг-m гарантирует, что для пользователя будет создан домашний каталог. Этот домашний каталог,/home/kafka, будет действовать как каталог нашей рабочей области для выполнения команд в разделах ниже.

Установите пароль с помощьюpasswd:

sudo passwd kafka

Добавьте пользователяkafka в группуsudo с помощью командыadduser, чтобы у него были права, необходимые для установки зависимостей Kafka:

sudo adduser kafka sudo

Теперь ваш пользовательkafka готов. Войдите в эту учетную запись, используяsu:

su -l kafka

Теперь, когда мы создали пользователя, специфичного для Kafka, мы можем перейти к загрузке и извлечению двоичных файлов Kafka.

[[step-2 -—- download-and-extract-the-kafka-binaries]] == Шаг 2. Загрузка и извлечение двоичных файлов Kafka

Давайте загрузим и распакуем двоичные файлы Kafka в специальные папки в домашнем каталоге нашего пользователяkafka.

Для начала создайте в/home/kafka каталог под названиемDownloads для хранения ваших загрузок:

mkdir ~/Downloads

Используйтеcurl, чтобы загрузить двоичные файлы Kafka:

curl "https://www.apache.org/dist/kafka/2.1.1/kafka_2.11-2.1.1.tgz" -o ~/Downloads/kafka.tgz

Создайте каталог с именемkafka и перейдите в этот каталог. Это будет базовый каталог установки Kafka:

mkdir ~/kafka && cd ~/kafka

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

tar -xvzf ~/Downloads/kafka.tgz --strip 1

Мы указываем флаг--strip 1, чтобы гарантировать, что содержимое архива извлекается в самом~/kafka/, а не в другом каталоге (например,~/kafka/kafka_2.11-2.1.1/) внутри него.

Теперь, когда мы успешно загрузили и распаковали двоичные файлы, мы можем перейти к настройке Kafka для удаления тем.

[[step-3 -—- configuring-the-kafka-server]] == Шаг 3 - Настройка сервера Kafka

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

Параметры конфигурации Kafka указаны вserver.properties. Откройте этот файл с помощьюnano или вашего любимого редактора:

nano ~/kafka/config/server.properties

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

~/kafka/config/server.properties

delete.topic.enable = true

Сохраните файл и выйдите изnano. Теперь, когда мы настроили Kafka, мы можем перейти к созданию файлов системного модуля для запуска и активации его при запуске.

[[step-4 -—- create-systemd-unit-files-and-start-the-kafka-server]] == Шаг 4 - Создание файлов модулей Systemd и запуск сервера Kafka

В этом разделе мы создадимsystemd unit files для службы Kafka. Это поможет нам выполнять обычные сервисные действия, такие как запуск, остановка и перезапуск Kafka способом, совместимым с другими сервисами Linux.

Zookeeper - это сервис, который Kafka использует для управления состоянием кластера и конфигурациями. Он широко используется во многих распределенных системах как неотъемлемый компонент. Если вы хотите узнать об этом больше, посетите официальныйZookeeper docs.

Создайте файл модуля дляzookeeper:

sudo nano /etc/systemd/system/zookeeper.service

Введите следующее определение объекта в файл:

/etc/systemd/system/zookeeper.service

[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

Раздел[Unit] указывает, что Zookeeper требует, чтобы сеть и файловая система были готовы перед запуском.

Раздел[Service] указывает, что systemd должен использовать файлы оболочкиzookeeper-server-start.sh иzookeeper-server-stop.sh для запуска и остановки службы. Он также указывает, что Zookeeper должен быть перезапущен автоматически, если он выйдет ненормально.

Затем создайте служебный файл systemd дляkafka:

sudo nano /etc/systemd/system/kafka.service

Введите следующее определение объекта в файл:

/etc/systemd/system/kafka.service

[Unit]
Requires=zookeeper.service
After=zookeeper.service

[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

Раздел[Unit] указывает, что этот файл модуля зависит отzookeeper.service. Это обеспечит автоматический запускzookeeper при запуске службыkafka.

Раздел[Service] указывает, что systemd должен использовать файлы оболочкиkafka-server-start.sh иkafka-server-stop.sh для запуска и остановки службы. Это также указывает, что Kafka должен быть перезапущен автоматически, если он выйдет ненормально.

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

sudo systemctl start kafka

Чтобы убедиться, что сервер запустился успешно, проверьте журналы журнала для модуляkafka:

sudo journalctl -u kafka

Вы должны увидеть вывод, похожий на следующий:

OutputJul 17 18:38:59 kafka-ubuntu systemd[1]: Started kafka.service.

Теперь у вас есть сервер Kafka, который прослушивает порт9092.

Хотя мы запустили службуkafka, если бы мы перезагрузили наш сервер, он не запустился бы автоматически. Чтобы включитьkafka при загрузке сервера, запустите:

sudo systemctl enable kafka

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

[[step-5 -—- testing-the-installation]] == Шаг 5. Тестирование установки

Давайте опубликуем и обработаем сообщение“Hello World”, чтобы убедиться, что сервер Kafka работает правильно. Публикация сообщений в Кафке требует:

  • Aproducer, который позволяет публиковать записи и данные в темах.

  • consumer, который читает сообщения и данные из тем.

Сначала создайте тему с именемTutorialTopic, набрав:

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

Вы можете создать производителя из командной строки, используя скриптkafka-console-producer.sh. Он ожидает имя хоста, порт и имя темы сервера Kafka в качестве аргументов.

Опубликуйте строку"Hello, World" в темеTutorialTopic, набрав:

echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null

Затем вы можете создать потребителя Kafka, используя скриптkafka-console-consumer.sh. Он ожидает имя хоста и порт сервера ZooKeeper, а также имя темы в качестве аргументов.

Следующая команда использует сообщения отTutorialTopic. Обратите внимание на использование флага--from-beginning, который позволяет использовать сообщения, опубликованные до запуска потребителя:

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

Если проблем с конфигурацией нет, вы должны увидетьHello, World в своем терминале:

OutputHello, World

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

Когда вы закончите тестирование, нажмитеCTRL+C, чтобы остановить потребительский сценарий. Теперь, когда мы проверили установку, давайте перейдем к установке KafkaT.

[[step-6 -—- install-kafkat-optional]] == Шаг 6. Установите KafkaT (необязательно)

KafkaT - это инструмент от Airbnb, который упрощает просмотр сведений о вашем кластере Kafka и выполнение определенных административных задач из командной строки. Поскольку это драгоценный камень Ruby, вам понадобится Ruby для его использования. Вам также понадобится пакетbuild-essential, чтобы иметь возможность создавать другие драгоценные камни, от которых он зависит. Установите их с помощьюapt:

sudo apt install ruby ruby-dev build-essential

Теперь вы можете установить KafkaT с помощью команды gem:

sudo gem install kafkat

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

Создайте новый файл с именем.kafkatcfg:

nano ~/.kafkatcfg

Добавьте следующие строки, чтобы указать необходимую информацию о вашем сервере Kafka и экземпляре Zookeeper:

~/.kafkatcfg

{
  "kafka_path": "~/kafka",
  "log_path": "/tmp/kafka-logs",
  "zk_path": "localhost:2181"
}

Теперь вы готовы использовать KafkaT. Для начала, вот как вы могли бы использовать его для просмотра деталей обо всех разделах Kafka:

kafkat partitions

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

OutputTopic                 Partition   Leader      Replicas        ISRs
TutorialTopic         0             0         [0]             [0]
__consumer_offsets    0               0           [0]                           [0]
...
...

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

Чтобы узнать больше о KafkaT, обратитесь к егоGitHub repository.

[[step-7 -—- setting-up-a-multi-node-cluster-optional]] == Шаг 7. Настройка многоузлового кластера (необязательно)

Если вы хотите создать кластер с несколькими брокерами, используя больше компьютеров с Ubuntu 18.04, вы должны повторить Шаг 1, Шаг 4 и Шаг 5 на каждой из новых машин. Кроме того, вы должны внести следующие изменения в файлserver.properties для каждого:

  • Значение свойстваbroker.id следует изменить так, чтобы оно было уникальным во всем кластере. Это свойство уникально идентифицирует каждый сервер в кластере и может иметь любую строку в качестве значения. Например,"server1","server2" и т. Д.

  • Значение свойстваzookeeper.connect следует изменить так, чтобы все узлы указывали на один и тот же экземпляр ZooKeeper. Это свойство указывает адрес экземпляра Zookeeper и следует формату<HOSTNAME/IP_ADDRESS>:<PORT>. Например,"203.0.113.0:2181","203.0.113.1:2181" и т. Д.

Если вы хотите иметь несколько экземпляров ZooKeeper для своего кластера, значение свойстваzookeeper.connect на каждом узле должно быть идентичной, разделенной запятыми строкой, в которой перечислены IP-адреса и номера портов всех экземпляров ZooKeeper.

[[step-8 -—- Restricting-the-kafka-user]] == Шаг 8 - Ограничение пользователя Kafka

Теперь, когда все установки выполнены, вы можете удалить права администратора пользователяkafka. Прежде чем сделать это, выйдите из системы и снова войдите в нее как любой другой пользователь sudo без полномочий root. Если вы все еще используете тот же сеанс оболочки, с которого начали это руководство, просто введитеexit.

Удалите пользователяkafka из группы sudo:

sudo deluser kafka sudo

Чтобы еще больше повысить безопасность вашего сервера Kafka, заблокируйте пароль пользователяkafka с помощью командыpasswd. Это гарантирует, что никто не сможет напрямую войти на сервер, используя эту учетную запись:

sudo passwd kafka -l

На этом этапе только пользователь root или sudo может войти в систему какkafka, введя следующую команду:

sudo su - kafka

В будущем, если вы захотите разблокировать его, используйтеpasswd с опцией-u:

sudo passwd kafka -u

Вы успешно ограничили права администратора пользователяkafka.

Заключение

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

Related