rolling-update-strategy

게임 서버의 무중단 롤링 배포 전략 (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)