[Infra] 무중단배포 전략

이열음·2022년 9월 29일
1

무중단 배포란?

로드밸런싱을 활용하여 요청을 분산시켜 운영 중인 서비스를 중단하지 않고 신규 소프트웨어를 배포하는 기술이다. 서비스 장애와 배포의 부담을 최소화시키고 서버나 프론트엔드를 업데이트해도 사용자 입장에서는 끊기는 시간이 없게 느껴진다.

왜 해야하나?

  • 젠킨스에서 jar파일 빌드하고 보내서 서버 실행시킬동안 생기는 시간지연(donwTime) 개선하기 때문
    • 사용자 경험 개선
      • 우리 서비스는 지금 → 릴리즈 + 지속적인 수정이 이루어지는 중
      • PROD 서버를 업데이트하면 서버가 올라갔다 내려가는 시간이 있음
      • 이때 유저가 마침 접속해서 사전질문 작성하고 있었다면? 유저입장에서는 터진것처럼 보일것.
    • 서비스 안정성 개선
      • 서비스가 터져도 다른 서버로 요청을 돌리면 되니까 안정성 측면에서도 도움이 된다고 생각함.
    • 요구사항(new)

공부를 해보자!

롤링

  • 서버를 하나씩 변경한다.
  • 올릴때는 연결을 끊어놨다가 신버전 올라가면 로드밸런서로 신버전에 라우팅한다.
- 서버 1을 라우팅에서 빼고
- 서버 1 배포
- 서버 1 라우팅 추가
- 서버 2 라우팅 빼고
- 서버 2 배포
- 서버 2 라우팅 추가

블루 그린

  • 인스턴스 하나 안에 스프링부트 그룹을 둔다.
  • 인스턴스 하나 통째로 신버전으로 교체한뒤 로드밸런서로 신버전에 라우팅한다.
  • 기존 버전은 비활성화 한다.
- 서버 1만 연결 서버 2는 라우팅에서 빠져있음
- 서버 2 배포
- 서버 1 라우팅 끊고 서버 2로 라우팅 추가
  • 하나에만 배포하면 되니까 속도가 롤링에 비해 빠르고, 문제 생겼을떄 Green으로 롤백하면 된다.

카나리

  • 소수의 사용자는 신버전으로 라우팅, 나머지는 구버전으로 라우팅하다가 안정되면 균일하게 라우팅

뭘 고려했나?

  • 인프라 학습 및 경험
  • 실제 우리 서버에 들어올 예상 트래픽 → 근데 요구사항때문에 갑자기 천만명됐네..^^

아힝구

설계 과정

포트포워딩 + 블루그린(요구사항때문에 벤)

이유

인스턴스를 하나로 유지하기 위해서

EC2 단위의 부하분산 경험을 포기하고 경제적인 판단력을 어필하는게 지금 서비스 사이즈에선 좀 더 설득력이 있을 것 같음

학습을 위해서는 인스턴스를 여러개로 늘려서 로드밸런싱을 IP 단위로 하게하는게 맞긴함

  • 정석적 + 실제 서비스에서 로드밸런싱을 한다면 사용하는 설계법이니까

근데 면접때 뭔가 근거를 물어보면 학습을 위해서라는 대답보다는 좀더 현실적인 이유를 대고싶음

  • 프로젝트가 끝나는 시점을 기준으로 한다면 우리 서버에 들어올 예상 트래픽은 많아봤자 150명
  • 진짜 서비스라고 가정했을때 로드밸런싱으로 부하분산해야할 크기일까? 나누기엔 쏘스몰
  • 가뜩이나 우리는 이번 4기 활동내에서 주요 타겟층이 우테코로 한정되어있음
  • 확장할 계획은 있으나 계획 자체가 불투명하기때문에 지금 유저가 늘어날 상황을 가정해서 ec2 리소스를 추가적으로 쓰는건 다른 사람이 들었을때 경제적인 판단이 아니라는 생각이 들 것 같음.

라고 쓰고 있었는데 갑자기 1000만명 요구사항 뜸

블루그린

이유

사용자가 언제나 일관된 경험을 할 수 있기 때문에

서버 버전이 바뀌는 시점이 똑같고, 신버전에 한해서 요청을 받게되기 때문에 사용자입장에서는 언제나 일관된 경험을 할 수 있음

롤링은 왜 벤?

우리 서비스가 현재 메인기능 개발을 마치고 유지보수에 집중하는 단계라면 부하분산덕에 효율적이겠지만 우리는 릴리즈와 개발을 동시에 진행하고 있기때문에 아무래도 더 안전한 방향을 택하는게 좋겠다고 생각함

롤링은 PROD 배포시 에러를 발견해도 교체를 끊기가 애매함 + 롤백이 어려움

  • 이 설계는 서버 어플리케이션이 올라가자마자 새 버전에 포워딩을 통해 사용자를 받게 됨 + 하나 완료되면 다른 EC2에 떠있던 애들도 차례차례 자동으로 새버전 교체됨
  • 만약 어플리케이션이 정상적으로 동작하지만 dev단계에서 발견하지 못한 에러가 있다면?
    • 교체 도중에 발견했을 시, 다른 EC2를 새 버전으로 교체되는걸 막기 애매함
      • 중간에 멈추면 어떤 유저는 구버전, 어떤 유저는 신버전을 보고있게되니까
    • 교체 이후에 발견했을 시, 이미 다 업데이트 된 버전(에러터진 버전) 일거라 롤백하기가 어려움
    • 1개 업데이트 중 1개 구버전일때 구버전 EC2로 부하가 쏠림(천만명..)

고민

  • 먼가.. 카나리가 사실 이상적이고 좋은데, 네트워크 관리비용이 클 것 같음.
  • 구현이 어려울 것 같아서 제한시간내에 하려면 블루그린 거의 확정으로 갈듯...?
  • 프론트는 그대론데 백엔드만 API스펙을 변경해서 배포하게 되면 프론트에선 터지지않을까? 두개를 동기화하는 방식 연구해보기.
  • 순차적으로 업데이트되는 전략(카나리나 롤링)을 사용하게 되면 프론트가 받게되는 요청이 일관적이지 않음. -> 버저닝이라는게 있다는데 한번 알아볼 것!

회의 후

???: 백엔드는 블루그린으로 어떤 프론트엔드 서버에서 요청을 보내도 같은 응답값 제공하고 프론트엔드는 카나리로 해서 빠른 피드백 받게끔 하는건 어때?

-> 근데 이러면 백엔드 API 변경시 프엔이 응답값을 잘못받아서 깨지는 경우 생길수도 있지않아?

결론:
FE은 방법을 좀 더 고민해보고
BE는 EC2 인스턴스 파고 로드밸런싱(카나리를 할건지 블루그린을 할건지 고민)

Ref

https://jay-ji.tistory.com/m/99

https://llshl.tistory.com/47

https://www.samsungsds.com/kr/insights/1256264_4627.html

https://dev.classmethod.jp/articles/load-balancing-types-and-algorithm/

0개의 댓글