루빗 서버 구상도

tre2man
roubit.me
Published in
3 min readJul 7, 2022

현재 루빗의 글로벌 확장을 준비하기에 앞서, 서버 구조에 대한 정리를 한번 해 두려고 합니다. 급하게 확장하기 보다는 현재 상황에 대하여 복기하는 시간을 가져 보려고 합니다. 🤗

서버 운영

현재 서버 자체는 Elastic Beanstalk 기반의 docker container로 운영중 입니다. 각 서버는 NestJS 기반의 모놀리식 아키텍쳐 기반으로 운영중이고, 2개의 서버를 두어 로드밸런서로 트래픽을 분배하고 있습니다. 이 때 갑작스런 트래픽이 들어올 경우를 대비해 Auto scaling을 적용하여, 클라이언트에서 특정 트래픽 이상의 데이터를 요구할 경우 인스턴스가 늘어납니다.

Elastic Beanstalk에서 기본적으로 지원하는 기능이 저희 수준에서는 상당히 유용한 기능이 많아서 잘 쓰고 있습니다. 😀

DB

DB는 RDS에서 제공하는 postgres를 사용중입니다. RDS는 주기적인 스냅샷 제공, 높은 가용성 등의 기능들을 제공해서 사용중입니다.

배포

배포는 Jenkins를 이용하고 있습니다. github에 코드를 push하게 되면 Jenkins에서 자동으로 hook을 받아 빌드와 e2e test, ECR로의 image upload 및 서버 배포까지 담당하게 됩니다. 배포에 문제가 있거나 완료되면 Slack으로 메시지까지 전송됩니다.

데이터 처리

서버에서 생기는 로그들은 모두 AWS Firehose로 전달됩니다. 이 데이터들은 몇 분 간격으로 S3의 특정 폴더에 모두 업로드됩니다. 만약 특정 시간에 서버에서 문제가 생기면, 이 로그들을 분석합니다. 큰 데이터를 처리하는 경우에는 Athena를 사용하기도 합니다. 또한 GUI 그래프로 보여지는 특정한 데이터들은 Grafana 매트릭으로 출력합니다.

장애 트래킹

Elastic Beanstalk은 자동으로 서버 health check를 실행합니다. 그래서 서버에서 예상치 못한 응답(4xx, 5xx)이 지속적으로 보일 경우 Event Bridge에 이벤트를 보내게 설정했습니다. 이 때 Lambda 함수에 간단히 만들어준 Slack 메시지 전송 코드를 통해 어떠한 서버에서 에러가 났고, 어떠한 오류가 있는지를 알려주게 됩니다.

현재 서버의 구조를 간단히 그림으로 나타내 보았습니다. 아직 부족한 게 많지만, 지속적인 개선을 통해 최적의 구성에 가까워지고 있습니다.

--

--