2025-03-14
Flix 프로젝트: 개발 기록 - 4
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_LISTENERS를 PLAINTEXT://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 레지스트리 및 로그 전송 정확성 모니터링