스트리밍 수집 도구의 마지막 조각은 Amazon MSK(Managed Streaming for Apache Kafka) 다. Kinesis가 AWS 고유의 스트리밍 서비스라면, Kafka는 업계 표준 오픈소스 스트리밍 플랫폼이고 MSK는 그 Kafka를 AWS가 관리형으로 제공하는 서비스다.
핵심 질문은 어제와 같다: "Kinesis가 있는데 왜 MSK인가? 언제 무엇을 쓰나?" 오늘은 Kafka의 기본 개념(토픽·파티션·컨슈머 그룹)을 잡고, Kinesis와 정확히 어디서 갈리는지를 본다. DEA-C01에서 이 비교는 거의 반드시 나온다.
Kafka에서 데이터는 토픽(topic) 단위로 분류된다. 토픽은 "주제별 로그"라고 보면 된다(예: orders, clicks, sensor-data). 각 토픽은 다시 여러 파티션(partition) 으로 쪼개진다. 파티션이 Kafka의 병렬성·처리량 단위다.
눈치챘겠지만 구조가 KDS와 거의 같다. 토픽 ≈ 스트림, 파티션 ≈ 샤드다. 프로듀서가 메시지를 보낼 때 키를 지정하면 그 키로 어느 파티션에 갈지 결정되고, 한 파티션 안에서는 순서가 보장된다. KDS의 파티션 키 개념과 동일하다.
from kafka import KafkaProducerproducer = KafkaProducer(bootstrap_servers="b-1.msk.amazonaws.com:9092")# 키(user-8821)가 파티션을 결정 → 같은 사용자 메시지는 같은 파티션, 순서 보장producer.send("orders", key=b"user-8821", value=b'{"item":"book","qty":2}')producer.flush()
💡 관련 이론: Kafka와 Kinesis는 둘 다 "분산 append-only 로그" 모델을 공유한다. 메시지를 소비해도 사라지지 않고(retention 동안 보관), 여러 컨슈머 그룹이 각자의 오프셋(offset)에서 독립적으로 읽는다. 이 점에서 둘 다 SQS 같은 전통 큐와 근본적으로 다르다. 그래서 Kafka 경험자는 Kinesis를 빠르게 이해하고, 반대도 마찬가지다. 시험은 이 "개념적 1:1 대응"을 알고 있는지 확인한다.
💡 관련 이론: 컨슈머 수가 파티션 수를 넘으면 초과 컨슈머는 놀게 된다(한 파티션은 그룹 내 한 컨슈머만 읽으므로). 따라서 처리량을 늘리려면 컨슈머만 늘리는 게 아니라 파티션 수를 충분히 잡아야 한다. 이는 KDS에서 컨슈머를 늘려도 샤드가 부족하면 병렬성이 제한되는 것과 같은 원리다. "병렬성의 상한 = 파티션(샤드) 수"라는 공식이 양쪽에 공통으로 적용된다.
시험에서 결정적 키워드는 "기존 Apache Kafka 워크로드/애플리케이션"이다. 이 표현이 나오면 MSK가 정답일 가능성이 크다. Kafka 생태계(Kafka Connect, Kafka Streams, 기존 토픽 설계, 컨슈머 코드)를 재사용해야 하기 때문이다. 반대로 "최소 운영 부담", "서버리스", "AWS 네이티브 신규 구축", "단순 S3/Redshift 적재" 같은 표현이면 Kinesis 쪽이다. 두 서비스는 기능이 겹치므로, 정답은 기술적 우열이 아니라 "기존 자산과 운영 모델"로 갈린다.
MSK에 들어온 데이터를 분석 스택으로 보내는 방법은 다음과 같다. MSK Connect의 싱크 커넥터(예: S3 Sink)로 토픽 데이터를 S3에 적재하거나, Kafka를 소비하는 Lambda·Flink(Amazon Managed Service for Apache Flink)로 실시간 처리 후 다운스트림에 보낸다. KDS와 마찬가지로 "수집 → 처리 → 적재"의 흐름은 동일하다.
Kinesis 는 복제를 서비스가 알아서 처리해 사용자가 만질 값이 없다. Kafka 는 내구성을 설정으로 조립한다. MSK 가 관리형이어도 이 설정의 책임은 사용자에게 남는다.
토픽 orders, 파티션 0, 복제 계수(replication factor) 3
브로커 1 (AZ-a) : 리더 ← 프로듀서·컨슈머가 붙는 곳
브로커 2 (AZ-b) : 팔로워 ← 리더를 따라 복제
브로커 3 (AZ-c) : 팔로워
ISR(in-sync replicas) = 리더를 제때 따라잡고 있는 복제본 집합
설정
위치
의미
복제 계수
토픽
파티션 하나를 몇 개 브로커에 복제할지
acks
프로듀서
0 응답 안 기다림 / 1 리더만 기록하면 성공 / all ISR 전체가 기록해야 성공
min.insync.replicas
브로커·토픽
acks=all 일 때 최소 몇 개 복제본이 받아야 쓰기를 성공으로 볼지
유실 없는 구성의 표준은 복제 계수 3 + min.insync.replicas=2 + 프로듀서 acks=all 이다. 브로커 하나가 죽어도 쓰기가 계속되고, 확인된 메시지는 최소 두 곳에 있다.
MSK 의 기본 클러스터 구성은 3개 AZ 클러스터에서 기본 복제 계수 3, min.insync.replicas 2 다(2개 AZ 클러스터는 각각 2와 1). 토픽 자동 생성(auto.create.topics.enable)은 기본으로 꺼져 있고 기본 파티션 수는 1 이다.
acks=1 로 보내면 리더가 받고 복제 전에 죽었을 때 메시지가 사라진다. "브로커 장애 뒤 일부 메시지가 없다"는 지문의 원인이 대개 이것이다.
브로커 장애가 나면 MSK 가 감지해 교체하고, 가능하면 기존 스토리지를 재사용해 다시 복제할 양을 줄인다. 복구 뒤에도 브로커 주소는 유지된다.
Kafka 는 클러스터 메타데이터를 과거에는 Apache ZooKeeper 에 두었고, 최근 버전은 Kafka 내부 컨트롤러 그룹이 직접 관리하는 KRaft 모드로 옮겨 가고 있다. MSK 는 두 방식을 모두 제공하고, ZooKeeper 노드든 KRaft 컨트롤러든 추가 비용 없이 MSK 가 운영한다. 시험에서는 "ZooKeeper 를 직접 운영해야 하나"가 아니라 "MSK 가 대신 운영한다"는 사실만 알면 된다.