웹사이트 검색

Ubuntu 20.04에 Apache Kafka를 설치하는 방법


저자는 Write for DOnations 프로그램을 선택했습니다.

소개

RabbitMQ. 일반적으로 게시/구독 메시징 시스템으로 사용되지만 게시된 메시지에 대한 영구 저장소를 제공하기 때문에 많은 조직에서 로그 집계에도 사용합니다.

게시/가입 메시징 시스템을 사용하면 하나 이상의 생산자가 소비자 수나 메시지 처리 방법을 고려하지 않고 메시지를 게시할 수 있습니다. 가입한 클라이언트는 업데이트 및 새 메시지 생성에 대해 자동으로 알립니다. 이 시스템은 클라이언트가 새 메시지를 사용할 수 있는지 확인하기 위해 주기적으로 폴링하는 시스템보다 효율적이고 확장 가능합니다.

이 자습서에서는 Ubuntu 20.04에 Apache Kafka 2.8.2를 설치하고 구성합니다.

전제 조건

따라 하려면 다음이 필요합니다.

  • 루트가 아닌 사용자 설정이 없는 경우 초기 서버 설정 가이드. 4GB 미만의 RAM으로 설치하면 Kafka 서비스가 실패할 수 있습니다.
  • Ubuntu 20.04에서 APT로 Java를 설치하는 방법. Kafka는 Java로 작성되었으므로 JVM이 필요합니다.

1단계 - Kafka용 사용자 생성

Kafka는 네트워크를 통해 요청을 처리할 수 있으므로 첫 번째 단계는 서비스 전용 사용자를 생성하는 것입니다. 이렇게 하면 누군가 Kafka 서버를 손상시키는 경우 Ubuntu 시스템의 손상을 최소화할 수 있습니다. 이 단계에서는 전용 kafka 사용자를 생성합니다.

루트가 아닌 sudo 사용자로 서버에 로그인한 다음 kafka라는 사용자를 만듭니다.

  1. sudo adduser kafka

프롬프트에 따라 암호를 설정하고 kafka 사용자를 생성합니다.

다음으로 adduser 명령을 사용하여 sudo 그룹에 kafka 사용자를 추가합니다. Kafka의 종속 항목을 설치하려면 다음 권한이 필요합니다.

  1. sudo adduser kafka sudo

이제 kafka 사용자가 준비되었습니다. su를 사용하여 kafka 계정에 로그인합니다.

  1. su -l kafka

이제 Kafka 관련 사용자를 만들었으므로 Kafka 바이너리를 다운로드하고 추출할 준비가 되었습니다.

2단계 - Kafka 바이너리 다운로드 및 추출

이 단계에서는 Kafka 바이너리를 kafka 사용자 홈 디렉토리의 전용 폴더에 다운로드하고 추출합니다.

시작하려면 다운로드를 저장할 Downloads라는 디렉토리를 /home/kafka에 만듭니다.

  1. mkdir ~/Downloads

curl을 사용하여 Kafka 바이너리를 다운로드합니다.

  1. curl "https://downloads.apache.org/kafka/2.8.2/kafka_2.13-2.8.2.tgz" -o ~/Downloads/kafka.tgz

kafka라는 디렉토리를 만들고 이 디렉토리로 이동합니다. 이 디렉터리를 Kafka 설치의 기본 디렉터리로 사용합니다.

  1. mkdir ~/kafka && cd ~/kafka

tar 명령을 사용하여 다운로드한 아카이브를 추출합니다.

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

--strip 1 플래그를 지정하여 아카이브의 콘텐츠가 다른 디렉터리(예: ~/kafka /kafka_2.13-2.8.2/) 내부에 있습니다.

이제 바이너리를 성공적으로 다운로드하고 추출했으므로 Kafka 서버 구성을 시작할 수 있습니다.

3단계 - Kafka 서버 구성

Kafka 주제는 메시지를 게시할 수 있는 범주, 그룹 또는 피드 이름입니다. 그러나 Kafka의 기본 동작에서는 주제를 삭제할 수 없습니다. 이를 수정하려면 이 단계에서 수행할 구성 파일을 편집해야 합니다.

Kafka의 구성 옵션은 server.properties에 지정됩니다. nano 또는 선호하는 편집기로 이 파일을 엽니다.

  1. nano ~/kafka/config/server.properties

먼저 Kafka 주제를 삭제할 수 있는 설정을 추가합니다. 파일 맨 아래에 다음 줄을 추가합니다.

