게임 서버의 무중단 롤링 배포 전략 (Graceful Shutdown)
무중단 배포의 방식
게임 서버는 Stateful하기 때문에 무작정 롤링 배포를 적용할 수가 없음. Graceful Shutdown 필요
1. 아키텍처 및 구성 요소
- Game Server v1 (Old): 현재 서비스 중인 서버. 유저들이 게임을 하고 있음.
- Game Server v2 (New): 새로 배포될 서버.
- Matchmaker (매칭 서버): 유저를 적절한 게임 서버에 배정하는 역할.
- State Store (DB/Redis): 서버들의 상태(
Active,Draining)를 관리하는 공유 저장소.
2. 배포 시나리오 흐름 (Workflow)
전체적인 흐름은 "새 서버 투입 -> 구 서버 격리(매칭 제외) -> 기존 게임 종료 대기 -> 구 서버 종료" 순서로 진행됩니다.
sequenceDiagram
autonumber
participant CD as CI/CD Pipeline
participant v1 as GS_v1 (Old)
participant v2 as GS_v2 (New)
participant DB as Redis/DB
participant MM as Matchmaker
Note over v1: 현재 정상 작동 중 (Status: ACTIVE)
%% 1. 신규 서버 배포
Note over v2: 1. 신규 배포 시작
CD->>v2: 프로세스 실행 및 배포
v2->>DB: 서버 등록 (Status: ACTIVE)
Note right of v2: 부팅 완료,<br/>게임 받을 준비 됨
%% 2. 종료 신호 전송
Note over CD: 2. 구버전 종료 절차 시작
CD->>v1: 종료 신호 전송 (SIGTERM)
%% 3. 상태 변경 및 격리
v1->>DB: 상태 변경 (Status: DRAINING)
%% 4. 매칭 서버의 인지
loop Polling / Event Subscribe
MM->>DB: 서버 목록 조회
DB-->>MM: v1: DRAINING, v2: ACTIVE
Note right of MM: v1은 목록 제외,<br/>v2로만 신규 유저 매칭
end
%% 5. 자연스러운 종료
Note over v1: 기존 게임 세션 유지 (Draining)
loop 주기적 체크
v1->>v1: 남은 유저 확인 (Users == 0?)
end
Note over v1: 모든 게임 종료됨
v1->>v1: 프로세스 종료 (Exit 0)