
블루-그린 배포(Blue-Green Deployment): 무중단 배포의 정석
서버를 끄지 않고 배포하는 법. 롤링, 카나리, 블루-그린의 차이점과 실제 구축 전략. DB 마이그레이션의 난제(팽창-수축 패턴)와 AWS CodeDeploy 활용법까지 심층 분석합니다.

서버를 끄지 않고 배포하는 법. 롤링, 카나리, 블루-그린의 차이점과 실제 구축 전략. DB 마이그레이션의 난제(팽창-수축 패턴)와 AWS CodeDeploy 활용법까지 심층 분석합니다.
새벽엔 낭비하고 점심엔 터지는 서버 문제 해결기. '택시 배차'와 '피자 배달' 비유로 알아보는 오토 스케일링과 서버리스의 차이, 그리고 Spot Instance를 활용한 비용 절감 꿀팁.

내 서버가 해킹당하지 않는 이유. 포트와 IP를 검사하는 '패킷 필터링'부터 AWS Security Group까지, 방화벽의 진화 과정.

왜 넷플릭스는 멀쩡한 서버를 랜덤하게 꺼버릴까요? 시스템의 약점을 찾기 위해 고의로 장애를 주입하는 카오스 엔지니어링의 철학과 실천 방법(GameDay)을 소개합니다.

www.naver.com을 치면 일어나는 일. Recursive Query부터 Root 서버의 역할, DNS 레코드 타입(A, CNAME, MX), TTL, 그리고 DNS 캐시 포이즈닝 공격까지 심층 분석합니다.