delete.topic.enable = true

둘째, log.dirs 속성을 수정하여 Kafka 로그가 저장되는 디렉터리를 변경합니다. log.dirs 속성을 찾아 기존 경로를 강조 표시된 경로로 바꿉니다.

log.dirs=/home/kafka/logs

파일을 저장하고 닫습니다.

이제 Kafka를 구성했으므로 시작 시 Kafka 서버를 실행하고 활성화하기 위한 systemd 단위 파일을 생성할 수 있습니다.

4단계 - 시스템 단위 파일 생성 및 Kafka 서버 시작

이 섹션에서는 Kafka 서비스에 대한 systemd 유닛 파일을 생성합니다. 이러한 파일은 다른 Linux 서비스와 일관된 방식으로 Kafka 시작, 중지 및 다시 시작과 같은 일반적인 서비스 작업을 수행하는 데 도움이 됩니다.

Kafka는 공식 Zookeeper 문서를 사용합니다. 이러한 단위 파일과 함께 Zookeper를 서비스로 사용하게 됩니다.

zookeeper에 대한 단위 파일을 만듭니다.

  1. 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] 섹션은 systemdzookeeper-server-start.shzookeeper-server-stop.sh를 사용해야 함을 지정합니다. 서비스 시작 및 중지를 위한 셸 파일. 또한 Zookeeper가 비정상적으로 종료되는 경우 다시 시작해야 함을 지정합니다.

이 콘텐츠를 추가한 후 파일을 저장하고 닫습니다.

다음으로 kafka에 대한 systemd 서비스 파일을 만듭니다.

  1. 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] 섹션은 systemdkafka-server-start.shkafka-server-stop.sh를 사용해야 함을 지정합니다. 서비스 시작 및 중지를 위한 셸 파일. 또한 Kafka가 비정상적으로 종료되는 경우 다시 시작해야 함을 지정합니다.

파일을 저장하고 닫습니다.

이제 단위를 정의했으므로 다음 명령으로 Kafka를 시작합니다.

  1. sudo systemctl start kafka

서버가 성공적으로 시작되었는지 확인하려면 kafka 장치에 대한 저널 로그를 확인하십시오.

  1. 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 서비스를 활성화하려면 다음 명령을 실행합니다.

  1. sudo systemctl enable zookeeper

심볼릭 링크가 생성되었다는 응답을 받게 됩니다.

Output
Created symlink /etc/systemd/system/multi-user.target.wants/zookeeper.service → /etc/systemd/system/zookeeper.service.

그런 다음 다음 명령을 실행합니다.

  1. sudo systemctl enable kafka

심볼릭 링크가 생성되었다는 응답을 받게 됩니다.

Output
Created symlink /etc/systemd/system/multi-user.target.wants/kafka.service → /etc/systemd/system/kafka.service.

이 단계에서는 kafkazookeeper 서비스를 시작하고 활성화했습니다. 다음 단계에서는 Kafka 설치를 확인합니다.

5단계 - Kafka 설치 테스트

이 단계에서는 Kafka 설치를 테스트합니다. Kafka 서버가 예상대로 작동하는지 확인하기 위해 Hello World 메시지를 게시하고 소비합니다.

Kafka에서 메시지를 게시하려면 다음이 필요합니다.

  • 레코드 및 데이터를 주제에 게시할 수 있도록 하는 생산자입니다.
  • 주제에서 메시지와 데이터를 읽는 소비자입니다.

시작하려면 TutorialTopic이라는 주제를 만듭니다.

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

kafka-console-producer.sh 스크립트를 사용하여 명령줄에서 생산자를 생성할 수 있습니다. Kafka 서버의 호스트 이름, 포트 및 주제를 인수로 예상합니다.

주제가 생성되었다는 응답을 받게 됩니다.

Output
Created topic TutorialTopic.

이제 문자열 \Hello, World\TutorialTopic 주제에 게시합니다.

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

다음으로 kafka-console-consumer.sh 스크립트를 사용하여 Kafka 소비자를 만듭니다. 주제 이름과 함께 ZooKeeper 서버의 호스트 이름 및 포트를 인수로 예상합니다. 다음 명령은 TutorialTopic의 메시지를 사용합니다. 소비자가 시작되기 전에 게시된 메시지의 소비를 허용하는 --from-beginning 플래그 사용에 유의하십시오.

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

구성 문제가 없으면 터미널에서 Hello, World 응답을 받게 됩니다.

Output
Hello, World

