woowacourse-teams/2022-pickpick

무중단 배포 적용

Closed this issue · 8 comments

신규 기능 개발


목적

이번 기능 개발의 목적을 간단히 적어주세요

무중단 배포 적용



상세 내용

구현할 기능 관련 상세 내용을 적어주세요

무중단 배포 적용



참고 사항

참고할 내용이 있다면 공유해주세요

  • WAS가 여러개로 분리되는 경우 아래 사항을 고려해야 함
    • 로그 파일 저장 위치
    • 리마인더 알림 서비스



무중단 배포 방법

Rolling Update

  1. 배포중인 인스턴스의 연결을 끊는다
  2. 모든 요청은 배포되지 않은(=연결이 끊기지 않은) 인스턴스로 전달된다
  3. 배포가 완료되면 다시 연결을 한다
  4. 모든 인스턴스의 배포가 완료될 때까지 1~3을 반복한다

👉 기존 버전과 업데이트 버전 둘 다 지원되어야하는데 현재 우리가 업데이트해야할 사항이 버전간 호환성이 지원되지 않음


Blue Green

  1. 사용하지 않는 인스턴스에 새로운 버전을 배포한다
  2. 배포가 완료되면 1에 연결한다
  3. 기존의 인스턴스와의 연결을 끊는다

👉 포트 체인지 형식으로 가면 인스턴스가 버텨줄지 모르겠음. 최종적으로는 인스턴스를 교체하는 형식으로 블루그린 선택.


기타 배포 방법

Canary

  1. 일부 사용자들에게만 새로운 버전을 배포한다
  2. 정상적으로 작동 또는 피드백을 보고 모든 사용자에게 적용한다

👉 반응이 좋은지 확인할 수 있을 정도의 트래픽이 없음

무중단 배포 과정

Jenkins 스크립트 파일

  1. pickpick 레포지토리 clone
  2. pickpick application 빌드 및 jar 생성
  3. deploy 레포지토리 clone
  4. find-address.sh를 이용해 사용/미사용 WAS 인스턴스의 private ip 주소 찾기
  5. 미사용 WAS 인스턴스에 변경된 애플리케이션 배포
  6. nginx 설정 변경
  7. deploy 레포지토리에 저장해둔 nginx.site를 nginx 인스턴스의 /etc/nginx/sites-available/jupjup.site에 복사
  8. nginx 인스턴스에 nginx-service-url.sh, nginx-reload.sh 복사 및 권한 부여
  9. nginx-service-url.sh를 실행시켜 global_stopped_address 값을 세팅
  10. nginx-reload.sh를 실행시켜 nginx 설정 변경 및 reload
  11. 기존에 사용중이던 WAS 인스턴스 kill.sh를 이용해 종료

정리왕 연로그 ❤️

nginx 설정 파일의 IP 주소를 동적으로 변경하기

변수를 저장하는 파일 생성하기

set $변수 값

## 예제
set $service-url 'jupjup.site'

파일 내용에 동적 파라미터 추가하기

  • sh 파일 실행 시 인자를 넘길 수 있다
  • 파일 내부에서는 인자를 넘긴 순서대로 $1, $2, ... 식으로 사용할 수 있다.
$ ./file.sh hello
  • 아래의 echo 명령어를 실행하는 sh 파일을 만든다.
## echo 명령어를 통해 파일을 생성할 수 있다.
echo '파일내용' > 파일위치/파일명

## 예제
echo 'set $service-url '$1 > /etc/nginx/conf.d/service-url.inc

nginx 설정 파일에서 동적 변수 사용하기

  • 위에서 만든 sh 파일을 nginx 설정 파일에 추가해주면 해당 파일에서 set 해줬던 변수들을 사용 가능하게 된다.
include /etc/nginx/conf.d/service-url.inc;

무중단 배포 과정

프레젠테이션1

무중단 배포 간단하게 테스트하기

  1. Jenkins를 통해 build
  2. nginx 인스턴스에 접속
  3. nginx 설정 파일의 IP 주소를 동적으로 변경하기에서 생성했던 IP 주소를 담은 파일 내용 확인

image

앞으로 고려할 사항

  • 로그 파일 위치
  • 리마인더 서비스