배포를 처음 배울 때, 항상 이런 고민이 생깁니다. "서버 재시작하는 1분 동안 사용자가 결제 버튼을 누르면 어떡하지?" "배포했다가 에러 나면 롤백하는 데 30분은 걸릴 텐데..."
이 고민에서 시작한 해결책이 바로 무중단 배포입니다. 과거에는 사용자가 가장 없는 새벽 시간에 점검 공지를 걸고 배포하는 방식이 일반적이었습니다. 이를 점검 시간(Downtime)이라고 불렀죠. 하지만 쿠팡이나 넷플릭스가 "새벽 2시부터 6시까지 점검입니다"라고 하는 거 본 적 있나요? 거의 없습니다. 그들은 24시간 365일 무중단으로 서비스를 운영하면서도 하루에 수십 번씩 배포를 합니다.
그 비결이 바로 무중단 배포(Zero Downtime Deployment)이며, 그중에서도 가장 확실하고 안전한 방법이 블루-그린 배포(Blue-Green Deployment)입니다.
무중단 배포에는 크게 3가지 방식이 있습니다. 각각의 장단점을 명확히 알아야 상황에 맞는 전략을 짤 수 있습니다.
서버가 10대 있다면, 1대씩(혹은 2대씩) 차례대로 새 버전으로 갈아끼우는 방식입니다.
광산의 카나리아처럼, 새 버전을 소수(1~5%)의 사용자에게만 먼저 노출시켜 봅니다. 문제가 없으면 점차 트래픽을 늘려갑니다(10% -> 50% -> 100%).
오늘의 주인공입니다. 현재 운영 중인 환경(Blue)과 똑같은 환경(Green)을 하나 더 만듭니다. 배포할 때는 Green에 새 버전을 모두 설치하고 테스트합니다. 준비가 끝나면 로드밸런서가 가리키는 방향을 Blue에서 Green으로 한 방에 돌려버립니다.
개념은 쉽지만, 실제로 구현하려면 몇 가지 단계가 필요합니다. AWS나 Kubernetes 환경을 예로 들어보겠습니다.
현재 Live 트래픽은 Blue 그룹(EC2 인스턴스 3대, V1)으로 가고 있습니다. 우리는 대기 중인 Green 그룹(EC2 인스턴스 3대)에 새로운 V2 버전의 애플리케이션을 배포합니다. 이때 일반 사용자는 여전히 Blue를 보고 있으므로, Green에서 지지고 볶고 어떤 짓을 해도 사용자에게는 아무 영향이 없습니다. 개발자들은 Green 환경에 접속해서 QA를 진행합니다.
Green 그룹의 서버들이 정상적으로 떴는지 확인합니다.
단순히 포트(80)가 열렸는지만 보는 게 아니라, /health API를 찔러서 DB 연결은 잘 되는지, 레디스는 붙었는지, 외부 API 연동은 되는지 Smoke Test를 수행합니다.
모든 테스트가 통과했다면, 로드밸런서(ELB, Nginx) 설정을 변경합니다.
Target Group: Blue -> Green
이 순간, 모든 새로운 사용자는 Green으로 접속하게 됩니다. 이것이 Cutover입니다.
Green으로 트래픽을 돌린 후 에러율(500 Error, 404 Error)이 치솟는지 봅니다. 만약 문제라면? 즉시 다시 로드밸런서를 Blue로 돌립니다 (Quick Rollback). 만약 1시간 동안 문제가 없다면? 이제 Blue 그룹의 서버를 종료(Terminate)하여 비용을 절감하거나, 다음 배포를 위한 대기 상태(Staging)로 전환합니다.
서버(Stateless)는 그냥 2배로 늘리면 됩니다. 돈으로 해결되죠. 하지만 데이터베이스(Stateful)는 하나를 공유합니다. 여기서 문제가 터집니다.
users 테이블의 fullname 컬럼을 씁니다.fullname을 쪼개서 first_name, last_name 컬럼을 씁니다.fullname 컬럼을 삭제하고 first_name, last_name을 추가했습니다.Unknown column 'fullname' 에러가 로그에 도배됩니다. 배포하기도 전에 서비스가 죽어버린 겁니다. DB 스키마가 하위 호환성을 잃었기 때문입니다.DB 마이그레이션이 필요한 경우, 배포를 한 번에 하려 하지 말고 4단계로 쪼개야 합니다.
first_name, last_name 컬럼을 추가(Add)만 합니다. fullname은 건드리지 않습니다. (V1 서버 정상 작동). 이때 트리거(Trigger)를 걸어서 fullname에 들어오는 값을 새 컬럼에도 복사해줍니다.fullname 데이터를 새 컬럼들로 복사(Backfill)합니다.fullname 컬럼을 삭제합니다.즉, "스키마 변경은 무조건 하위 호환성(Backward Compatibility)을 유지해야 한다"는 원칙을 지켜야 블루-그린 배포가 가능합니다. 이게 무중단 배포의 핵심이자 가장 귀찮은 부분입니다.
DNS 레벨에서도 블루-그린 배포 흉내를 낼 수 있습니다.
api.example.com A 레코드에 두 개의 IP를 연결합니다.
서버 코드는 바꿨는데, 사용자는 여전히 옛날 자바스크립트나 CSS 파일을 보고 있을 수 있습니다. CDN(CloudFront)이 파일을 캐싱하고 있기 때문입니다.
블루-그린 배포 시 반드시 CDN Invalidation(캐시 삭제) 과정이 파이프라인에 포함되어야 완벽한 배포가 됩니다.
더 좋은 방법은 파일 이름에 해시값(app.a1b2c.js)을 붙여서 강제로 새 파일을 받아가게 만드는 전략(Cache Busting)을 쓰는 것입니다. 리액트나 뷰(Vue) 같은 SPA 프레임워크 빌드 도구들이 이걸 자동으로 해줍니다.
블루-그린 배포는 리소스가 2배로 들기 때문에, 스타트업 초기에는 부담스러울 수 있습니다. 하지만 클라우드 환경(AWS)에서는 "사용한 만큼만" 돈을 내므로, 배포하는 그 30분 동안만 서버를 2배로 늘렸다가, 배포 끝나면 바로 줄이는 방식으로 비용을 아낄 수 있습니다.
사용자에게 "점검 중(503 Service Unavailable)" 화면을 보여주는 건 2010년의 감성입니다. 사용자는 기다려주지 않습니다. 새벽 3시에도 접속하는 글로벌 유저가 있을 수 있습니다. 마음 편한 퇴근(칼퇴)과 사용자의 끊김 없는 경험을 위해, 무중단 배포 파이프라인 구축은 선택이 아니라 개발 팀의 필수 역량입니다.
지금 당장 여러분의 배포 파이프라인을 점검해보세요. 배포 버튼을 누를 때 손이 떨린다면, 그것은 시스템 문제이지 여러분의 담력 문제가 아닙니다.