
사용자 피드백을 반영해 끊임없이 서비스를 개선
- 아마존의 배포 속도: 초당 1.5번 배포
- Cloud 인프라의 등장
- 전형적인 시스템 인프라 구축 과정을 살펴보면 서버를 도입하고 네트워크를 구축한 뒤, 각 서버마다 운영체제를 설치하고 서비스에 필요한 소프트웨어를 설치하는 과정으로 진행되고 전 과정을 완료하기까지 적게는 며칠에서 길게는 몇달이 걸리기도 함
- Cloud 인프라에 어울리는 애플리케이션의 조건
- 스케일업 & 스케일 아웃
- Cloud Friendly & Cloud Native


IaC(Infrastructure as Code)비동기 이벤트fault tolerance
Responsive (응답성)Resilient (탄력성)Elastic (유연성)Message Driven (메시지 기반)(레이어 별로 선택된 애플리케이션)

Public Cloud, Private Cloud, BareMetalVM, Container컨테이너 오케스트레이션Backing ServiceCacheMessage BrokerTelemetryLoggingTraceMonitoringCI/CD
sudo apt update && sudo apt upgrade -y
# 도커 설치를 위한 필수 패키지
sudo apt install -y ca-certificates curl gnupg lsb-release
# 도커 공식 GPG 키 추가 및 저장소 설정 후 설치
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# 적용을 위해 로그아웃 후 다시 로그인하거나 아래 명령 수행
newgrp docker
sudo apt install -y docker-compose-plugin
LinkedIn 에서 파편화된 데이터 수집 및 분배 아키텍처를 운영하는데 큰 어려움을 겪어서 이를 해결하기 위해서 만든 시스템
내부 데이터 흐름을 개선하기 위해 개발
Kafka는 각각의 애플리케이션끼리 연결해서 데이터를 처리하는 것이 아니고, 한 곳에 모아 처리할 수 있는 중앙 집중화 방식을 사용하는 것이 가능
Kafka를 통해 웹 사이트, 애플리케이션, 센서 등에서 취합한 데이터 스트림을 한 곳에서 실시간으로 관리할 수 있게 됨
대용량 데이터를 수집하고 이를 사용자들이 실시간 스트림으로 소비할 수 있게 만들어주는 일종의 중추 신경으로 동작
Kafka를 중앙에 배치해서 소스 애플리케이션과 타겟 애플리케이션 사이의 의존도를 최소화해서 커플링을 완화
기존에 1:1 매칭으로 개발하고 운영하던 데이터 파이프라인은 커플링으로 인해 한쪽의 이슈가 다른 한쪽의 애플리케이션에 영향을 미치곤 했지만 카프카는 이러한 의존도를 타파
소스 애플리케이션에서는 어떤 애플리케이션으로 데이터를 보낼지 고민하지 않고, 카프카로 넣으면 카프카 내부에 데이터를 저장하고 타겟 애플리케이션은 이 데이터를 소비
데이터가 저장되는 자료구조는 Queue(FIFO) 방식
큐에 데이터를 보내는 것을 프로듀서, 큐에서 데이터를 가져가는 것이 컨슈머
Kafka를 통해 전달받을 수 있는 데이터 포맷은 제한이 없음
상용 환경에서는 최소 3대 이상의 서버에서 분산 운영하여 프로듀서를 통해 전송받은 데이터를 파일 시스템에 안전하게 기록
사용 이유
높은 처리량확장성영속성고가용성docker-compose.yml 작성
services:
kafka:
image: apache/kafka:3.7.0
container_name: developowl-kafka-1
ports:
- "9092:9092"
environment:
# 1. KRaft 모드 활성화 (가장 중요)
- KAFKA_NODE_ID=1
- KAFKA_PROCESS_ROLES=broker,controller
- KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093
# 2. 리스너 설정 (컨트롤러와 브로커 통로 분리)
- KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT
# 3. 클러스터 초기화 설정
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
- KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS=0
- KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1
- KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1
# 4. 주키퍼 미사용 명시 (일부 이미지에서 필요)
- CAN_ELIDE_ZNODE_CHECK=true
# docker-compose 실행
docker compose up -d
# 명령어로 확인
docker ps
# 컨테이너 내부로 들어가서 설정을 수정
docker exec -it kafka /bin/bash
# 도커 컨테이너에서 호스트 컴퓨터로 파일을 복사
docker cp [컨테이너 이름]:[컨테이너 내부 경로] [호스트 파일 경로]
# 호스트 컴퓨터에서 도커 컨테이너로 파일을 복사
docker cp [호스트 파일 경로] [컨테이너 이름]:[컨테이너 내부 경로]