[AWS] MSK로 Apache Kafka 환경 구축하기

2024. 9. 22. 22:45·AWS

 

들어가며

완전관리형 아파치 카프카 서비스를 제공하는 Amazon MSK(Managed Streaming for Apache Kafka)를

현재 소프트웨어 마에스트로 활동을 하면서 진행하고 있는 팀 프로젝트의 운영 서버에 적용하는 과정과

학습한 내용을 기록하고자 작성하였습니다.

 

아래 교재를 통해 학습하며 환경을 구축해보았습니다.

 

아파치 카프카 애플리케이션 프로그래밍 with 자바 | 최원영 - 교보문고

아파치 카프카 애플리케이션 프로그래밍 with 자바 | 아파치 카프카 애플리케이션 개발을 위한 「실전 가이드」 아파치 카프카란 무엇일까? 카프카 애플리케이션은 어떻게 만들까? 데이터 파이

product.kyobobook.co.kr

 

 

 

 

1단계: MSK 클러스터 생성하기

AWS가 추천하는 '빠른 생성' 방식으로 클러스터를 생성할 경우 네트워크 세부 설정이 불가능하고,

모니터링 설정에도 제약이 존재합니다.

저의 경우 네트워크와 모니터링 설정이 별도로 필요하므로 '사용자 지정 생성' 방식으로 클러스터를 생성하겠습니다.

 

 

 

개발, 테스트 용도의 클러스터라면 2개의 AZ를 추천하고,

서비스 운영용 클러스터를 운영한다면 3개의 AZ에 구축해야한다고 교재에 써있었으나,

MSK의 비용이 생각보다 많이 높기때문에.... 영역 수는 2개로 설정했습니다 ㅠㅠ

 

MSK 클러스터 생성 시 선택할 수 있는 여러 브로커 인스턴스 타입이 존재하는데,

브로커 당 적정 최대 파티션 개수(리더, 팔로워 레플리케이션 포함)가 정해져있으므로 확인 하는 것이 좋습니다.

kafka.t3.small은 최대 300개의 파티션을 권장합니다.

 

 

 

글을 쓰는 시간을 기준으로 AWS 요금 계산기로 계산을 해보니

kafka.t3.small 인스턴스에서 브로커당 스토리지 요금을 1GB로 했을 때 월별 스토리지 요금은 0.23 USD로 측정됐었습니다.

10GB는 2.28 USD로 측정되더라구요

만약 클러스터 사용량을 바로 고려하기 힘든 상황이더라도, 클러스터를 생성한 이후에 늘릴 수 있으므로

일단은 10GB 정도로 설정했습니다.

참고로 EBS 스토리지의 용량을 다시 줄일 수 는 없으므로 대략적이라도 사용량을 계산하여 용량을 정하는 것이 좋습니다.

 

 

 

 

2단계: 네트워킹

이제 네트워크를 설정할 차례입니다.

기존에 만들어놨던 프로젝트에 대한 VPC로 설정해주고, 두 개의 AZ에 대해서 private subnet에 브로커를 설치하고자합니다.

또한 카프카에 대한 보안 그룹을 설정하여, 기존에 만들어두었던 특정 보안 그룹에 속한 곳에서만 인바운드 규칙을 허용하도록 설정하였습니다.

참고로 보안 그룹의 경우 클라이언트가 브로커와 통신하는 형식이 일반 평문인지, TLS 형식인지에 따라서

포트 번호가 다르므로 경우에 맞게 아래 링크에 있는 문서 내용과 같이 보안 그룹 포트를 설정해줘야 합니다.

https://docs.aws.amazon.com/ko_kr/msk/latest/developerguide/port-info.html

 

 

 

 

3단계: 보안

교재에서는 TLS 암호화를 활성화하면 안전하게 클라이언트와 통신할 수 있으나, 성능이 약 30퍼센트 저하된다고하니

성능에 크게 미치는 옵션이므로 카프카를 구축하는 환경이 암호화가 필수인지 잘 따져서 설정할 필요가 있어보입니다.

또한 해당 페이지에서 클러스터 내에서 브로커 간 통신 암호화도 설정할 수 있습니다.

 

 

 

 

4단계: 모니터링 및 태그

클라우드와치로 클러스터 지표를 수집하는 옵션은 4가지로 나뉘는데, 저는 기본 모니터링으로 설정하고

추가적으로 프로메테우스와 그라파나를 붙여서 모니터링을 하고자 합니다.

기본 모니터링까지는 추가 요금이 발생하지 않고, 가용 영역 간 데이터 전송에는 요금이 부과되지만

오픈 모니터링은 추가 요금이 필요없기 때문에 위와 같은 선택을 하였습니다.

익스포터도 JMX, Node 둘다 선택했습니다.

 

 

 

 

토픽 생성

아래 링크에서 생성한 MSK의 Kafka 버전을 확인한 후, 해당 버전에 대한 binary 파일을 EC2 인스턴스 안에 다운받아줍니다.

https://kafka.apache.org/downloads

 

