Стаття також доступна російською (перейти до перегляду).
Вступ
- Що таке брокер повідомлень
- Особливості Apache Kafka
- Створення умов та програмного середовища для встановлення серверу Apache Kafka
- Завантаження та розміщення програми на сервері Ubuntu
- Конфігурування серверу Apache Kafka
- Запуск серверу Apache Kafka
- Тестування серверу Apache Kafka
- Підвищення рівня безпеки при роботі з кластером Kafka
Використання брокерів повідомлень дозволяє забезпечити швидкий зв’язок між компонентами розподілених систем, спростити масштабування. Існує кілька типів брокерів, орієнтованих на виконання певних задач. Зокрема, для систем обміну повідомленнями для публікації або підписки критичним показником є швидкість обробки даних, що вимагає наявності брокера із відповідними характеристиками. 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
Користувач успішно створений. Додамо його до групи користувачів з правами sudo:
$ sudo adduser testing_kaf sudo
Результат – Adding user testing_kaf to group sudo Done (Користувач testing_kaf доданий до групи sudo).
Переключимося на створений обліковий запис, не виходячи із системи:
$ su -l testing_kaf
Отже, користувач testing_kaf із правами sudo є активним. Одна умова виконана.
Розгортання OpenJDK
Програма Apache Kafka створена на мові Java і тому для її повноцінного функціонування необхідна наявність віртуальної машини JVM. Розпочнемо процес її створення у нашому середовищі.
Для початку оновимо індекс програмних пакетів Ubuntu:
$ sudo apt update
Перевіримо наявні у репозиторії версії Java:
$ java -version
Оберемо версію 2:1.11-72build2 та розпочнемо процес інсталяції. Наберемо в терміналі команду для встановлення середовища виконання JRE за замовчуванням. Вона встановить JRE із OpenJDK 11:
$ sudo apt install default-jre
Погоджуємося із виділенням додаткових 366 Mb дискового простору, ввівши клавішу Y. Після цього ініціюється процес завантаження пакетів.
Перевіримо коректність інсталяції JRE за допомогою наступної команди:
$ java -version
Отже, JRE встановлено. Тепер встановимо Java Development Kit (JDK), необхідний для компіляції та запуску певних типів додатків на основі Java. Для цього введемо в терміналі:
$ sudo apt install default-jdk
Інсталяцію завершено. Переконаємося в тому, що компонент JDK встановлений, за допомогою визначення версії компілятору javac:
$ javac -version
Отже, все гаразд – компонент успішно встановлений.
Завантаження та розміщення програми на сервері Ubuntu
Скористаємося посиланням на сайт apache.org для завантаження коду Apache Kafka на наш сервер. Наберемо в терміналі:
$ wget https://archive.apache.org/dist/kafka/2.7.0/kafka_2.13-2.7.0.tgz
Файл із кодом отримано. Розпаковуємо його за допомогою наступної команди:
$ 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
Для другого параметру:
delete.topic.enable = true
Збережемо внесені зміни та вийдемо з редактору.
Наступним кроком буде створення 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
У першому розділі вказані вимоги до необхідності готовності мережі та файлової системи. Другий розділ вказує на файли для запуску та зупинки служби. Тут також присутня директива пере завантаження служби у випадку її некоректної роботи.
Після внесення відповідних змін та їх збереження, вийдемо з редактору.
Після цього створимо 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.
Збережемо внесені зміни та вийдемо з редактору.
Запуск серверу Apache Kafka
Запустимо сервер за допомогою наступної команди:
$ sudo systemctl start kafka
Переконаємося в тому, що сервер успішно запустився. Для цього перевіримо журнали модулю Kafka:
$ sudo systemctl status 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 дозволяє використовувати повідомлення, котрі були створені до запуску їх отримувача.
Можна переконатися, що на виході команди ми отримали відправлене нами повідомлення – 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
Результат – «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 Автор: Ровнік Олександр
|
|
Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами: