Как да инсталирате Apache Kafka на Ubuntu 20.04
Авторът е избрал програмата Write for DOnations.
Въведение
RabbitMQ. Въпреки че обикновено се използва като система за публикуване/абониране за съобщения, много организации също го използват за събиране на регистрационни файлове, тъй като предлага постоянно съхранение за публикувани съобщения.
Системата за публикуване/абониране на съобщения позволява на един или повече производители да публикуват съобщения, без да вземат предвид броя на потребителите или как ще обработват съобщенията. Абонираните клиенти се уведомяват автоматично за актуализации и създаване на нови съобщения. Тази система е по-ефективна и мащабируема от системите, при които клиентите периодично анкетират, за да определят дали има нови съобщения.
В този урок ще инсталирате и конфигурирате Apache Kafka 2.8.2 на Ubuntu 20.04.
Предпоставки
За да следвате, ще ви трябва:
- Ръководство за първоначална настройка на сървъра, ако не сте настроили различен от root потребител. Инсталации с по-малко от 4 GB RAM може да доведат до отказ на услугата Kafka.
- Как да инсталирате Java с APT на Ubuntu 20.04. Kafka е написан на Java, така че изисква JVM.
Стъпка 1 — Създаване на потребител за Kafka
Тъй като Kafka може да обработва заявки през мрежа, първата ви стъпка е да създадете специален потребител за услугата. Това минимизира щетите на вашата Ubuntu машина в случай, че някой компрометира Kafka сървъра. В тази стъпка ще създадете специален потребител на kafka
.
Влезте във вашия сървър като не-root потребител на sudo
, след което създайте потребител с име kafka
:
- sudo adduser kafka
Следвайте подканите, за да зададете парола и да създадете потребител на kafka
.
След това добавете потребителя kafka
към групата sudo
с командата adduser
. Имате нужда от тези привилегии, за да инсталирате зависимостите на Kafka:
- sudo adduser kafka sudo
Вашият потребител на kafka
вече е готов. Влезте в акаунта kafka
с помощта на su
:
- su -l kafka
Сега, след като сте създали потребител, специфичен за Kafka, вие сте готови да изтеглите и извлечете бинарните файлове на Kafka.
Стъпка 2 — Изтегляне и извличане на бинарните файлове на Kafka
В тази стъпка ще изтеглите и извлечете бинарните файлове на Kafka в специални папки в домашната директория на вашия потребител kafka
.
За да започнете, създайте директория в /home/kafka
, наречена Downloads
, за да съхранявате вашите изтегляния:
- mkdir ~/Downloads
Използвайте curl
, за да изтеглите бинарните файлове на Kafka:
- curl "https://downloads.apache.org/kafka/2.8.2/kafka_2.13-2.8.2.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.13-2.8.2/
) вътре в него.
Сега, след като сте изтеглили и извлекли успешно двоичните файлове, можете да започнете да конфигурирате вашия Kafka сървър.
Стъпка 3 — Конфигуриране на сървъра Kafka
Тема на Kafka е категорията, групата или името на емисия, в която могат да се публикуват съобщения. Въпреки това поведението по подразбиране на Kafka няма да ви позволи да изтриете тема. За да промените това, трябва да редактирате конфигурационния файл, което ще направите в тази стъпка.
Конфигурационните опции на Kafka са посочени в server.properties
. Отворете този файл с nano
или любимия си редактор:
- nano ~/kafka/config/server.properties
Първо добавете настройка, която ще ви позволи да изтриете теми на Kafka. Добавете следния ред в края на файла:
delete.topic.enable = true
Второ, ще промените директорията, където се съхраняват регистрационните файлове на Kafka, като промените свойството log.dirs
. Намерете свойството log.dirs
и заменете съществуващия маршрут с маркирания маршрут:
log.dirs=/home/kafka/logs
Запазете и затворете файла.
Сега, след като сте конфигурирали Kafka, можете да създадете systemd
модулни файлове за стартиране и активиране на сървъра на Kafka при стартиране.
Стъпка 4 — Създаване на модулни файлове systemd и стартиране на сървъра Kafka
В този раздел ще създадете systemd
модулни файлове за услугата Kafka. Тези файлове ще ви помогнат да извършвате обичайни сервизни действия като стартиране, спиране и рестартиране на Kafka по начин, съвместим с други услуги на Linux.
Kafka използва официални документи на Zookeeper. Ще използвате Zookeper като услуга с тези модулни файлове.
Създайте единичния файл за 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=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
shell файлове за стартиране и спиране на услугата. Той също така уточнява, че Zookeeper трябва да се рестартира, ако излезе необичайно.
След като добавите това съдържание, запазете и затворете файла.
След това създайте системния сервизен файл за kafka
:
- sudo nano /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
shell файлове за стартиране и спиране на услугата. Той също така уточнява, че Kafka трябва да се рестартира, ако излезе необичайно.
Запазете и затворете файла.
Сега, след като сте дефинирали единиците, стартирайте Kafka със следната команда:
- sudo systemctl start kafka
За да се уверите, че сървърът е стартиран успешно, проверете журналните регистрационни файлове за модула kafka
:
- sudo systemctl status kafka
Ще получите резултат като този:
Output● kafka.service
Loaded: loaded (/etc/systemd/system/kafka.service; disabled; vendor preset>
Active: active (running) since Wed 2023-02-01 23:44:12 UTC; 4s ago
Main PID: 17770 (sh)
Tasks: 69 (limit: 4677)
Memory: 321.9M
CGroup: /system.slice/kafka.service
├─17770 /bin/sh -c /home/kafka/kafka/bin/kafka-server-start.sh /ho>
└─17793 java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMill>
Вече имате Kafka сървър, който слуша на порт 9092
, който е портът по подразбиране, използван от Kafka сървъра.
Вие стартирахте услугата kafka
. Но ако рестартирате сървъра си, Kafka няма да се рестартира автоматично. За да активирате услугата kafka
при зареждане на сървъра, изпълнете следната команда:
- sudo systemctl enable zookeeper
Ще получите отговор, че е създадена символна връзка:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/zookeeper.service → /etc/systemd/system/zookeeper.service.
След това изпълнете тази команда:
- sudo systemctl enable kafka
Ще получите отговор, че е създадена символна връзка:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/kafka.service → /etc/systemd/system/kafka.service.
В тази стъпка стартирахте и активирахте услугите kafka
и zookeeper
. В следващата стъпка ще проверите инсталацията на Kafka.
Стъпка 5 — Тестване на инсталацията на Kafka
В тази стъпка ще тествате инсталацията на Kafka. Ще публикувате и консумирате съобщение Hello World, за да се уверите, че Kafka сървърът се държи според очакванията.
Публикуването на съобщения в Kafka изисква:
- Продуцент, който позволява публикуването на записи и данни към теми.
- Потребител, който чете съобщения и данни от теми.
За да започнете, създайте тема с име TutorialTopic
:
- ~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic
Можете да създадете продуцент от командния ред, като използвате скрипта kafka-console-producer.sh
. Той очаква името на хоста на Kafka сървъра, порт и тема като аргументи.
Ще получите отговор, че темата е създадена:
OutputCreated topic TutorialTopic.
Сега публикувайте низа 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
Скриптът ще продължи да се изпълнява в очакване на още съобщения за публикуване. За да тествате това, отворете нов терминален прозорец и влезте във вашия сървър. Не забравяйте да влезете като вашия потребител на kafka
:
- su -l kafka
В този нов терминал стартирайте продуцент да публикува второ съобщение:
- echo "Hello World from Sammy at DigitalOcean!" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null
Това съобщение ще се зареди в изхода на потребителя във вашия оригинален терминал:
OutputHello, World
Hello World from Sammy at DigitalOcean!
Когато приключите с тестването, натиснете CTRL+C
, за да спрете потребителския скрипт във вашия оригинален терминал.
Вече сте инсталирали и конфигурирали Kafka сървър на Ubuntu 20.04. В следващата стъпка ще изпълните няколко бързи задачи, за да втвърдите сигурността на вашия Kafka сървър.
Стъпка 6 — Втвърдяване на Kafka сървъра
След завършване на вашата инсталация можете да премахнете администраторските привилегии на потребителя на kafka
и да втвърдите Kafka сървъра.
Преди да го направите, излезте и влезте отново като всеки друг не-root потребител на sudo
. Ако все още изпълнявате същата сесия на обвивката, с която сте започнали този урок, напишете exit
.
Премахнете потребителя kafka
от групата sudo:
- sudo deluser kafka sudo
За да подобрите допълнително сигурността на вашия Kafka сървър, заключете потребителската парола на kafka
с помощта на командата passwd
. Това действие гарантира, че никой не може директно да влезе в сървъра с този акаунт:
- sudo passwd kafka -l
Флагът -l
заключва командата за промяна на паролата на потребител (passwd
).
В този момент само потребител на root
или sudo
може да влезе като kafka
със следната команда:
- sudo su - kafka
В бъдеще, ако искате да отключите възможността за промяна на паролата, използвайте passwd
с опцията -u
:
- sudo passwd kafka -u
Вече успешно сте ограничили администраторските привилегии на потребителя kafka
. Готови сте да започнете да използвате Kafka. По желание можете да следвате следващата стъпка, която ще добави KafkaT към вашата система.
Стъпка 7 — Инсталиране на KafkaT (по избор)
KafkaT е разработен, за да подобри способността ви да преглеждате подробности за вашия клъстер Kafka и да изпълнявате определени административни задачи от командния ред. Тъй като това е скъпоценен камък Ruby, ще ви трябва Ruby, за да го използвате. Ще ви трябва и пакетът build-essential
, за да изградите другите скъпоценни камъни, от които зависи KafkaT
.
Инсталирайте Ruby и пакета build-essential
с помощта на apt
:
- sudo apt install ruby ruby-dev build-essential
Вече можете да инсталирате KafkaT с командата gem
:
- sudo CFLAGS=-Wno-error=format-overflow gem install kafkat
Флагът за компилация Wno-error=format-overflow
е необходим за потискане на предупрежденията и грешките на Zookeeper по време на инсталационния процес на kafkat
.
Когато инсталацията приключи, ще получите отговор, че е готова:
Output...
Done installing documentation for json, colored, retryable, highline, trollop, zookeeper, zk, kafkat after 3 seconds
8 gems installed
KafkaT използва .kafkatcfg
като конфигурационен файл, за да определи директориите за инсталиране и журнал на вашия Kafka сървър. Той също така трябва да има вход, насочващ KafkaT към вашето копие на ZooKeeper.
Създайте нов файл, наречен .kafkatcfg
:
- nano ~/.kafkatcfg
Добавете следните редове, за да посочите необходимата информация за вашия Kafka сървър и екземпляр на Zookeeper:
{
"kafka_path": "~/kafka",
"log_path": "/home/kafka/logs",
"zk_path": "localhost:2181"
}
Запазете и затворете файла. Вече сте готови да използвате KafkaT.
За да видите подробности за всички Kafka дялове, опитайте да изпълните тази команда:
- kafkat partitions
Ще получите следния резултат:
Output[DEPRECATION] The trollop gem has been renamed to optimist and will no longer be supported. Please switch to optimist as soon as possible.
/var/lib/gems/2.7.0/gems/json-1.8.6/lib/json/common.rb:155: warning: Using the last argument as keyword parameters is deprecated
...
Topic Partition Leader Replicas ISRs
TutorialTopic 0 0 [0] [0]
__consumer_offsets 0 0 [0] [0]
...
...
Резултатът ще включва TutorialTopic
и __consumer_offsets
, вътрешна тема, използвана от Kafka за съхраняване на информация, свързана с клиента. Можете спокойно да игнорирате редове, започващи с __consumer_offsets
.
За да научите повече за KafkaT, вижте неговото хранилище на GitHub.
Заключение
Вече имате Apache Kafka, работещ сигурно на вашия Ubuntu сървър. Можете да интегрирате Kafka в любимия си език за програмиране с помощта на клиенти на Kafka.
За да научите повече за Kafka, можете също да се консултирате с неговата документация.