결론
- 레거시가 대부분이라서 작업이 쉽지 않다 (그래서 Resurrection인듯)
- 새로만든 기능인 게임 생성/조회/필터링 부분에서도 문제가 생긴다
- 트레픽이 너무 많아서 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
- 서비스를 작게 쪼개서 한쪽이 실패해도 다른쪽은 살아서 작은 서버장애가 전체 서버 장애로 파급되지 않도록 개선할꺼임
좋은 정보 감사합니다!