게임 렉 백서 › L12 데이터베이스
긴 저장 주기로 인한 진행 유실 Periodic save window
원인 ID db-save-interval · 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·DB 인프라
그림과 실험이 있는 원본 카드로 열기 →
부하를 줄이려 몇 분에 한 번만 저장하면, 그 사이 서버가 죽을 때 진행이 사라집니다.
왜 캐릭터 상태를 몇 분마다 한 번 저장 → 그러면 그 사이 서버 크래시·장애 발생 → 화면에서는 다시 접속하니 몇 분 전 상태(롤백)
- 증상
- 씹힘·롤백
- 요인
- 손실
- 누가 겪나
- 서버 전체, 특정 장소·채널
- 언제
- 가끔 무작위로
- 담당
- 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·DB 인프라
- 게임개발팀 할 일
- 중요 이벤트(거래, 희귀 획득)는 즉시 저장, 변경 로그 기록.
- 인프라팀 할 일
- 저장 주기를 줄였을 때 늘어나는 쓰기를 감당할 DB의 IOPS·CPU 여유 확인.
- 그래프에서는
- 연결이 한꺼번에 끊김 · 접속 수, 롤백 신고 수
- 확인할 곳
- 크래시·장애 시각과, 롤백을 신고한 캐릭터의 마지막 저장 시각(게임 서버의 저장 로그나 DB의 수정 시각 컬럼)을 나란히 놓음
- 이러면 맞음
- 되돌아간 시점이 크래시 직전의 마지막 저장 시각과 일치하고 잃은 시간이 저장 주기보다 짧음
- 이러면 아님
- 게임 서버 로그에는 저장이 끝났다고 남아 있는데도 되돌아갔으면 DB 장애 전환의 데이터 유실(db-failover)이나 복제본에서 읽은 옛 값(db-replica-lag)
- 확인 수단
- 게임 서버·클라이언트의 로그·지표가 필요
출처
- Asynchronous Commit (PostgreSQL Documentation) PostgreSQL
기록을 모아 늦게 내리면 처리량이 오르는 대신, 장애 때 가장 최근 트랜잭션이 사라질 수 있음(같은 맞바꿈) - Redis persistence Redis
RDB 스냅샷을 몇 분마다 만들면 비정상 종료 때 마지막 몇 분의 데이터를 잃을 각오를 해야 함
함께 보면 좋은 원인
같은 층: L12 데이터베이스
같은 증상(씹힘·롤백)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기