디아블로2 서버 문제에 대한 블쟈의 해명글 요약

Sorbet·2021년 10월 15일
0

결론

  1. 레거시가 대부분이라서 작업이 쉽지 않다 (그래서 Resurrection인듯)
  2. 새로만든 기능인 게임 생성/조회/필터링 부분에서도 문제가 생긴다
  3. 트레픽이 너무 많아서 DB에서 문제가 생긴다

원문
https://us.forums.blizzard.com/en/d2r/t/diablo-ii-resurrected-outages-an-explanation-how-we%E2%80%99ve-been-working-on-it-and-how-we%E2%80%99re-moving-forward/28164

서버 다운 문제는 복합적으로 얽혀있는 문제다

1) 디아2는 글로벌 단일 데이터베이스 시스템

  • 디아블로2의 모든 캐릭터 정보와 진행상황에 대해서 저장하는 하나의 DB로 돌아간다(백업도 있고)
  • 대륙별로(아시아, 유럽, 북미 등등..) 중간에 캐싱용도(부하분산, 대기시간 감소)의 DB도 존재한다

2) 10월 9일 토요일 상황

  • 문제 1 : 갑작스러운 트래픽 급증으로 정전이 발생했고, 개발당시에는 예측하지 못했던 상황이라 인프라 임계점을 초과해버렸다..
  • 문제 2: 근데 이게 전날(10월 8일 금요일) 디아2 던전생성 관련 성능 향상을 위한 업데이트를 진행했는데, 여기서 문제가 좀 있어서 업데이트가 상황을 더 악화시켜버렸다
  • 문제1 + 문제2 = 두가지 문제가 결합되서 더 크고 나쁜 증상이 발생함 : 글로벌 데이터베이스에 과부하가 걸리고 시간이 초과
  • 글로벌 데이터베이스 과부하 걸리니까 10월 8일 금요일 업데이트를 롤백했고 이걸로 충분할줄 알았다!
    • 롤백했으니까 일요일은 푹 쉬고 월요일날 출근해서 보겠음 ㅎㅎ

3) 10월 10일 일요일 상황

  • 트래픽이 훨씬 더 많이 증가하여 또 다른 정전이 발생
  • 게임서버와 데이터베이스 연결이 끊기기 시작
  • 트레픽이 너무 많아서 데이터베이스가 게임 서버의 지속적인 연결 시도 스트림을 처리하는 데 너무 바빠서 우리가 완료한 작업을 따라잡을 시간이 없을 정도
  • 데이터베이스가 끊기기 시작하고 오류 발생해 데이터 무결성이 깨지기 시작하는 문제가 발생
    • 정상 상태(무결성)를 복원을 위해 데이터베이스 이벤트 로그 데이터 보고 복구하기 시작함
  • 이때부터 "아 이거 그냥 단순한 문제가 아닌디?" 라고 인식했고 추가적으로 알아내지 못한 근본적인 원인을 분석하기 시작
  • 그래도 토요일날 복구해봤으니까 일요일은 빠르게 복구해서 다시 게임을 즐길수 있도록 만들었다
    • 근데 분당 수십만개 게임을 만들어서 빠르게 또 서버가 다운되버렸다 ㅎㅎ..

4) 10월 11일 월요일 상황

  • 글로벌 DB 서버 설정값도 좀 바꾸고, 코드도 좀 업데이트해서 수정했고 배포했는데 문제가 또 발생했다
    • 이로 인해 백업 데이터베이스가 백업 프로세스를 계속 잘못 실행하는 또 다른 중단이 발생
    • 서버의 요청을 처리해야 할 때 다른 데이터베이스에서 복사를 시도하는 데 대부분의 시간을 소비하는 증상이 발생하는 문제가 또 발생.. ㅠㅠ
  • 그래서..
    • 데이터베이스에서 레거시 쿼리를 찾아서 걷어냄
    • 게임에 참가할때 코드를 최적화해서 리소스 줄임
    • 우리가 자체 테스트를 돌려보니까 성능이 엄청 개선되서 다시 배포했다!
  • 배포하고 잠깐 지켜보니까 문제가 발생하지 않아 데이터베이스 문제(원문에선 database-reconnect storms)는 완전히 해결됬구나! 라고 생각했는데..