저의 경우 3.5.1 버전을 선택했으므로 아래와 같이 wget으로 다운로드 후,

wget https://archive.apache.org/dist/kafka/3.5.1/kafka_2.12-3.5.1.tgz

 

tar 명령을 사용하여 kafka_2.12-3.5.1.tgz라는 압축 파일을 풀어줍니다.

tar -xvf kafka_2.12-3.5.1.tgz
cd kafka_2.12-3.5.1

 

카프카 바이너리를 실행하기 위해서 JDK 1.8을 우분투에 설치해줍니다.

https://i5i5.tistory.com/266

sudo apt-get install openjdk-8-jdk

 

이제 kafka-topics.sh --create 명령으로 토픽을 생성해줍니다.

bin/kafka-topics.sh --create --bootstrap-server {MSK Kafka Endpoint} --replication-factor 2 --partitions 2 --topic new-issuer-alert

 

kafka-topics.sh --list 명령으로 토픽이 정상적으로 생성되었는지 확인해줍니다.

bin/kafka-topics.sh --list --bootstrap-server b-1.elswhereprodkafka.8k16i3.c3.kafka.ap-northeast-2.amazonaws.com:9092,b-2.elswhereprodkafka.8k16i3.c3.kafka.ap-northeast-2.amazonaws.com:9092 new-issuer-alert

 

 

 

 

 

구축하면서 발생했던 오류

문제 1

bin/kafka-topics.sh --create --zookeeper {MSK Zookeeper Endpoint} --replication-factor 2 --partitions 2 --topic new-issuer-alert

Exception in thread "main" joptsimple.UnrecognizedOptionException: zookeeper is not a recognized option
	at joptsimple.OptionException.unrecognizedOption(OptionException.java:108)
	at joptsimple.OptionParser.handleLongOptionToken(OptionParser.java:510)
	at joptsimple.OptionParserState$2.handleArgument(OptionParserState.java:56)
	at joptsimple.OptionParser.parse(OptionParser.java:396)
	at kafka.admin.TopicCommand$TopicCommandOptions.<init>(TopicCommand.scala:557)
	at kafka.admin.TopicCommand$.main(TopicCommand.scala:48)
	at kafka.admin.TopicCommand.main(TopicCommand.scala)

 

해결 1

개발 서버에서는 docker-compose로 옛날 버전의 kafka 이미지를 사용해서 위 명령어를 사용하는데 문제가 없었지만,

Kafka 2.5.0 이후 버전부터는 zookeeper 주소를 직접 명령어에 제공하지 않고,

Kafka 클러스터가 실행 중인 상태에서 --bootstrap-server 옵션을 사용해야 합니다.

Kafka에서 Zookeeper와의 의존성을 줄이기 위해 바뀐 것 같았습니다.

bin/kafka-topics.sh --create --bootstrap-server {MSK Kafka Endpoint} --replication-factor 2 --partitions 2 --topic new-issuer-alert

 


 

'AWS' 카테고리의 다른 글

[AWS] MSK 클러스터에 프로메테우스와 그라파나를 활용한 모니터링 연동하기  (0) 2024.09.22
[AWS] ElastiCache로 Redis 클러스터 모드 생성 및 적용해보기  (0) 2024.08.17
[AWS] Lambda와 Private Subnet에 있는 RDS 연결하기  (0) 2024.08.06
[AWS] IAM 개념 및 IAM 사용자 추가하기 + IAM 정책 시뮬레이터  (0) 2024.06.18
'AWS' 카테고리의 다른 글
  • [AWS] MSK 클러스터에 프로메테우스와 그라파나를 활용한 모니터링 연동하기
  • [AWS] ElastiCache로 Redis 클러스터 모드 생성 및 적용해보기
  • [AWS] Lambda와 Private Subnet에 있는 RDS 연결하기
  • [AWS] IAM 개념 및 IAM 사용자 추가하기 + IAM 정책 시뮬레이터
개발이조아용
개발이조아용
IT 개발에서 배운 성장의 기록을 작성합니다.
  • 개발이조아용
    계속 하다 보면?!
    개발이조아용
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • Tibero DB (Tmax AI Bigdata .. (7)
      • Git (2)
      • CI CD (2)
      • Redis (3)
      • SpringBoot (16)
      • SQL 문제 풀이 (8)
      • Apache Kafka (8)
        • 오류 해결 (3)
        • 개념 정리 (4)
        • 보안 (1)
      • Nginx (3)
      • SW마에스트로 (3)
      • Kubernetes (4)
      • AWS (5)
      • gRPC (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Git
    DynamoDB 연동
    Kafka 개념
    Kafka SASL
    redis script
    Redis 개념
    redis
    SpringBoot
    leetcode
    SQL
    SASL 인증
    Kafka 오류
    MSA
    KAFKA
    Tibero
    nginx
    sql 문제
    소프트웨어 마에스트로
    grpc
    K8S
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
개발이조아용
[AWS] MSK로 Apache Kafka 환경 구축하기
상단으로

티스토리툴바