스크립트는 계속 실행되며 더 많은 메시지가 게시될 때까지 기다립니다. 이를 테스트하려면 새 터미널 창을 열고 서버에 로그인하십시오. kafka 사용자로 로그인해야 합니다.

  1. su -l kafka

이 새 터미널에서 생산자를 시작하여 두 번째 메시지를 게시합니다.

  1. echo "Hello World from Sammy at DigitalOcean!" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null

이 메시지는 원래 터미널의 소비자 출력에 로드됩니다.

Output
Hello, World Hello World from Sammy at DigitalOcean!

테스트가 완료되면 CTRL+C를 눌러 원래 터미널에서 소비자 스크립트를 중지합니다.

이제 Ubuntu 20.04에 Kafka 서버를 설치하고 구성했습니다. 다음 단계에서는 몇 가지 빠른 작업을 수행하여 Kafka 서버의 보안을 강화합니다.

6단계 - Kafka 서버 강화

설치가 완료되면 kafka 사용자의 관리자 권한을 제거하고 Kafka 서버를 강화할 수 있습니다.

그렇게 하기 전에 루트가 아닌 다른 sudo 사용자로 로그아웃했다가 다시 로그인하십시오. 이 자습서를 시작한 것과 동일한 셸 세션을 계속 실행 중인 경우 exit를 입력합니다.

sudo 그룹에서 kafka 사용자를 제거합니다.

  1. sudo deluser kafka sudo

Kafka 서버의 보안을 더욱 강화하려면 passwd 명령을 사용하여 kafka 사용자의 암호를 잠급니다. 이 조치는 아무도 이 계정을 사용하여 서버에 직접 로그인할 수 없도록 합니다.

  1. sudo passwd kafka -l

-l 플래그는 사용자 암호(passwd)를 변경하는 명령을 잠급니다.

이 시점에서 root 또는 sudo 사용자만 다음 명령을 사용하여 kafka로 로그인할 수 있습니다.

  1. sudo su - kafka

나중에 암호 변경 기능을 잠금 해제하려면 -u 옵션과 함께 passwd를 사용하십시오.

  1. sudo passwd kafka -u

이제 kafka 사용자의 관리자 권한을 성공적으로 제한했습니다. Kafka를 사용할 준비가 되었습니다. 선택적으로 시스템에 KafkaT를 추가하는 다음 단계를 따를 수 있습니다.

7단계 - KafkaT 설치(선택 사항)

KafkaT는 Kafka 클러스터에 대한 세부 정보를 보고 명령줄에서 특정 관리 작업을 수행하는 기능을 개선하기 위해 개발되었습니다. Ruby gem이므로 사용하려면 Ruby가 필요합니다. 또한 KafkaT가 의존하는 다른 gem을 빌드하려면 build-essential 패키지가 필요합니다.

apt를 사용하여 Ruby 및 build-essential 패키지를 설치합니다.

  1. sudo apt install ruby ruby-dev build-essential

이제 gem 명령으로 KafkaT를 설치할 수 있습니다.

  1. sudo CFLAGS=-Wno-error=format-overflow gem install kafkat

kafkat의 설치 프로세스 중에 Zookeeper의 경고 및 오류를 억제하려면 Wno-error=format-overflow 컴파일 플래그가 필요합니다.

설치가 완료되면 완료되었다는 응답을 받게 됩니다.

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라는 새 파일을 만듭니다.

  1. nano ~/.kafkatcfg

Kafka 서버 및 Zookeeper 인스턴스에 대한 필수 정보를 지정하려면 다음 행을 추가하십시오.

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

파일을 저장하고 닫습니다. 이제 KafkaT를 사용할 준비가 되었습니다.

모든 Kafka 파티션에 대한 세부 정보를 보려면 다음 명령을 실행해 보십시오.

  1. 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] ... ...

출력에는 클라이언트 관련 정보를 저장하기 위해 Kafka에서 사용하는 내부 주제인 TutorialTopic__consumer_offsets가 포함됩니다. __consumer_offsets로 시작하는 줄은 무시해도 됩니다.

KafkaT에 대한 자세한 내용은 GitHub 리포지토리를 참조하십시오.

결론

이제 Apache Kafka가 Ubuntu 서버에서 안전하게 실행됩니다. Kafka 클라이언트를 사용하여 Kafka를 선호하는 프로그래밍 언어에 통합할 수 있습니다.

Kafka에 대해 자세히 알아보려면 설명서를 참조할 수도 있습니다.