Post

무작정 따라 해보는 배포 5

무작정 따라 해본 배포 - 무중단 배포

무작정 따라 해보는 배포 5

무중단 배포란?

왜 BLUE-GREEN이어야 할까?

이전 프로젝트에서 BLUE-GREEN 무중단 배포를 사용했기에 정확히 알고 싶어서, 책에 나와있는 방법이라..

장점

  • 장점 1

단점

  • 단점1

BLUE-GREEN을 위해 필요한 것은?

  1. (로드밸런서로의) NGINX
    • 8081, 8082 포트 중 어느 서버로 요청을 전송해야 하는지 결정
    • upstream을 통해 서버의 그룹을 관리 한다.
    • upstream은 기본적으로 round robin 방식으로 동작하므로 특정 port로 요청을 보내도록 고정하는 명령어가 별도로 실행되어야 한다. (depoly.sh에서 고정됨, reload 필요)
    • Blue-Green 배포에서는 8081 또는 8082로 요청을 보내야 한다.
  2. deploy.sh에서의 추가적인 동작
    • 현재 어느 포트에서 서버가 실행 중인지 확인
    • 사용되지 않는 포트에서 jar 파일을 실행
    • 새로운 포트에서 실행한 서버에 대한 health check (해당 서버로 트래픽을 받아도 충분한가에 대한 테스트)
    • 모든 트래픽을 새롭게 실행된 서버가 받도록 NGINX를 Reload
    • 이전에 사용되고 있는 포트에서 실행되는 서버를 종료

나의 걱정과 고민들…

걱정 1 : deploy.sh에서 property파일을 어떻게 교체하는거지? EC2에 property파일이 있어야 하나?

NO!!

1
nohup java -jar -Dspring.profiles.active=blue deploy-study-0.0.1-SNAPSHOT.jar 1>stdout.txt 2>err.txt &

다음과 같이 실행을 하면 resouces/application-blue.properties를 property로해 jar 파일이 실행된다. 즉, active=${IDLE_PROFILE} 현재 사용중이지 않은 profile로 jar 파일을 실행할 수 있게 된다.

  1. nohup : 터미널 세션이 종료되어도 SIGHUP(Hangup) 시그널을 무시하고 프로세스를 계속 실행
  2. -Dspring.profiles.active=blue : application-blue.properties로 jar 파일을 실행
  3. 1>stdout.txt : 표준 출력(stdout)을 stdout.txt로 리다이렉션(stdout.txt에 표준 출력을 작성)
  4. 2>err.txt : 표준 에러(stderr)를 err.txt로 리다이렉션
  5. & : 백그라운드로 실행

걱정 2 : NGINX가 들어오는 요청을 8081 또는 8082로 보내야하는데 그건 어디서 설정해야하지? deploy.sh에서 설정하면 된다. deploy.sh에서 NGINX의 설정 파일을 변경(overwrite 된다.)하고, reload해 요청이 새로운 포트에서 실행되는 스프링부트 서버에게 전달되도록 한다.

1
2
# etc/nginx/conf.d/service-prod-url.inc
set $service_url http://127.0.0.1:8081;

health-check에 성공한 후, 다음 명령어가 실행됨과 동시에 service-url.inc 내부 내용은 다음과 같이 바뀐다.

1
2
echo "set \$service_url http://localhost:${IDLE_PORT};" | sudo tee /etc/nginx/conf.d/service-prod-url.inc
sudo service nginx reload
1
2
# etc/nginx/conf.d/service-prod-url.inc
set $service_url http://127.0.0.1:8082;

NGINX 설정

deploy.sh

마주했던 문제점

deploy.sh에서 set \$service_url http://localhost:${IDLE_PORT};라고 명령어를 넣어서 “no resolver defined to resolve localhost”라는 오류를 만났다.

This post is licensed under CC BY 4.0 by the author.