• База знань
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

Стаття також доступна російською (перейти до перегляду).

Стаття по Apache Kafka. Що це, для чого використовується, як встановити на Ubuntu

Вступ

Використання брокерів повідомлень дозволяє забезпечити швидкий зв’язок між компонентами розподілених систем, спростити масштабування. Існує кілька типів брокерів, орієнтованих на виконання певних задач. Зокрема, для систем обміну повідомленнями для публікації або підписки критичним показником є швидкість обробки даних, що вимагає наявності брокера із відповідними характеристиками. Apache Kafka найбільш повно відповідає вказаному та деяким іншим критеріям, що зробило його доволі популярним засобом у вказаному сегменті. Розглянемо технічні можливості та продемонструємо роботу з ним на практиці.

Що таке брокер повідомлень

Це програмний модуль, який виконує посередницькі функції у комунікаціях між компонентами розподілених систем. Основними елементами будь-якого брокера є видавець повідомлень та їх отримувач або підписник. Брокер визначає протокол взаємодії між ними, тобто встановлює правила, котрі, зокрема, регулюють черговість та час формування повідомлень, час їх зберігання на сервері та деякі інші.

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

  • Для реалізації відкладеного виконання дій;
  • Згладжування пікових навантажень;
  • Відправлення великої кількості повідомлень;
  • Реалізації складної бізнес-логіки розподілених систем;
  • Забезпечення персистентності даних;
  • Організації виконання завдань за розкладом.

Найбільш популярними брокерами, окрім Apache Kafka, є RabbitMQ та Redis, кожний з яких орієнтований на певний напрямок використання.

Особливості Apache Kafka

Програмний засіб є одним з найшвидших серед існуючих брокерів, швидкість обробки повідомлень становить близько 1 млн. за секунду. Окрім того, можна виділити наступні його особливості:

  • Автоматичне інформування клієнтів (підписників) про наявність повідомлень;
  • Генерування «необмеженої» кількості повідомлень;
  • Забезпечення персистентності даних – можливість поновити чи прочитати повідомлення пізніше;
  • Гарантування чіткої послідовності отримання повідомлень підписниками у межах топіків.

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

Створення умов та програмного середовища для встановлення серверу Apache Kafka

Основними вимогами для успішного встановлення та роботи серверу Apache Kafka є наступні:

  • Наявність Linux-серверу під управлінням ОС Ubuntu;
  • Мінімум 4 Gb оперативної пам’яті (ОП) комп’ютеру;
  • Обліковий запис «не root» користувача з правами sudo;
  • OpenJDK версії 11 або вище.

Нами буде використаний сервер під управлінням ОС Ubuntu 22.04, котрий зазвичай використовується для роботи VPS-серверів. Він має 4 Gb ОП і тому перші дві вимоги нами виконані. Тепер сконцентруємося на виконанні останніх двох вимог.

Створення користувача з правами sudo

Створимо користувача із ім’ям testing_kaf. Для цього наберемо в терміналі наступну команду:

$ sudo adduser testing_kaf

Створення користувача testing_kaf

Користувач успішно створений. Додамо його до групи користувачів з правами sudo:

$ sudo adduser testing_kaf sudo

додавання користувача до групи sudo

Результат – Adding user testing_kaf to group sudo Done (Користувач testing_kaf доданий до групи sudo).

Переключимося на створений обліковий запис, не виходячи із системи:

$ su -l testing_kaf

Переключення на користувача testing_kaf

Отже, користувач testing_kaf із правами sudo є активним. Одна умова виконана.

Розгортання OpenJDK

Програма Apache Kafka створена на мові Java і тому для її повноцінного функціонування необхідна наявність віртуальної машини JVM. Розпочнемо процес її створення у нашому середовищі.

Для початку оновимо індекс програмних пакетів Ubuntu:

$ sudo apt update

Оновлення пакетів

Перевіримо наявні у репозиторії версії Java:

$ java -version

Перевірка версії Java

Оберемо версію 2:1.11-72build2 та розпочнемо процес інсталяції. Наберемо в терміналі команду для встановлення середовища виконання JRE за замовчуванням. Вона встановить JRE із OpenJDK 11:

$ sudo apt install default-jre

Встановлення JRE

Погоджуємося із виділенням додаткових 366 Mb дискового простору, ввівши клавішу Y. Після цього ініціюється процес завантаження пакетів.

Процес інсталації JRE

Процес інсталяції JRE

Перевіримо коректність інсталяції JRE за допомогою наступної команди:

$ java -version

Перевірка коректності інсталяції

Отже, JRE встановлено. Тепер встановимо Java Development Kit (JDK), необхідний для компіляції та запуску певних типів додатків на основі Java. Для цього введемо в терміналі:

$ sudo apt install default-jdk

 Встановлення JDK

