블리자드 포럼에도 글을 올렸지만,
모처럼 애들 재우고 게임 해보려다 입구에서 저지당하고 답답한 심정에
공지사항 보고 글 올립니다.
*구식 서버 구조를 그대로 계승한 단일 글로벌DB 문제.
이는 대형 게임에 적용하면 100% 터지는 문제로
게임서버가 증설되면 될 수록. 동접이 늘면 늘 수록 더 빨리 DB가 터집니다.
즉, 게임서버만 늘리면 문제는 더 악화됩니다.
저도 직접 당해봐서 지금 블자 서버 개발팀이 얼마나 맨탈이 붕괴 돼 있는 지 짐작이 됩니다.
이거 간단히 무슨 서버증설 같은 것으로 금방 해결 절대 안됩니다.
식당을 예로 들면 주방(DB)은 그대로인데 손님 받는 테이블(게임서버)만 늘리면 주방은 더 뒤져 나가는 원리입니다.
아이템 등 유일한 데이터를 보장해주는 장점이 있는 단일DB의 한계입니다.
그래서 지금 부랴부랴 밖에서 번호표 받고 기다리라고 하고 있는거고요.
(무슨 백종원의 골목식당도 아니고…)
해결책
1. DB(데이터베이스)서버에 대한 소프트웨어 샤딩
아무리 주방의 가스불 화력을 높이고 더 좋은 냄비를 써도 음식 나가는 속도에는 한계가 있습니다.
백종원 할애비가 와도 1개 주방으로는 점심 피크시간에 100테이블 못 받습니다.
샤딩은 수평 확장을 의미합니다.
즉, 주방의 갯수를 여러개로 늘리는 것입니다.
대신 이를 위해서는 DB서버 쿼리로직 전반에 걸쳐 작업이 필요합니다.
해당 유저가 몇번DB에 데이터를 저장하는 지 처리해야하는 코딩이 수반됩니다.
그래도 구식 디아 서버 코드에서는 그나마 가장 빠르고 확실한 대처법일 것입니다.
대충 글로벌DB를 10개로 분산하면 지금 한계동접 10배 가까이 더 받을 수 있습니다.
20개로만 분산해도 지금 사태는 종식될거라 봅니다.
DB서버성능은 그렇게 비싼걸로 안해도 됩니다.
공지사항을 토대로 예측해보면, 막대한 부하가 발생하는 아이템 관련 DB 부분만 샤딩 처리해도 충분히 해결 가능할 것 같습니다.
*개별 유저DB에는 몇번 아이템DB를 사용하는 지 정해져 있어야 합니다.
*나중에 유저가 줄면 물리DB머신 하나에 데이터베이스 여러개를 통합하면 그만입니다.
다시 유저가 늘면 물리DB머신을 따로 분리하면 되구요.
- DB Write Back
이건 너무 큰 서버 코딩 수정작업이 수반될 것으로 예상되어
디아2 레저렉션에 적용하기에는 현실성이 부족합니다.
최신 온라인게임에 많이 적용하는 방식입니다.
원리는 DB서버가 바로 하드(HDD/SSD)에 정보를 저장하기 전에
앞단에서 메모리에서만 처리하는 데이터베이스가 여러개 존재하여 빠르게 처리하고 게임서버와 통신하는 방식입니다.
이를테면 아이템 감별속도가 전 보다 훨~~씬 빨라지겠죠.
그리고 실제 DB에 아이템 정보를 저장하는 것은 뒤에서 메모리DB > SQL DB로 천천히 진행하는 방식입니다.
단, 앞에 있는 메모리DB가 문제가 생기면 먹은 아이템이 없어지거나 하는 경우가 생길 수 있다는 리스크는 있습니다.
3. 게임목록
최신 게임 목록은 Redis와 같은 메모리DB Sorted Set 같은 것을 활용해야합니다.
SQL DB로 매번 게임 목록을 필터링해서 SELECT 때리면 쿼리 부하가 쭉쭉 밀립니다.
역시 참여자 정보를 JOIN해서 긁어오는 식으로 DB 쿼리를 짰다면 100% 서버 터집니다.
게임 목록이 반드시 실시간 데이터일 필요가 없다면,
여러개의 Replication DB에서 SELECT만 날려도 괜찮습니다.
Master DB에서 저 짓을 한다면 그것은 자살 행위입니다.
4. 게임목록-참여자 목록
위의 게임목록에서 사용자 정보를 JOIN해서 긁어오면 100% 터진다고 했습니다.
참여자 정보 조회는 Redis나 Memcached 같은 캐쉬DB를 활용해야합니다.
이 정보는 유저가 게임 플레이 시 메모리DB에 유저 정보(닉네임, 착용장비외형, 레벨 등)에 대한 간단한 정보를 간헐적으로 기록하고 조회하면 글로벌DB에 부하가 전혀 없습니다.
이 정보는 영속적일 필요가 없으므로 TTL같은 것으로 일정 시간이 지나면 삭제하거나 crontab과 같은 스케쥴러를 적용하여 휘발시키면 됩니다.
개인적으로 Redis를 추천합니다. CPU오버헤드는 적고 램만 많으면 되니 상대적으로 저렴하게 문제 해결이 가능합니다.
*블리자드 서버 개발팀의 수준은 이미 세계 최고 수준이라고 봅니다.
하지만 디아블로2 레저렉션 서버는 기존 시스템을 그대로 가져온 것 같습니다.
개발 인력 투입/비용 등 여러가지를 고려했겠지요?
아마 베타테스트 등을 거치면서 문제가 없다고 판단했을텐데요.
단일DB(공지사항의 글로벌 데이터베이스)는 임계점에 다다르기 전 까지는 무척이나 잘 작동하고 버티지만,
그 임계점을 넘는 순간 현재 우리가 겪는 것 처럼 곧바로 서비스 장애로 이어지게됩니다.
그리고 DB머신의 성능을 최대치로 높여도 서버비용은 천정부지로 올라가지만,
처리능력 향상은 고작 몇십% 밖에 되지 않습니다.
부디 빠른 문제 해결을 해서 그나마 삶의 위안을 삼고자 하는 많은 PC유저와 고통 받고 있는
콘솔 사용자들에게 평안을 가져다 주시길 바랍니다.
대기열에 빡친 한 유저가…
출처 : 디아블로2 인벤 Songinnight 님 글