본문 바로가기

Open Source Software

처음 사용자를 위한 Kafka - 1. Concept, 설치 방법 및 간단한 사용 샘플

참조 사이트

오픈소스 이벤트 스트리밍 (Event Streaming) 플랫폼인 Apache Kafka (이하 카프카) 설치와 간단한 사용방법을 알아보겠습니다. 아래에서 기술한 테스트 내용은 Oracle Cloud Infrastructure (OCI) 의 Oracle Linux 7.9 가상머신 환경에서 진행했습니다.

 

카프카 Concept

  • 이벤트 (Event) 레코드: 레코드 또는 메세지라고도 하며, 카프카 데이터를 읽거나 카프카에 데이터를 쓸 때 이 이벤트의 형태로 이루어집니다. 이벤트는 키, 값, 타임스탬프, 메타 데이터 헤더(옵션)를 가지고 있습니다.
  • 프로듀서 (Producer): 카프카에 이벤트를 Publish (쓰기)하는 클라이언트 어플리케이션입니다.
  • 컨슈머 (Consumer): 카프카 이벤트를 Subscribe (읽기, 처리)하는 클라이언트 어플리케이션입니다.

프로듀서와 컨슈머는 완전히 분리되어 있고 서로 알지 못하며, 이는 카프카가 높은 확장성을 갖게하는 핵심 요소입니다. 이를 통해 프로듀서는 컨슈머의 읽기, 처리를 기다릴 필요가 없이 Exactly Once (1회만 전달)를 포함하는 다양한 전달 보증 수준을 제공합니다.

 

카프카 이벤트 메세지는 토픽 (Topic) 이라고하는 스토리지에 저장됩니다. 프로듀서와 컨슈머는 특정 토픽을 지정하여 메세지를 송수신함으로써 단일 카프카 클러스터에서 여러 종류의 메세지를 중계하게 됩니다.

토픽은 파티션 (Partition)이라는 단위로 분할되어 있습니다. 파티션으로의 데이터 분산 배치를 통해 프로듀서에서의 메세지 수신, 컨슈머로의 전달을 분산해서 실시함으로써 하나의 토픽에 대한 대규모 대이터 수신과 전달을 할 수 있게 됩니다.

카프카 브로커는 데이터를 수신하고 전달하는 서비스이며, 주키퍼 (Zookeeper)는 브로커가 수행하는 분산 처리를 위한 관리도구로서 분산 메세징과 메타 데이터(토픽, 파티션)를 관리하는 역할을 합니다.

 

JDK, 카프카 설치

카프카는 Scala, Java 기반입니다. 카프카 설치를 위해 먼저 JDK를 설치해야 합니다.

[root@inst-kafka opc]# whoami
root
[root@inst-kafka opc]# yum search openjdk
Loaded plugins: langpacks, ulninfo
...
Complete!
[root@inst-kafka opc]# java -version
openjdk version "11.0.15" 2022-04-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.15+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.15+9-LTS, mixed mode, sharing)

JAVA HOME, JRE HOME을 설정합니다.

[root@inst-kafka opc]# vi .bash_profile
...
export JAVA_HOME=/usr/lib/jvm/jre-11-openjdk
export JRE_HOME=/usr/lib/jvm/jre
...
[root@inst-kafka opc]# source .bash_profile
[root@inst-kafka opc]# env | grep jre
JRE_HOME=/usr/lib/jvm/jre
JAVA_HOME=/usr/lib/jvm/jre-11-openjdk

 

카프카를 임시 디렉토리에 다운로드 받은 후, 카프카용 디렉토리를 만들어 압축을 해제합니다.

아래 위치에서 카프카를 다운로드 받습니다. 이번 테스트에서는 Kafka 3.1.0을 설치했습니다.

https://kafka.apache.org/downloads

[root@inst-kafka opc]# cd /tmp/
[root@inst-kafka tmp]# wget <https://dlcdn.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz>
...
2022-04-21 08:42:41 (373 MB/s) - ‘kafka_2.13-3.1.0.tgz’ saved [88130011/88130011]
[root@inst-kafka tmp]# mkdir -p /opt/kafka
[root@inst-kafka tmp]# tar -xvf kafka_2.13-3.1.0.tgz -C /opt/kafka/

 

소켓 서버 리스너 설정을 합니다. 아래와 같이 server.properties 파일을 열어서 “listeners=PLAINTEXT://:9092” 앞에 붙은 주석(#)을 제거해 주면 됩니다.

[root@demo tmp]# vi /opt/kafka/kafka_2.13-3.1.0/config/server.properties
...
listeners=PLAINTEXT://:9092
...

 

카프카 환경 Start

아래와 같은 명령어으로 주키퍼와 카프카 브로커 서비스를 기동합니다. root 유저로 실행합니다.

[root@inst-kafka tmp]# cd /opt/kafka/kafka_2.13-3.1.0/
[root@inst-kafka kafka_2.13-3.1.0]# bin/zookeeper-server-start.sh config/zookeeper.properties

 

터미널을 하나 더 열어서 브로커를 Start합니다. . root 유저로 실행합니다.

[root@inst-kafka opc]# cd /opt/kafka/kafka_2.13-3.1.0/
[root@inst-kafka kafka_2.13-3.1.0]# bin/kafka-server-start.sh config/server.properties
...
[2022-04-22 02:56:40,529] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)
...

 

카프카 테스트

먼저 이벤트를 만들어 내기 전에 토픽을 생성해야 합니다. 터마널을 하나 더 열어서 아래와 같이 토픽을 생성합니다.

[opc@inst-kafka ~]$ cd /opt/kafka/kafka_2.13-3.1.0/
[opc@inst-kafka kafka_2.13-3.1.0]$ bin/kafka-topics.sh --create --topic test-events --bootstrap-server localhost:9092
Created topic test-events.

 

생성된 토픽의 정보를 확인합니다.

[opc@inst-kafka kafka_2.13-3.1.0]$ bin/kafka-topics.sh --list --bootstrap-server localhost:9092
test-events
[opc@inst-kafka kafka_2.13-3.1.0]$ bin/kafka-topics.sh --describe --topic test-events --bootstrap-server localhost:9092
Topic: test-events      TopicId: GHPBpx-nSuWgZCPbbbE3pA PartitionCount: 1       ReplicationFactor: 1    Configs: segment.bytes=1073741824
        Topic: test-events      Partition: 0    Leader: 0       Replicas: 0     Isr: 0

 

카프카 클라이언트는 읽기, 쓰기 이벤트에 대해 네트웍을 통해 카프카 브로커와 통신합니다. 이벤트를 받으면 브로커는 해당 이벤트를 저장해서 전달할 수 있게 됩니다.

터미널에서 프로듀서 클라이언트를 아래와 같이 실행하여 이벤트를 토픽에 기록합니다.

[opc@inst-kafka kafka_2.13-3.1.0]$ bin/kafka-console-producer.sh --topic test-events --bootstrap-server localhost:9092
>This is my first event
>This is my second event
>

 

터미널을 하나 더 열어서 컨슈머 클라이언트를 실행해서 앞서 프로듀서에서 생성한 이벤트가 아래와 같이 전달되었는지 확인합니다.

[opc@inst-kafka ~]# cd /opt/kafka/kafka_2.13-3.1.0/
[opc@inst-kafka kafka_2.13-3.1.0]# bin/kafka-console-consumer.sh --topic test-events --from-beginning --bootstrap-server localhost:9092
This is my first event
This is my second event

<END>