Процес інсталяції JDK

Інсталяцію завершено. Переконаємося в тому, що компонент JDK встановлений, за допомогою визначення версії компілятору javac:

$ javac -version

Перевірка версії компілятора javac

Отже, все гаразд – компонент успішно встановлений.

Завантаження та розміщення програми на сервері Ubuntu

Скористаємося посиланням на сайт apache.org для завантаження коду Apache Kafka на наш сервер. Наберемо в терміналі:

$ wget https://archive.apache.org/dist/kafka/2.7.0/kafka_2.13-2.7.0.tgz

Завантаження архіву з Apache Kafka

Файл із кодом отримано. Розпаковуємо його за допомогою наступної команди:

$ tar -xzf kafka_2.13-2.7.0.tgz

Розпаковка архіву

Перейдемо до каталогу програми:

$ cd kafka_2.13-2.7.0

перехід в каталог програми

Конфігурування серверу Apache Kafka

Конфігурування будь-якого серверу, VPS, чи іншого є невід’ємною умовою збалансованої роботи усієї системи. У даному випадку це включає встановлення потрібних значень параметрів у конфігураційному файлі server.properties та створення необхідних unit-файлів для підсистеми управління службами systemd.

Спочатку внесемо зміни до конфігураційного файлу. Зміни будуть стосуватися двох опцій – включення можливості видалення топіків або тем (параметр delete.topic.enable), а також фіксацію місцезнаходження файлів журналів (параметр log.dirs).

Відкриємо файл за допомогою редактору та внесемо відповідні зміни:

$ nano config/server.properties

Для першого параметру:

log.dirs=/home/testing_kaf/logs

Редагування файлу server.properties через nano

Для другого параметру:

delete.topic.enable = true

Редагування файлу server.properties через nano

Збережемо внесені зміни та вийдемо з редактору.

Наступним кроком буде створення unit-файлів модулів systemd для служби Kafka. Вони забезпечують такі дії, як запуск, зупинку та перезавантаження служби. Окрім того, Kafka використовує службу Apache ZooKeeper, котра забезпечує управління станами та конфігураціями кластеру. І тому для неї також потрібно буде створити unit-файл.

Створимо спочатку unit-файл для ZooKeeper. Для цього за допомогою редактору створимо пустий файл, до котрого внесемо відповідний код, наведений нижче.

Виклик редактору:

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

Код:

