들어가면서
대규모 트래픽 상황에서도 안정적이고 높은 TPS(초당 트랜잭션 수)를 유지하는 서버를 구축하고자 하는 것은 많은 엔지니어의 목표입니다. 저 역시 위대한 엔지니어들이 그러했듯, 현재의 상태에 안주하지 않고 개선을 추구하고 있습니다.
기존에 구축한 Spring 기반의 단일 프로젝트를 MSA(마이크로서비스 아키텍처)로 전환해보고자 합니다. 특히, MSA 아키텍처에서 대용량 데이터를 효율적으로 처리하기 위해 Kafka 서버를 도입하려고 합니다.
이 포스팅에서는 Kafka 서버 구축 과정을 단계별로 설명하겠습니다. 이를 통해 여러분도 대규모 트래픽을 안정적으로 처리할 수 있는 시스템을 구축하는 데 도움을 얻을 수 있을 것입니다.
MSA에 대한 첫 걸음을 내딛고, 점점 정복해보고자 합니다.
카프카를 이해하기 위해서 메시지큐는 꼭 필요한 개념입니다.
메시지큐에 대해서는 여기서 학습하고 가도 좋겠습니다.
카프카(Kafka) 란?
Apache Kafka는 고성능 데이터 파이프라인, 스트리밍 분석, 데이터 통합 및 미션 크리티컬 애플리케이션을 위한 오픈 소스 분산 이벤트 스트리밍 플랫폼입니다. 현재 많은 기업들이 Kafka의 이벤트 스트리밍을 사용하고 있으며, 그 사용 빈도는 점차 증가하고 있습니다.
(채용 공고에서도 자주 보입니다.)
이벤트 스트리밍 플랫폼
Kafka는 세 가지 주요 기능을 결합하여 end-to-end 이벤트 스트리밍을 구현할 수 있습니다:
이벤트 스트림을 지속적으로 발행(publish)하고 구독(subscribe)할 수 있습니다.이벤트 스트림을 내구성 있고 안정적으로 저장(store)할 수 있습니다.
이러한 특징과 더불어 Kafka는 확장성, 탄력성, 내결함성, 그리고 보안성을 갖춘 방식으로 제공됩니다. Kafka 환경은 자가 관리하거나 다양한 공급 업체에서 제공하는 완전 관리형 서비스를 사용할 수 있습니다.
메시지 큐(Message Queue, MQ)
메시지 지향 미들웨어(MOM, Message Oriented Middleware)는 비동기 메시지를 사용하여 각 응용 프로그램 간에 데이터를 송수신하는 것을 의미하며, 메시지(이벤트) 기반의 매개체라고 할 수 있습니다.
MOM을 구현한 시스템을 MQ(메시지 큐)라고 합니다. 현재 많이 사용되는 오픈 소스 MQ로는 RabbitMQ, Kafka, ActiveMQ 등이 있습니다.
카프카 서버 구축하기
Docker 를 이용해서 카프카 서버를 구축할 수도 있지만, 해당 글에서는 직접 다운받은 카프카를 이용해서 진행합니다!
Kafka 다운로드
가장 먼저, Apache Kafka 다운로드 공식 홈페이지에 들어가서 Kafka 최신 버전을 다운받습니다.
(저는 바로 2024년 6월에 출시된 3.7.1 버전을 다운받았습니다)
자 이제
다운로드 받은 kafka 를 적절한 디렉토리로 옮겨주시고, 터미널에서 살펴봅시다.
여기서 주로 사용하는 bin, config 폴더에 주목합니다.
- bin : kafka 관련 각종 실행 쉘 커맨드 파일이 있음
- config : 설정 관련 파일이 존재함
Kafka Zookeeper 구동
루트 디렉토리인 kafka_2.13-3.7.1 에서 모든 쉘 커맨드를 실행합니다!
Kakfa Cluster 을 관리하고 분산 처리를 조정하는 역할을 하는 Zookeeper 를 구동시킵니다.
아래의 쉘 커맨드를 입력합니다.
./bin/zookeeper-server-start.sh ./config/zookeeper.properties
위 두 개의 명령어를 살펴보면
- bin 폴더에 존재하는 zookeeper-server-start.sh 쉘 커맨드를 구동하는데
- 이때 config 폴더에 존재하는 zookeepr.properties 설정 파일을 참조합니다.
Zookeeper 는 기본적으로 2181 포트에서 구동된다고 합니다.
Kafka Broker 구동
Kafka 의 핵심 Kafka Broker 를 구동해보겠습니다.
주의할 점은 Zookeeper 가 구동 중이어야만 Kafka Broker 의 구동이 가능합니다.
Kafka 폴더에서 쉘 커맨드를 날려줍니다.
./bin/kafka-server-start.sh ./config/server.properties
- bin 폴더에 존재하는 kafka-server-start.sh 쉘 커맨드를 구동하며
- cofig 폴더의 server.properties 설정 파일을 참조합니다.
Kafka Broker 는 기본적으로 9092 포트에서 구동됩니다.
Topic 확인 및 생성과 삭제
이제 서버 구축의 마지막 단계까지 왔습니다.
Kafka Broker 에 새로운 topic 을 만들겠습니다.
다운받았던 Kafka 폴더는 topic 관련 쉘 커맨드 또한 제공합니다.
topic 생성
./bin/kafka-topics.sh --create --topic [생성할 topic 이름] --bootstrap-server localhost:9092 --partitions 1
bootstrap-server localhost:9092 라는 명령어 옵션은 Kafka 클러스터에 연결하기 위한 초기 주소로, 로컬 머신의 9092 포트에서 실행 중인 Kafka 브로커를 가리킵니다. 이 초기 연결 주소를 통해 Kafka 클라이언트는 브로커와 통신을 시작하며, 이후 필요한 작업(예: 토픽 생성, 데이터 전송 등)을 수행할 수 있습니다.
Partitons 뒤의 N 은 topic 을 구성하는 partition 의 복제수를 의미합니다.
Kafka 의 고가용성(High Availability) 을 보장합니다!
topic 삭제
./bin/kafka-topics.sh --delete --topic [삭제할 topic 이름] --bootstrap-server localhost:9092
해당 명령어를 통해 생성한 topic 을 삭제할 수 있습니다.
topic 목록 확인
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
이번에는 생성한 topic 목록을 확인해보겠습니다.
이미지 처럼 생성한 topic 인 my-topic 이 조회되는 것을 확인할 수 있습니다.
topic 정보 확인
./bin/kafka-topics.sh --describe --topic [확인할 topic 이름] --bootstrap-server localhost:9092
특정 topic 의 정보을 확인할 수도 있습니다.
여러가지 정보가 나오는데요 지금은 의미를 알 필요가 없어보입니다.^^
Producer & Concumer 를 구동하고 테스트 진행
이번에는 메시지(이벤트)를 생성하는 Producer와 Consumer를 쉘 커맨드를 통해 구현하고 테스트해보겠습니다. Producer와 Consumer를 구동하기 위해서는 앞서 구동시켰던 Zookeeper와 Kafka Broker가 실행 중이어야 합니다.
Producer 구동하기
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic [발행할 topic 이름]
Kafak 폴더에서 제공된 쉘 커맨드로 구동합니다.
명령어가 정상적으로 실행되고 > 입력창이 뜨는 것을 보실 수 있습니다.
여기에 메시지(이벤트)를 발행하면 zoozoo-topic을 구독한 Consumer가 해당 메시지(이벤트)를 읽어올 수 있습니다.
Consumer 구동하기
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic [구독할 topic 이름] --from-beginning
--from-beginning 옵션은 Consumer 가 구독하는 topic 에 저장된 이전의 모든 메세지를 읽어오는 옵션입니다.
커맨드 실행시 별도의 텍스트가 출력되지 않고 있습니다.
Producer 를 통해 메세지를 발행하고 Consumer 에서 메시지 읽기
Consumer 두 개를 접속시킨 뒤 Producer에서 메시지를 발행해봤습니다.
과거에 발행했던 hi 를 포함해서 새로 발행한 메시지가 동일하게 확인되고 있답니다.
이어서
실습은 무사히 진행했고, Kafka 와 Spring Boot 를 연결해보려고 합니다.
참고