배포 방법과 배포 전략

2025. 2. 16. 17:27·개발

롤링 배포

  • 전체 시스템을 중단하지 않고(무중단) 새로운 버전을 점진적으로 배포, 업데이트
  • 여러 서버가 있을 때 모든 서버를 한 번에 배포하는게 아니라 하나의 서버부터 배포
  • 해당 서버가 문제가 있다면 롤백
  • 해당 서버가 문제가 없다면 다음 서버 배포
  • 장점
    • 하나의 서버씩 배포하므로 나머지 서버가 배포중에도 서비스를 유지
    • 문제가 발생해도 일부 서버에만 문제가 생김
  • 단점
    • 한 서버씩 배포하므로 배포 속도가 느림
    • 동시에 각 서버가 서로 다른 버전을 갖게 됨(DB 스키마가 다른 경우는 큰 문제가 생길수도)

 

블루그린 배포

  • 무중단 배포
  • 클라이언트는 블루 환경을 쓰고 있을 때 같은 서비스를 그린 환경으로 실행
  • 그린 환경에 대해 정상적으로 서비스가 가능한지 테스트
  • 만약 그린 환경이 정상이라고 확인이 되면 로드밸런서와 같은 라우터를 기존 블루 환경에서 그린 환경으로 변경
  • 라우팅 변경 이후에도 블루 환경을 일정 기간동안은 유지
  • 만약 그린 환경이 문제가 생길 경우 다시 블루 환경으로 바꿔 롤백 가능
  • 장점
    • 한 방에 전환 가능
    • 속도가 빠름
  • 단점
    • 일시적으로 두 배의 리소스가 필요(서버가 두 배로 필요함)
    • 배포할 때 새로운 서버들이 세팅되도록 해야 함
    • 전환 자동 스크립트와 같은게 필요함

 

카나리 배포

  • 일부 서버, 사용자에게만 먼저 배포
  • 롤링 배포와 다른 점은 일부 서버만 배포 후 오랜 기간동안 테스트
  • 다른 서버는 롤링으로 할지 블루그린 배포를 할지는 선택의 문제
  • 사용자를 기준으로 하면 사용자의 속성(id, 지역, 연령대)에 따라 로드밸런싱
  • 5% -> 10% -> 20% -> 50% -> 100% 이런식으로 배포도 가능
  • 설정/관리가 복잡하다는 단점이 있음
  • 따라서, 별도의 툴을 사용하는 경우가 많음
  • 사용자 경험이 일관되지 않음 단점이 있음

 

A/B 테스트 배포

  • 서로 다른 버전을 배포 후 어떤 버전이 사용자 경험이 더 좋은지 테스트
  • 예) 쿠팡의 최소주문금액 제한을 없애면 사용자는 더 많은 금액을 지출할지 테스트
  • 비지니스적 테스트 용도 
  • 대규모 시스템 개편시도 A/B 테스트로 하기로 하며 이는 섀도우 테스트, 미러링이라 하기도 함

 

배포 타이밍

  • 트래픽이 적은 시간(새벽)에 배포하기
  • 금요일에 배포하지 않기(업무 시간이 아닌 주말을 피하기 위해)
  • 주요 이벤트(블랙 프라이 데이) 직전 배포 자제
  • 배포 후 모니터링할 수 있는 시간이 있는 경우에 배포(퇴근직전 배포 X)

 

웜업

  • 성능이 중요한 서비스라면 웜업이 중요함
  • @Cacheable로 자주 조회되는 데이터를 캐싱하는데, 웜업이 되지 않은 경우 Cache Miss로 성능 저하
  • Connection Pool을 웜업을 통해 천천히 늘려나갈 수 있으며 이 때, 블루 그린 배포시 기존 블루가 커넥션을 맺고 있는 것도 고려해야함.
  • 외부 인스턴스에 순간 과부하 주지 않도록 고려
  • Java의 JIT(Just In Time) 컴파일러가 최적화 되도록 웜업 진행(https://5jyan.tistory.com/54)
  • 웜업 방법
    • 실제 서비스 트래픽과 비슷하도록 스크립트를 작성해서 자연스럽게 늘어나도록
    • 결제 서비스 등은 이 방법이 어렵지만 이 방법이 가장 좋은 전략

 

 

 

 

 

 

 

 

'개발' 카테고리의 다른 글

프롬프트 엔지니어링 작성 방법  (1) 2025.07.12
MCP 사용기(Claude Desktop을 활용하여 Firecrawl, slack 연동)  (4) 2025.07.05
책 정리 - 함께 자라기  (1) 2025.05.18
Java의 JIT(Just-In-Time) 컴파일러  (0) 2025.02.16
Java의 DB 접근 기본 구성 정리 및 Mybatis 적용 방법  (3) 2025.01.19
'개발' 카테고리의 다른 글
  • MCP 사용기(Claude Desktop을 활용하여 Firecrawl, slack 연동)
  • 책 정리 - 함께 자라기
  • Java의 JIT(Just-In-Time) 컴파일러
  • Java의 DB 접근 기본 구성 정리 및 Mybatis 적용 방법
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (118)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      버퍼
      프록시
      jpq
      빈 후처리기
      자바
      cglib
      조회 성능 최적화
      log trace
      hibernate5module
      @within
      gesingleresult
      Target
      고급
      프록시 팩토리
      양방향 맵핑
      JPQL
      페치 조인
      jdk 동적 프록시
      typequery
      스레드
      @discriminatorcolumn
      @args
      락
      단방향 맵핑
      WAS
      @discriminatorvalue
      김영한
      requset scope
      Thread
      reentarantlock
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    배포 방법과 배포 전략
    상단으로

    티스토리툴바