[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target
 
[Service]
Type=simple
User=testing_kaf
ExecStart=/home/testing_kaf/kafka_2.13-2.7.0/bin/zookeeper-server-start.sh /home/testing_kaf/kafka_2.13-2.7.0/config/zookeeper.properties
ExecStop=/home/testing_kaf/kafka_2.13-2.7.0/bin/zookeeper-server-stop.sh
Restart=on-abnormal
 
[Install]
WantedBy=multi-user.target

У першому розділі вказані вимоги до необхідності готовності мережі та файлової системи. Другий розділ вказує на файли для запуску та зупинки служби. Тут також присутня директива пере завантаження служби у випадку її некоректної роботи.

Файл zookeeper.service

Після внесення відповідних змін та їх збереження, вийдемо з редактору.

Після цього створимо unit-файл для служби Kafka:

$ sudo nano /etc/systemd/system/kafka.service
[Unit]
Requires=zookeeper.service
After=zookeeper.service
 
[Service]
Type=simple
User=testing_kaf
ExecStart=/bin/sh -c '/home/testing_kaf/kafka_2.13-2.7.0/bin/kafka-server-start.sh /home/testing_kaf/kafka_2.13-2.7.0/config/server.properties > /home/testing_kaf/kafka_2.13-2.7.0/kafka.log 2>&1'
ExecStop=/home/testing_kaf/kafka_2.13-2.7.0/bin/kafka-server-stop.sh
Restart=on-abnormal
 
[Install]
WantedBy=multi-user.target

У першому розділі встановлено зв’язок служби із сервісом ZooKeeper. Це гарантує автоматичний запуск сервісу при старті служби. У другому розділі визначені файли для виконання робочих дій, так само як і для ZooKeeper.

Файл kafka.service

Збережемо внесені зміни та вийдемо з редактору.

Запуск серверу Apache Kafka

Запустимо сервер за допомогою наступної команди:

$ sudo systemctl start kafka

Запуск серверу Kafka

Переконаємося в тому, що сервер успішно запустився. Для цього перевіримо журнали модулю Kafka:

$ sudo systemctl status kafka

Перевірка журналу модуля Kafka

Нижче наведений результат виконання команди:

? kafka.service
 
     Loaded: loaded (/etc/systemd/system/kafka.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-01-22 16:52:14 UTC; 23s ago
     Main PID: 574146 (sh)
     Tasks: 70 (limit: 2163)
     Memory: 337.3M
     CPU: 6.008s
     CGroup: /system.slice/kafka.service
             ??574146 /bin/sh -c "/home/testing_kaf/kafka_2.13-2.7.0/bin/kafka-server-start.sh /home/testing_kaf/kafka_2.13-2.7>
             ??574147 java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX>
 Jan 22 16:52:14 dedicated systemd[1]: Started kafka.service.

Таким чином ми отримали робочий сервер Kafka, котрий прослуховує порт 9092.

У випадку пере завантаження серверу необхідно примусово запускати служби ZooKeeper та Kafka. Це можна зробити за допомогою наступних команд:

$ sudo systemctl enable zookeeper
$ sudo systemctl enable kafka

При цьому будуть створюватися символічні посилання.

Тестування серверу Apache Kafka

Перевіримо роботу сервера на практиці. Водночас це буде критерієм коректності його інсталяції та зроблених нами налаштувань.

Насамперед, створимо топік або тему нашого каналу із ім’ям NewTopic. Для цього введемо в терміналі:

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

Створення топіка

Отже, тема створена – «Created topic NewTopic».

Тепер опублікуємо перше наше повідомлення (Working with Kafka program) у створеному каналі:

$ echo "Working with Kafka program" | bin/kafka-console-producer.sh --broker-list localhost:9092 --topic NewTopic > /dev/null

Публікація повідомлення в топіку

Після цього створимо отримувача повідомлень Kafka за допомогою сценарію kafka-console-consumer.sh. Тут необхідно буде вказати порт сервера ZooKeeper, а також ім’я хоста та ім’я теми.

Введемо наступну команду:

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

Опція --from-beginning дозволяє використовувати повідомлення, котрі були створені до запуску їх отримувача.

Робота опції --from-beginning

Можна переконатися, що на виході команди ми отримали відправлене нами повідомлення – Working with Kafka program, що є ознакою того, що все працює вірно.

Звертаємо увагу, що сервер продовжує прослуховувати відповідний порт, чекаючи на нові повідомлення від видавця. Перевіримо це. Для цього запустимо нове вікно терміналу та активуємо обліковий запис користувача testing_kaf.

Після цього створимо ще одне повідомлення для публікації:

$ echo "Continue working with Kafka from another terminal" | bin/kafka-console-producer.sh --broker-list localhost:9092 --topic NewTopic > /dev/null

Повідомлення в новому вікні

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

Вивід повідомлення в першому вікні

Можна переконатися, що повідомлення «Continue working with Kafka from another terminal» з’явилося у вікні його отримувача. Отже, все працює.

Щоб зупинити роботу сценарію, достатньо натиснути клавіші CTRL+C. Результат цих дій показаний нижче.

Зупинка роботи сценарію

Служба повідомляє, що було отримано два повідомлення – Processed a total of 2 messages.

Підвищення рівня безпеки при роботі з кластером Kafka

Як відомо, питання безпеки при роботі у мережі є вельми важливими. Ми маємо можливість підвищити її рівень за рахунок анулювання (на постійній основі або тимчасово) адміністраторських прав користувача сервера Apache Kafka.

Для цього зайдемо у систему під будь-яким «не root» користувачем із правами sudo.

Спочатку видалимо користувача testing_kaf із групи sudo:

$ sudo deluser testing_kaf sudo

Видалення користувача з групи sudo

Результат – «Removing user 'testing_kaf' from group 'sudo' ... Done», тобто дія успішно виконана.

Тепер заблокуємо пароль вказаного користувача, що унеможливлює у подальшому вхід у систему будь-кого під цим обліковим записом. Введемо в терміналі:

$ sudo passwd testing_kaf -l

Після цього лише root-користувач або користувач із правами sudo зможуть увійти у систему за допомогою облікового запису testing_kaf.

Це можна буде зробити за допомогою наступної команди:

$ sudo su - testing_kaf

Якщо ж потрібно буде у подальшому розблокувати можливість зміни паролю, можна скористатися наступною командою:

$ sudo passwd testing_kaf -u

Треба зазначити, що можливості брокеру Apache Kafka не обмежуються лише тими, що ми використали на практиці, їх набагато більшими. Зокрема, це стосується забезпечення гнучкого керування роботою кластерів, кожен з котрих може мати кілька брокерів для більш рівномірного розподілу навантаження. Але це виходить за межі нашої статті і тому тут не розглядається.

Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.

Дивіться наш канал Youtube на https://www.youtube.com/freehostua.

Ми у чомусь помилилися, чи щось пропустили?

Напишіть про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.

Дата: 25.01.2024
Автор: Ровнік Олександр
Голосування

Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:

navigate
go
exit
Дякуємо, що обираєте FREEhost.UA