Skip to content

인프라

Monami123321 edited this page Apr 8, 2024 · 9 revisions

프로젝트 아키텍쳐

DANGO drawio (1)

프로젝트의 가장 큰 축은 다음과 같습니다.

  • IoT
  • ML

최대한 IoT 장비와 ML Model 서비스를 통해 나온 데이터를 실시간으로 처리하는 것을 목표로 아키텍쳐를 구축하였습니다.

메세지 큐 서비스를 이용한 데이터 파이프라인 구축

카프카를 이용하여 이미지 데이터 전처리 파이프라인을 구축하였습니다.

IoT 디바이스가 여러대 있는 것을 기준으로 설계를 하였기에 대용량 데이터 스트리밍과 실시간 데이터 스트리밍이 서비스 구축이 가능하고 확장성면에서 용이한 kafka 서비스를 사용하여 파이프라인을 구축하였습니다.

IoT 장비에서는 publisher로 문열림 상태 정보와 카메라로 촬영한 이미지 데이터를 전달하였습니다.

ML 서버에서는 이미지 데이터를 가져오는 Topic을 consume 하여 이미지 데이터를 가져와 모델에 넣습니다. 이후 출력된 결과를 json 형태로 전처리하여 다시 카프카로 produce 합니다.

Spring 서버에서는 전처리된 데이터를 consume 하여 mariadb에 저장하여 사용합니다.

AWS EC2

  • 배포를 위한 서버로 AWS EC2 xlarge를 사용하였습니다. 과금은 lightsail로, 교육기관에서 지불하였습니다.
  • 서버의 구체적인 Spec은 다음과 같습니다.
  • Linux 5.15.0-1055-aws #60~20.04.1-Ubuntu SMP Thu Feb 22 15:49:52 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Docker

도커ps

  • Docker를 이용하여 모든 엔드포인트를 컨테이너화하였습니다. 각 엔드포인트에 문제가 생겨도, 전체 서비스에 심각한 영향을 주지 않게 설계하려고 노력하였습니다.
  • 백엔드 Spring Boot 서버와 프론트엔드 React SPA를 Docker in Docker로 구성하였습니다.
  • Jenkins 컨테이너 안에서 CI/CD 파이프라인에 따라 매번 동일한 환경에서 구동될 수 있도록 하였습니다.
  • 서로 참조가 잦은 백엔드, 프론트엔드, DB 컨테이너를 같은 Docker 네트워크로 설정하여 통신에 따른 불필요한 리소스 소모를 줄였습니다.

Nginx

  • Nginx를 활용하여 리버스 프록시를 구성하였습니다.
  • 80번, 443번 포트에 대한 요청을 Nginx가 앞에서 받도록 구성하였고, 백엔드 API요청과 프론트 요청을 각 도커 컨테이너로 연결하였습니다.
  • 허용되지 않은 포트는 ufw를 통해 관리하였습니다.
  • 이를 통해 요청 및 응답 통로를 일원화하고, http 및 https 요청에 대한 신뢰성을 높일 수 있었습니다.

Jenkins

  • 백엔드, 프론트엔드에 대한 각각의 파이프라인을 구성하여 배포 과정에서의 문제점을 빠르게 판단할 수 있도록 하였습니다.
  • Jenkins 컨테이너 내부에서 clone, dockerize, serving 의 세 단계로 이어지는 두 개의 파이프라인을 구성하였습니다.
  • 백엔드, 프론트엔드 환경변수는 인프라 담당자가 직접 jenkins global credential에 추가하는 방식으로 관리하였습니다.

DB

  • DB는 Jenkins의 DinD 와 별개의 컨테이너로 구성하였습니다. mariaDB의 최신 이미지를 사용하였고, 도커 볼륨을 통해 데이터 영속성을 확보하였습니다.

Spring Boot

  • Jenkins 파이프라인에 따라 git repository에서 clone -> 기존 컨테이너 제거 -> 환경변수 주입 -> build -> dockerize -> Spring Boot 실행 순으로 배포하였습니다.

React

  • Jenkins 파이프라인에 따라 git repository에서 clone -> 기존 컨테이너 제거 -> 환경변수 주입 -> build -> dockerize -> 컨테이너 내의 웹서버(Nginx)를 통해 서빙 순으로 배포하였습니다.

Clone this wiki locally