롤링 배포
- 전체 시스템을 중단하지 않고(무중단) 새로운 버전을 점진적으로 배포, 업데이트
- 여러 서버가 있을 때 모든 서버를 한 번에 배포하는게 아니라 하나의 서버부터 배포
- 해당 서버가 문제가 있다면 롤백
- 해당 서버가 문제가 없다면 다음 서버 배포
- 장점
- 하나의 서버씩 배포하므로 나머지 서버가 배포중에도 서비스를 유지
- 문제가 발생해도 일부 서버에만 문제가 생김
- 단점
- 한 서버씩 배포하므로 배포 속도가 느림
- 동시에 각 서버가 서로 다른 버전을 갖게 됨(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)
- 웜업 방법
- 실제 서비스 트래픽과 비슷하도록 스크립트를 작성해서 자연스럽게 늘어나도록
- 결제 서비스 등은 이 방법이 어렵지만 이 방법이 가장 좋은 전략