Connection Draining이란? 무중단 배포의 숨은 핵심 원리

Connection Draining이란?

Connection Draining(커넥션 드레이닝)은 서버를 종료하거나 배포를 진행할 때, 이미 연결되어 처리 중인 요청을 강제로 끊지 않고 안전하게 마무리될 때까지 기다려주는 기능입니다. 로드밸런서나 오케스트레이션 도구(Kubernetes, AWS ELB 등)에서 주로 제공하며, ‘연결을 서서히 빼낸다’는 의미에서 draining이라는 이름이 붙었습니다.

비유하자면 카페 마감 시간과 비슷합니다. 마감 시간이 되었다고 해서 이미 주문을 받고 커피를 만들고 있는 손님을 쫓아내지 않죠. ‘지금 이후로 새 주문은 받지 않지만, 이미 진행 중인 주문은 끝까지 처리한다’는 원칙이 바로 Connection Draining의 핵심 동작 방식입니다.

동작 원리와 예시

일반적으로 서버가 종료 신호(예: SIGTERM)를 받으면 다음과 같은 순서로 동작합니다.

  • 로드밸런서가 해당 서버를 ‘신규 요청 대상’에서 제외 (Health Check 상태를 Unhealthy로 변경)
  • 이미 연결된 기존 요청은 설정된 Draining Timeout 동안 정상 처리 계속
  • 타임아웃이 지나거나 모든 요청이 완료되면 서버 프로세스를 완전히 종료

예를 들어 AWS ELB에서는 Deregistration Delay 값을 설정할 수 있는데, 기본값은 300초입니다. 이 시간 동안은 새로운 트래픽은 받지 않지만, 이미 맺어진 커넥션은 계속 응답을 처리합니다. Kubernetes에서도 Pod 종료 시 terminationGracePeriodSeconds 옵션으로 유사한 동작을 설정할 수 있습니다.

실무에서 왜 중요한가

Connection Draining 없이 배포하면 어떤 문제가 생길까요? 서버가 즉시 종료되면서 처리 중이던 API 요청이 갑자기 끊기고, 사용자는 ‘502 Bad Gateway’나 ‘Connection Reset’ 에러를 마주하게 됩니다. 특히 결제, 파일 업로드처럼 시간이 걸리는 작업 중이라면 사용자 경험에 치명적입니다.

따라서 무중단 배포(Zero-downtime Deployment)를 구현할 때는 단순히 새 버전을 띄우는 것뿐 아니라, 구버전 서버가 ‘우아하게 종료(Graceful Shutdown)’되도록 Connection Draining 설정을 함께 고려해야 합니다. 이는 롤링 업데이트, 블루-그린 배포 전략의 필수 요소이기도 합니다.

결국 Connection Draining은 ‘서버를 끄는 순간’과 ‘사용자가 실제로 영향을 받는 순간’ 사이에 안전한 완충 구간을 만들어주는 장치라고 이해하면 됩니다.

댓글 남기기