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
라는 사용자를 만듭니다.
- sudo adduser kafka
프롬프트에 따라 암호를 설정하고 kafka
사용자를 생성합니다.
다음으로 adduser
명령을 사용하여 sudo
그룹에 kafka
사용자를 추가합니다. Kafka의 종속 항목을 설치하려면 다음 권한이 필요합니다.
- sudo adduser kafka sudo
이제 kafka
사용자가 준비되었습니다. su
를 사용하여 kafka
계정에 로그인합니다.
- su -l kafka
이제 Kafka 관련 사용자를 만들었으므로 Kafka 바이너리를 다운로드하고 추출할 준비가 되었습니다.
2단계 - Kafka 바이너리 다운로드 및 추출
이 단계에서는 Kafka 바이너리를 kafka
사용자 홈 디렉토리의 전용 폴더에 다운로드하고 추출합니다.
시작하려면 다운로드를 저장할 Downloads
라는 디렉토리를 /home/kafka
에 만듭니다.
- 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_2.13-2.8.2/
) 내부에 있습니다.
이제 바이너리를 성공적으로 다운로드하고 추출했으므로 Kafka 서버 구성을 시작할 수 있습니다.
3단계 - Kafka 서버 구성
Kafka 주제는 메시지를 게시할 수 있는 범주, 그룹 또는 피드 이름입니다. 그러나 Kafka의 기본 동작에서는 주제를 삭제할 수 없습니다. 이를 수정하려면 이 단계에서 수행할 구성 파일을 편집해야 합니다.
Kafka의 구성 옵션은 server.properties
에 지정됩니다. nano
또는 선호하는 편집기로 이 파일을 엽니다.
- 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
에 대한 단위 파일을 만듭니다.
- 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를 사용해야 함을 지정합니다.
서비스 시작 및 중지를 위한 셸 파일. 또한 Zookeeper가 비정상적으로 종료되는 경우 다시 시작해야 함을 지정합니다.
이 콘텐츠를 추가한 후 파일을 저장하고 닫습니다.
다음으로 kafka
에 대한 systemd 서비스 파일을 만듭니다.
- 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를 사용해야 함을 지정합니다.
서비스 시작 및 중지를 위한 셸 파일. 또한 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 설치를 테스트합니다. Kafka 서버가 예상대로 작동하는지 확인하기 위해 Hello World 메시지를 게시하고 소비합니다.
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-console-consumer.sh
스크립트를 사용하여 Kafka 소비자를 만듭니다. 주제 이름과 함께 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
를 눌러 원래 터미널에서 소비자 스크립트를 중지합니다.
이제 Ubuntu 20.04에 Kafka 서버를 설치하고 구성했습니다. 다음 단계에서는 몇 가지 빠른 작업을 수행하여 Kafka 서버의 보안을 강화합니다.
6단계 - Kafka 서버 강화
설치가 완료되면 kafka
사용자의 관리자 권한을 제거하고 Kafka 서버를 강화할 수 있습니다.
그렇게 하기 전에 루트가 아닌 다른 sudo
사용자로 로그아웃했다가 다시 로그인하십시오. 이 자습서를 시작한 것과 동일한 셸 세션을 계속 실행 중인 경우 exit
를 입력합니다.
sudo 그룹에서 kafka
사용자를 제거합니다.
- sudo deluser kafka sudo
Kafka 서버의 보안을 더욱 강화하려면 passwd
명령을 사용하여 kafka
사용자의 암호를 잠급니다. 이 조치는 아무도 이 계정을 사용하여 서버에 직접 로그인할 수 없도록 합니다.
- sudo passwd kafka -l
-l
플래그는 사용자 암호(passwd
)를 변경하는 명령을 잠급니다.
이 시점에서 root
또는 sudo
사용자만 다음 명령을 사용하여 kafka
로 로그인할 수 있습니다.
- sudo su - kafka
나중에 암호 변경 기능을 잠금 해제하려면 -u
옵션과 함께 passwd
를 사용하십시오.
- sudo passwd kafka -u
이제 kafka
사용자의 관리자 권한을 성공적으로 제한했습니다. Kafka를 사용할 준비가 되었습니다. 선택적으로 시스템에 KafkaT를 추가하는 다음 단계를 따를 수 있습니다.
7단계 - KafkaT 설치(선택 사항)
KafkaT는 Kafka 클러스터에 대한 세부 정보를 보고 명령줄에서 특정 관리 작업을 수행하는 기능을 개선하기 위해 개발되었습니다. Ruby gem이므로 사용하려면 Ruby가 필요합니다. 또한 KafkaT
가 의존하는 다른 gem을 빌드하려면 build-essential
패키지가 필요합니다.
apt
를 사용하여 Ruby 및 build-essential
패키지를 설치합니다.
- sudo apt install ruby ruby-dev build-essential
이제 gem
명령으로 KafkaT를 설치할 수 있습니다.
- 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
라는 새 파일을 만듭니다.
- 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]
...
...
출력에는 클라이언트 관련 정보를 저장하기 위해 Kafka에서 사용하는 내부 주제인 TutorialTopic
및 __consumer_offsets
가 포함됩니다. __consumer_offsets
로 시작하는 줄은 무시해도 됩니다.
KafkaT에 대한 자세한 내용은 GitHub 리포지토리를 참조하십시오.
결론
이제 Apache Kafka가 Ubuntu 서버에서 안전하게 실행됩니다. Kafka 클라이언트를 사용하여 Kafka를 선호하는 프로그래밍 언어에 통합할 수 있습니다.
Kafka에 대해 자세히 알아보려면 설명서를 참조할 수도 있습니다.