[L.E.Assemble] nginx 로드밸런싱 적용과 배포 스크립트 수정
#Project/L.E.Assemble

[L.E.Assemble] nginx 로드밸런싱 적용과 배포 스크립트 수정

 

1. /api 경로에 대해 두 개의 App으로 로드밸런싱

2. 배포 시나리오 수정


 

변경 전 상황

1. EC2에는 두 개의 App이 존재하고 로드밸런싱이 적용되지 않았다.

2. 모든 요청은 하나의 App이 처리하고 쉬고있는 App이 존재한다.

 

 

배포 시나리오 요약
1. 휴식중인 App을 찾고 배포한다.
2. 배포가 완료되면 휴식중이던 App을 서비스할 App으로 변경 (switch)

CodeDeploy 흐름
1. AfterInstall [stop.sh, profile.sh] 
    1.1 8081, 8082 중 쉬고있는 port의 App 선택
    1.2 쉬고있는 port의 App 종료
2. ApplicationStart [start.sh, profile.sh]
    2.1 빌드파일 복사해와서 권한 부여
    2.2 쉬고있는 port의 App에 배포 후 실행
3. ValidateService [health.sh, profile.sh, switch.sh]
    3.1 쉬고있는 port의 상태 체크
    3.2 service_url을 신규 배포된 쉬고있는 port로 switch

 


 

변경 후 (/api 경로에 대해 로드밸런싱 처리)

1. "/" 경로에 대해 하나의 앱이 처리한다.

2. "/api" 경로로 오는 요청은 두개의 로드밸런서가 나눠서 처리한다.

3. 무중단 배포를 위해 두개의 앱을 차례로 업데이트한다. (롤링방식)

 

배포 시나리오 요약
1. 세컨드 App을 찾고 배포
2. 배포완료된 세컨드App을 서비스할 App으로 변경(switch)
3. 원래 서비스한 App(배포완료되지 않은 App)을 종료 후 배포

CodeDeploy 흐름
1. 기존과 동일
2. 기존과 동일
3. ValidateService [health.sh, profile.sh, switch.sh, deploySecondApp.sh] 
    3.1 쉬고있는 port의 상태 체크
    3.2 service_url을 신규 배포된 쉬고있는 port로 switch
    3.3 deploySecondApp 스크립트의 함수 실행하여 1,2번의 작업 실행 후 종료

 

 

 

deploySecondApp.sh

#!/usr/bin/env bash

ABSPATH=$(readlink -f $0)
ABSDIR=$(dirname $ABSPATH)
source ${ABSDIR}/profile.sh

function deploy_second_app()
{
  echo "> 두 번째 배포를 시작합니다."

  IDLE_PORT=$(find_idle_port)

  echo "> $IDLE_PORT 에서 구동중인 애플리케이션 pid 확인"
  IDLE_PID=$(lsof -ti tcp:${IDLE_PORT})

  if [ -z ${IDLE_PID} ]
  then
    echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
  else
    echo "> kill -15 $IDLE_PID"
    kill -15 ${IDLE_PID}
    sleep 5
  fi

  REPOSITORY=/home/ec2-user/app/back
  PROJECT_NAME=L.E.Assemble-back

  echo "> 두번째 어플리케이션 배포"
  JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)

  echo "> JAR Name: $JAR_NAME"
  echo "> $JAR_NAME 에 실행권한 추가"
  chmod +x $JAR_NAME

  echo "> $JAR_NAME 실행"

  IDLE_PROFILE=$(find_idle_profile)
  echo "> $JAR_NAME 를 profile=$IDLE_PROFILE 로 실행합니다."

  nohup java -jar \
    -Dspring.config.location=classpath:/application.properties,classpath:/application-$IDLE_PROFILE.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties \
    -Dspring.profiles.active=$IDLE_PROFILE \
    $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
}

 

 

정리, 개선할 점

로드밸런서를 패치하는 기법에는 여러 종류가 있고 장단점이 존재한다.

지금 적용한 스크립트는 2개의 App일때만 가능하고 로드밸런싱될 App이 늘어날 경우 수정이 필요하다.

 

 

 

참고 이론자료

https://perfectacle.github.io/2019/04/21/non-stop-deployment/

 

무중단 배포란...?

실제로 우리가 간단하게 서버를 배포하는 시나리오를 생각해보자. 80포트(혹은 다른 포트)에 우리의 서버를 띄운다. 새롭게 배포할 내용이 있다고 하면 포트가 충돌나면 안 되기 때문에 서버를

perfectacle.github.io

728x90