사건의 발단
서버가 중간에 죽는 문제가 있었다.
전체적으로 메모리 누수와
동작중인 3개의 컨테이너간의 메모리 할당량을 체크해봤지만 아무런 문제가 없었다.
기본적으로 스왑 메모리를 많이 달아도
너무 많은 컨테이너를 무료 인스턴스에서 돌리려고 한 것이고,
스왑 메모리 자체가 성능적이 저하를 일으킬 것이 문제였다.
(심지어 HDD로 이루어진 스왑 메모리이기 때문에 더 느릴 것으로 추산했다. 자세한 내용은 이 글 참조)
이제 고민을 해야했다.
스케일 업인가, 스케일 아웃인가
스케일 업 vs 스케일 아웃
서버의 자원 한계점 도달이라는 현 상황에서 사용 가능한 대안을 생각해보자.
크게 스케일 업과 스케일 아웃이라는 경우의 수가 존재한다.
스케일 업이라는 것은 서버의 자원(CPU, RAM)을 더 좋은 성능의 부품으로 바꾸는 작업을 말한다.
이를 통해 서버가 더 많은 부하를 견딜 수 있도록 해주는 것이다.
서버가 멈춰버리는 이전과 같은 상황이 생긴다면 스케일 업을 통해 더 강한놈으로 재탄생시킬 수 있지만
그만큼 비용이 부과되고, 현 상황에서 스케일업을 한다면 모든 api가 동작하지 않을 수 있다는 문제가 있다.
스케일 아웃이라는 것은 다른 서버들을 중복으로 두어 부하를 분산하는 작업을 말한다.
이를 위해 부하를 균등하고 분배시킬 로드 밸런서를 이용해 각 서버별 부하를 체크하고 부하를 일정하게 분산시켜줄 수 있다.
이중에 나는 스케일 아웃을 선택했다.
왜? 극한의 이득충이니까...
나는 같은 동작을 처리해주는 컨테이너들을 복수로 두는 것이 아니다.
간단한 토이프로젝트를 배포해보는 입장에서,
멀티 모듈로 구현된 프로젝트를 모듈단위로 컨테이너화 시키고
모듈당 하나의 컨테이너만이라도 실행시키면 된다는 것이다.
(즉, 모듈당 하나씩 뽑은 컨테이너를 다 모아서 한 서버에서 실행시킬 수 없다는 뜻...)
이득충이 어떻게 스케일 아웃을 함?ㅋㅋㅋㅋㅋ
할 수 있다.
이번에는 오라클 클라우드가 아닌, 구글 클라우드에서 인스턴스를 가져올 생각이다.
여기 요금표를 보면 딱 하나의 e2-micro vm까지는 사용을 해도 무료로 쓸 수 있다는 이야기가 있다.
이를 이용해 다른 서버를 사용해보려고 한다.
그렇다면 어떻게 서버를 나눌지 생각해야 한다.
현재 내 모듈들을 그려보고, 이 모듈이 어떻게 서로 동작하는지 확인해야 한다.
현재 OCI 무료 인스턴스 내부에서 동작하고 있는 컨테이너(모듈)이다.
Fridge모듈에서 재료를 추가했을 경우 회원의 정보에서도 데이터를 수정해주기 위해 Redis Pub/Sub을 이용한 이벤트 핸들링을 하고있다.
모듈간의 다른 이벤트가 존재하지 않는다.
Redis 또한 현재 OCI 인스턴스 안에서 동작하고 있기 때문에, OCI 인스턴스에 Auth와 Fridge만을 동작시키고, Member와 Recipe를 다른 모듈로 두면 될 것 같다는 생각이 들었다.
OCI가 이미 있으니까 GCP 인스턴스를 만들어보자.
이전에 보여준 가격표에 맞게 GCP 인스턴스를 무료로 만들었다.
보통은 ssh로 터미널을 이용한 접근을 하는데, 구글은 인스턴스를 만들 때 pem키를 주질 않았다.
여기에 있는 ssh를 클릭하면 브라우저에서 터미널을 열어준다.
브라우저 상으로 ssh접속을 시켜주는 것이다.
참 신기했다.
이제 도커를 받아야 한다.
리눅스 배포판은 데비안이라고 한다.
이걸 왜 말하냐고?
이제 apt인지 yum인지 명령어를 다 두들겨보고 정하지 않아도 된다.
https://jangsarchive.tistory.com/169
[운영체제] 리눅스 패키지(내가 맨날 헷갈린 apt쓸 때와 yum을 쓸 때)
(패키지라는 것이 무엇인지 알고 보는게 편하다. 이전 포스트를 보고오자. 리눅스에서는 리눅스 패키지라는 것이 존재한다. 리눅스 패키지란 리눅스 시스템에서 소프트웨어를 실행하는데 필요
jangsarchive.tistory.com
이미 한번 찾아봤거든!!!
데비안이기 때문에 apt로 명령을 해주면 된다.
update와 upgrade를 해주고 도커를 다운받자
Docker를 다운받는 방법은 도커 공식 홈페이지에 존재한다.
잘 보면 도커는 sudo 권한으로만 실행시킬 수 있는데, 이 권한을 바꿔주자.
sudo gpasswd -a $USER docker
혹은
sudo usermod -aG docker $USER
라는 명령어를 이용해 도커에 현재 사용자 권한을 추가해주자.
이후 다시 해당 사용자로 접근하면 정상적으로 동작이 수행된다.
이제 해당 도커 허브에 접근해 도커 컨테이너를 가져올 수 있다.
이제 스왑메모리를 위한 노가다를 시작했다.
Sudo하는데 왜 비밀번호가 필요해?
나는 브라우저상에서 ssh를 접속해 사용을 했는데, 계속해서 비밀번호를 물어봤다.
찾아보니 브라우저 상에서 비밀번호를 등록하는 것이 아닌, rsa키를 직접 만들어 GCP 인스턴스에 공개키를 주고 내 개인키로 접근해야 하는 것이었다.
다시 돌아가서 키 세팅을 해주자.
ssh-keygen -t rsa -b 4096 -C "janghee5395@gmail.com"
이렇게 터미널에 입력해 공개키/개인키를 받아주었다.
ssh키가 모인 곳들로 이동해
이걸 열어보면 공개키가 나온다. 이걸 복사해서 등록해주어야 한다.
여기에 가보면 ssh키를 등록하는 곳이 있고, 여기에 공개키를 복사해서 넣어주었다.
이렇게 해서 ssh로 접속을 해보았다.
이제 정상적으로 루트 권한으로 사용할 수 있고, 이 상태에서 스왑메모리를 추가해주었다.
(스왑 메모리 추가 방법은 이 포스팅을 참고하자!)
https://jangsarchive.tistory.com/153
[Infra] 스왑메모리 딥다이빙(1. 서버 메모리 부족이 쏘아올린 작은 공)
서론 스왑메모리은 영상 인코딩을 하다가 서버가 부하를 버티지 못하는 문제로 사용해야겠다는 생각이 들었다. 이전에 사용을 위해서 스왑메모리라는 것이 단순하게 서버가 가지는 저장공간(
jangsarchive.tistory.com
도커 로그인 & 컨테이너 가져와 실행시키기
비밀번호는 같이 붙여넣지 않겠다. 들키면 x되니까.
이렇게 도커로 로그인을 해서 사용할 컨테이너들을 불러오자.
두 개의 컨테이너를 불러왔다. 이제 실행만 시키면 된다.
docker run~~~의 명령어인데 사람에 맞게 사용하면 된다고 생각한다.
이 포스팅을 참고하자
https://jangsarchive.tistory.com/146
[Infra] git clone의 문제점, 그리고 어떻게 하는 것이 좋을까?
이전에 git clone을 통해 프로젝트를 받는 방식을 알아보았다. 이 방식의 문제가 무엇일까? 직접 npm install을 해주어야 한다. nestjs : npm run start, java : java -jar의 방식으로 프로젝트를 실행시켜야 한다
jangsarchive.tistory.com
이렇게 GCP에서 두 개의 컨테이너를 열었다.
기존의 OCI에 존재하던 컨테이너 3개 중 Member를 지우기로 했다.
(확실히 레디스와 펍섭때문인지 메모리를 많이 먹는 OCI다)
이렇게 스케일아웃이 아닌 스케일아웃(?)이 끝났다.
원래는 2Gi정도가 더 좋다고는 하는데 안전하게 3Gi씩 넣었는데 다행히 동작을 잘 될 것 같다는 기대를 해본다(?)
이제 뭐할꺼임?
인스턴스가 두 개가 되었기때문에, 무중단 배포를 해주어야 하며, 무중단 배포를 위한 스크립트에 대한 학습을 더 해야할 것 같다.
그리고 두 개의 다른 ip로 되어있는 주소때문에, 이를 위한 포워딩을 해주어야 할 것 같다.
1차 MVP에 대한 구현이 전부 끝난 상황에서,
앞으로 냉메추 서비스에서 내가 해야할 일은 다음과 같다.
- MemberRecipe(사용자 레시피 조회 내역)을 군집화시켜 레시피 추천 로직 만들어주기
- 레시피 데이터 크롤링 & 크롤링 된 레시피에 따른 재료 및 레시피 데이터 주입해주기
- ip와 포트를 포워딩시켜주기
- CI/CD 추가로 달아주기
초기엔 구현을 빠르게 하고 싶다는 욕구가 들어 구현부터 했지만,
늦었더라도 인프라적인 부분들과 ML에 관련된 부분에 더 힘써야겠다.
그럼...twenty thousand...🔥
'냉메추' 카테고리의 다른 글
[냉메추] 이제 언어가 늘어갑니다!!! JS도 씁니다!! (0) | 2024.05.20 |
---|---|
[냉메추] 멀티모듈로 구현을 한다는 것. 서버가 많이 필요하다는 것. (0) | 2024.04.29 |
[냉메추] Oracle Cloud를 이용한 서버 환경 구축하기(1. 인스턴스 생성, Docker 설치, 젠킨스 컨테이너 가져오기) (1) | 2024.04.03 |
[냉메추] 학교에서 새로운 서비스를 만들어보게되었다..! (0) | 2024.03.28 |