5) 10월 11일 화요일

  • 사람이 또 엄청 몰려서 다운됬어요 ㅎㅎ...
    • DBA님께서 해결중임..
    • 디아블로팀 서버개발자들 + 블리자드 다른팀 엔지니어들 + 타사 파트너 모조리 투입해서 해결중임

6) 결론

  • 글로벌 단일 데이터베이스 시스템에서 자꾸 문제가 발생해서 게임이 안되는거다
  • DB 하나에서 전세계 모든 데이터를 저장하는데 트레픽이 너무 많다
  • 레거시 코드 몇개 걷어내고 몇가지 기능 최적화좀 해봤는데 이거가가지고는 완전하게 해결이 안되고 있다



원인

1) 오리지널 게임에 충실하기 위해 많은 레거시 코드를 유지했습니다

  • 원문 : In staying true to the original game, we kept a lot of legacy code.
  • 원작의 느낌을 유지하기 위해 코드를 많이 복붙했는데요, 복붙 안하고 새로 개발해서 넣은 부분에서 애러가 나고 있어요
  • 레거시랑 싸우고 있어요...

2) 새로만든 부분이 뭐냐하면

  • 게임 생성/가입, 게임 목록 업데이트/읽기/필터링, 게임 서버 상태 확인, 데이터베이스에서 캐릭터 읽기 등등.. 같은 중요한 게임 기능 부분을 처리하여 캐릭터가 무엇이든 참여할 수 있도록 합니다.
  • 거기다가 원하는 조건으로 필터링기능까지!
  • 새로만든 기능도 문제에요..

3) 게임 목록 서비스가 싱글톤이라 그렇습니다

  • 중요한 것은 이 서비스가 싱글톤이라는건데
  • 모든 플레이어가 항상 최신의 정확한 게임 목록을 볼 수 있도록 하나의 인스턴스만 실행할 수 있습니다. 여러 가지 방법으로 최적화했지만 너무나 많은 "게임 생성" 때문에 장애가 계속 발생하고 있다

4) DB도 너무 힘들어해요

  • 글로벌 DB에 저장하는 주기를 길게 해서 저장헤 드는 시간과 리소스를 줄이는 방법이 있는데, 이게 전체 시스템 인프라 && 아키텍쳐가 변경되는거라 시간이 좀 걸릴꺼에요 테스트도 해야되고..



당분간 이렇게 될꺼에요

1) 게임생성 속도 제한

  • 게임생성이 문제였는데, 게임 플레이 중에서 Pindleskin runs 같은걸 하면 20초내로 게임을 만드는데 이렇게 자주 많이 게임을 만드는거는 당분간 제한할꺼야. 업데이트 전까지만

도메인 지식 : 핀들런 / 핀들스킨런

  • 핀들스킨이라는 몬스터가 현금가 10만원에 거래되는 좋은 아이템을 드랍함. 계속 핀들스킨만 잡고 새로 게임만들고 반복하는게 핀들런
  • 참고로 디아는 방만들면 최소 5분은 지속되는데, 핀들런을 돌리는 사람들은 못해소 30초마다 하나씩 방을 만들어낸다

2) 로그인 대기열 도입

  • 사람 너무 많으니까 로그인에 대기열을 도입함

3) 서비스 작게 쪼개기

  • 원문 : Breaking out critical pieces of functionality into smaller services
  • 서비스를 작게 쪼개서 한쪽이 실패해도 다른쪽은 살아서 작은 서버장애가 전체 서버 장애로 파급되지 않도록 개선할꺼임
profile
Sorbet is good...!

2개의 댓글

comment-user-thumbnail
2021년 10월 23일

좋은 정보 감사합니다!

1개의 답글