2025-03-14

Flix 프로젝트: 개발 기록 - 4

FlixDockerDocker SwarmKafkaPostgreSQLMSA

1. 오늘의 진행 상황 & 구현 내용

Spring Boot 애플리케이션 Docker화 및 MSA 환경 구축

Docker 이미지 빌드: 각 Spring Boot 마이크로서비스에 대한 Dockerfile을 작성했습니다. Maven 멀티 스테이지 빌드를 활용하여 JAR 컴파일과 OpenJDK 기반 이미지로 컨테이너를 생성했습니다.

Docker Compose MSA 스택 구성: Filebeat, Kafka, ELK 스택, Zookeeper, Redis, Postgres, Spring Boot 서비스들을 하나의 docker-compose 파일로 통합했습니다. 모든 서비스가 커스텀 오버레이 네트워크 내에서 운영되어 원활한 서비스 간 통신이 가능합니다.

Docker Swarm 배포 → Kubernetes 전환 계획

  • 현재: Docker Swarm 모드에서 다중 노드에 스택 배포
  • 향후: 향상된 확장성과 관리를 위해 Kubernetes로 전환

Kafka 및 네트워크 설정 개선

Kafka Advertised 설정: 내부 DNS 문제를 해결하기 위해 hostname을 명시적으로 할당하고 KAFKA_ADVERTISED_LISTENERSPLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092로 설정했습니다. 네트워크 검증을 통해 모든 서비스 간 적절한 DNS 해석을 확인했습니다.

데이터 영속성 및 볼륨 관리

스택 재배포 시 데이터 무결성을 유지하기 위해 Postgres에 외부 볼륨을 구현했습니다. 내부 네임드 볼륨 사용 시 발생하던 이전 데이터 손실 문제를 해결했습니다.

2. 문제 있었던 점 & 해결 과정

Kafka UnknownHostException 및 등록 충돌

문제: Kafka가 내부 DNS 이름을 해석하지 못해 연결 오류가 발생하고, 중복 Broker ID로 인해 ZooKeeper 등록 충돌이 발생했습니다.

해결: hostname: kafka 설정을 추가하고 KAFKA_ADVERTISED_LISTENERS를 단순화했습니다. ZooKeeper 상태를 초기화하기 위해 스택을 완전히 제거하고 재배포했습니다.

Postgres 데이터 손실 이슈

근본 원인: 스택 재배포 시 내부 볼륨이 삭제되어 영속 데이터가 파괴되었습니다.

해결: compose 설정에서 external: true 참조를 사용하여 외부 볼륨을 구현했습니다.

3. 정리 & 앞으로의 계획

현재 상태:

  • Filebeat가 성공적으로 Kafka로 로그 수집
  • Docker Swarm이 다중 노드 스택 배포 관리
  • 서비스 간 네트워크 DNS 해석 검증 완료
  • 스택 트레이스를 위한 멀티라인 로깅 설정 구현

계획:

  • 확장성을 위한 ELK 인프라 별도 배포
  • Docker Swarm에서 Kubernetes로 전환
  • Postgres 데이터 영속성 메커니즘 강화
  • Filebeat 레지스트리 및 로그 전송 정확성 모니터링