게임서버 증설은 답이 아니다!

모처럼 애들 재우고 게임 해보려다 입구에서 저지당하고 답답한 심정에
공지사항 보고 글 올립니다.

*구식 서버 구조를 그대로 계승한 단일 글로벌DB 문제.

이는 대형 게임에 적용하면 100% 터지는 문제로
게임서버가 증설되면 될 수록. 동접이 늘면 늘 수록 더 빨리 DB가 터집니다.
즉, 게임서버만 늘리면 문제는 더 악화됩니다.
저도 직접 당해봐서 지금 블자 서버 개발팀이 얼마나 맨탈이 붕괴 돼 있는 지 짐작이 됩니다.
이거 간단히 무슨 서버증설 같은 것으로 금방 해결 절대 안됩니다.
식당을 예로 들면 주방(DB)은 그대로인데 손님 받는 테이블(게임서버)만 늘리면 주방은 더 뒤져 나가는 원리입니다.
아이템 등 유일한 데이터를 보장해주는 장점이 있는 단일DB의 한계입니다.
그래서 지금 부랴부랴 밖에서 번호표 받고 기다리라고 하고 있는거고요.
(무슨 백종원의 골목식당도 아니고…)

해결책

  1. DB(데이터베이스)서버에 대한 소프트웨어 샤딩
    아무리 주방의 가스불 화력을 높이고 더 좋은 냄비를 써도 음식 나가는 속도에는 한계가 있습니다.
    백종원 할애비가 와도 1개 주방으로는 점심 피크시간에 100테이블 못 받습니다.
    샤딩은 수평 확장을 의미합니다.
    즉, 주방의 갯수를 여러개로 늘리는 것입니다.
    대신 이를 위해서는 DB서버 쿼리로직 전반에 걸쳐 작업이 필요합니다.
    해당 유저가 몇번DB에 데이터를 저장하는 지 처리해야하는 코딩이 수반됩니다.
    그래도 구식 디아 서버 코드에서는 그나마 가장 빠르고 확실한 대처법일 것입니다.
    대충 글로벌DB를 10개로 분산하면 지금 한계동접 10배 가까이 더 받을 수 있습니다.
    20개로만 분산해도 지금 사태는 종식될거라 봅니다.
    DB서버성능은 그렇게 비싼걸로 안해도 됩니다.
    공지사항을 토대로 예측해보면, 막대한 부하가 발생하는 아이템 관련 DB 부분만 샤딩 처리해도 충분히 해결 가능할 것 같습니다.
    *개별 유저DB에는 몇번 아이템DB를 사용하는 지 정해져 있어야 합니다.
    *나중에 유저가 줄면 물리DB머신 하나에 데이터베이스 여러개를 통합하면 그만입니다.
    다시 유저가 늘면 물리DB머신을 따로 분리하면 되구요.

  2. 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유저와 고통 받고 있는
콘솔 사용자들에게 평안을 가져다 주시길 바랍니다.

고생 많으십니다.

좋아요 46개

비유도 좋고 이해도 쉬운 좋은 글이기는 한데 블자새끼들은 절대 안봄.

좋아요 9개

식사권 1000개 팔아놓고 코딱지만한 주방에서 서빙하면 그것은 사기죠

좋아요 15개

예전에는 아시아 유럽 북미 등 서버가 여러개인걸 이지경 만든건 책임회피죠

좋아요 2개

블리자드 서버 개발자들이 붙고 있다고 하니 해법을 찾을거라 기대하고 있습니다. 해결 방안만 수립되면, 갖고 있는 서버 코더들 들이 부으면 금방 될텐데요. ㅠ 답답하네요.

이글은 좀 봤으면좋겠네 그냥 게임구조 네트워크 이런걸모르는사람은 아니신듯한데

좋아요 1개

어떤글을 적어도 쳐다보지않음.

이건 진짜 읽어라 블쟈…

좋아요 2개

아 제발 이런것 좀 읽어라 수임료도 안받고 지금 컨설팅해준거나 마찬가지 아니냐고

좋아요 2개

팅기고 대기열 130

대기열 99

다들 좋아요 누르고 블자가 좀 보게하자…

형 블쟈 입사해주시면 안되요…(???) ㅋㅋㅋㅋㅋㅋ

좋아요 많을수록 안볼것같은 블쟈

대기열 954는 넘하자나…

문제는 개발진에서 이러한 문제를 모르지 않다는 것에 있습니다. 단지 의사결정이 안되는게 문제지요. 회사 구조상 개발진은 항상 마케팅/경영팀에 밀리는 상황이죠. 개발팀에서 백날 고치자고 얘기해봐야 마케팅/경영 쪽에서는 비용상의 문제를 거론하며 의사결정 후순위로 밀려나는데 있습니다. 오래 버티는 놈이 이기는 게임입니다.

좋아요 1개

아니 그런걱정을 왜 소비자가 해야되냐고요~`
돈을 지불했으면 겜할수잇도록 하는게 겜임판 업첸데. 왜 우리가 돈내고 이용할 권리를 못누리냐고
증설답이아니면 다른답을 찾아 내놔야하는거 아냐??
지금 시대가 어느시댄데 ?
이게임 시스템 자체가 몹이 리젠되어 잡는 것도 아니고 미션하는 것도 아닌 방을 새로 파야 되는 겜인데 이걸 마치 방자주만들어서 문제가 된다는 식으로 예기하는데
20년 후 출시된게임이 과거랑 같다는게 말이된다고 생각하냐 진짜 한두번도 아니고 짜증나 짜증

좋아요 1개

예전 서버 가져와서 서버구축하는이유가 인력이랑 비용절감할려는 수단인거 눈에보이는데.

이런걸… 감싸주다니… 쯕쯕…

서버증설해도 인력감당안되니 비유까지 들어가면서 감수하라는 이야기는 왜하는지…

우리가 열받는 이유가 먼지아세요 구매자의 기본적인 권리무시하고… 해결방안도 내세우지않고 묵묵부답하고… 이제와서 대길열만들어서 인력이랑 비용아낄려는 개수작같은게 눈에 보여서입니다.

좀 쳐읽고 수정해라

‘영어가 아님’ 에서 이미 99% 걸러졌음.