자소설닷컴 인프라, 서버 구조 및 운영

hyob·2020년 8월 22일
1
post-thumbnail

머리말🗣

지난 포스팅 이후 시간이 꽤 지났네요.
작성해 놓은 글도 있고, 미완의 글도 있는데.. 다시 열심히 해보려 합니다!🤗

그 동안 이것저것 하면서 지내고 있었어요.
크게 보면
__1. 자소설닷컴 서비스 Dockerizing 👿
2. 사이드 프로젝트__👻
정도가 글로 공유할만한 소스인 것 같네요. 차근차근 글을 써보겠습니다😃

이번 포스팅은 1. 도커라이징에 대한 경험을 공유하기전, _자소설닷컴의 인프라구조_에 대해 먼저 이야기 해야할 것 같아서 작성하는 글 이에요!

본론

Infrastructure

완전히 동일하진 않지만, 자소설닷컴의 메인서비스 인프라와 유사한 구조여서 구글에서 퍼온 그림입니다.

(자소설닷컴은 aws의 서비스들을 사용하고 있습니다. )
클라이언트에서의 요청, 서버의 응답 파이프라인 관점에서 인프라구조에 관해 엿보려 해요.👀

유저가 jasoseol.com 으로 접속하면?
맨처음 Route53 DNS를 통해, 그림에도 있는 로드밸런서(Classic LB를 사용 중)에 도달합니다.

로드밸런서는 적절한 로직을 통해 오토스케일링 그룹에 속해있는 EC2로 요청을 보내게 돼요.(자소설닷컴은 보통 1~10개의 인스턴스가 실행되고 있습니다.)

요청에 따라, DB나 Redis, 채팅 서비스, 맞춤법 검사 서비스와 통신하고 있어요.

DB는 RDS (aurora) 를 사용중이고,
Elasticache Redis 를 캐시서버 등의 용도로 사용중입니다.
그 외에도 S3, lambda 등을 사용하고 있네요!
이와 비슷하게 백오피스 서비스도 구성되어있습니다.

아, 자소설닷컴에는

  • 자소설닷컴
  • 백오피스
  • link 서비스
  • 맞춤법 검사 서비스
  • 채팅 서비스

정도의 서비스들이 있어요!
서비스에 따라, 레일즈 프로젝트가 다르다 라는 정도로 생각해 주시면 좋을 것 같네요..ㅎㅎ

별거 없죠?
제 생각에는 서비스들이 많지도 않고, DB나 다른 서버의 스케일 관리 등을 열심히 하고 있지는 않기 때문에 나름 간단한 구조라고 생각합니다 ㅎㅎ

자소설닷컴 서비스의 EC2 내부를 들여다 보자

이전 내용을 읽다보면 알수 있으실 텐데, 자소설닷컴은 프론트랑 백엔드를 분리 하지 않고 하나의 앱으로 통합 개발하고 있어요🦋

그래서 하나의 EC2 서버에는
Nginx - passenger
Rails Application
이 구성되어 있어요.

로드밸런서에서 요청을 분산시키면, 하나의 EC2 서버에서는 웹서버 Nginx가 리버스 프록시의 역할을 합니다. 그리고 필요에 따라 앱서버인 Passenger 가 레일즈 앱을 실행 시켜요.
개발자들은 바로 이 Rails 앱 개발을 하게 됩니다.

여기까지가 간단하게 요약한 서버 구조였습니다! 여러분들은 바로 이해하셨겠죠?

웹 개발자들의 개발 -> 배포 과정

저희는 프론트엔드/백엔드 개발자의 구분이 없어요🐥
서비스마다 하나의 레일즈앱 에서 프론트, 백엔드 코드를 작성하고 있구요.
새 피쳐가 개발 될 때마다 새 코드가 머지 된 레일즈 앱을 배포해야 합니다.

배포 과정에 대해 간략히 이야기 하자면,,,

  1. ec2 인스턴스 한개에 접속해 새 코드를 풀 받습니다.
  2. DB스키마에 변화가 있다면, 마이그레이션 합니다.
  3. 프론트 수정이 있다면, static 파일을 precompile 합니다.
  4. Nginx를 재 실행 합니다.
    (현재 실행중인 ec2인스턴스 수가 적다면, 위 1~3을 각 인스턴스에 접속하여 반복합니다,,)
  5. 위 1~4번 과정을 진행한 인스턴스로 AMI를 생성합니다.
  6. 오토스케일링 그룹의 시작 구성을 위 AMI로 교체합니다.
  7. 오토스케일링 그룹의 최소 용량을 현재 인스턴스 수 만큼 증가시킵니다.
  8. 증가된 용량만큼 새 AMI로 인스턴스가 생성되고 잘 실행되는것을 확인하면, 오토스케일링 그룹의 최소 용량을 다시 줄이고, 기존의 인스턴스들을 그룹에서 제거 및 중지시킵니다.

빼먹은게 있나 모르겠는데 대략 이정도인 듯?하네요🐢

이 과정을 한 명의 개발자가 진행하고 있습니다.
다른 회사에서는 어떤식으로 배포 과정을 운영하는지 궁금하네요☔️
아주 다양한 방식으로 진행하고 계시겠죠?,,

이슈s

모든 이슈들을 기억하지는 못하지만,,
일단 배포 과정에서 휴먼 에러 가 존재합니다. 배포가 덜된 인스턴스가 존재한다라던지, 새 인스턴스 생성 후 기존 인스턴스가 남아있다던지 등등등등,,
저는 이게 사람의 문제가 아니라, 시스템의 문제라고 생각해요.

그리고 배포 횟수가 많아졌습니다.
개발자 수가 늘어나면서, 동시에 진행되는 태스크도 많아지고 그만큼 배포 횟수도 늘어났습니다.

배포 담당자의 시간을 계속 갉아 먹고 있죠..
그리고 작은 사이즈의 배포를 하루에 여러번 하는게 쉽지가 않은듯 합니다.

그래서 저는 CD를 해내고 싶었어요⚡️☄️💥

이외에도 크고 작은 이슈들이 있어요.
백그라운드잡을 위해 사이드킥을 사용하고 있는데, 이게 갑자기 종료되버린다던지? 그러면 인스턴스마다 접속ㅎ해서 확인해야합니다,,

꼬리말

급 꼬릿말이 되었읍니다,,

아무튼 도커라이징을 했어요. 다음 포스팅에서 그 경험을 공유하도록 할게요 !

그리고 사이드 프로젝트🔥
랜덤빵이라는 iOS앱을 만들었어요!
N빵 대신 랜덤빵 입니다,,
구경 부탁드리고 다운로드 부탁드립니다,, (앞광고임)
https://apps.apple.com/kr/app/id1527899947

예전부터 사이드를 하나 해야겠다 다짐만 하고 있었는데, 간단하게나마 시작했읍니다🍀
첫 프로젝트인데 일단 출시하고 나니까 기분이 좋더라구요.. 다음에 포스팅으로 이야기 해보겠습니다~~~~~~~~~~~🤩

profile
앵커리어에서 자소설닷컴을 개발하고 있습니다.

0개의 댓글