You are here: Home - Studio Post - 패기로운 구현은 서버를 업그레이드 시킨다

bombclock234

푸른돌 조사단 서비스 초기, 유저 수가 늘어나면서 데이터베이스 서버의 부하 문제가 생기게 되었습니다.
CPU 점유율이 특정 퍼센트를 넘어가면 경고 문자를 받았는데, 하루에 100통 정도 받은 경우도 있습니다. (제가 본 것중 최대치는 96%였습니다…)
언제 서버가 다운되더라도 이상하지 않을 상황이었습니다.

그래서 가장 빠르게 이 문제를 해결하기 위해 DB 서버의 스펙을 거의 2배로 업그레이드 했지만 이런 임시방편으로는 한계가 있을 수 밖에 없었고, 며칠 지나지 않아 또다시 문자를 받는 상황이 되었습니다.

결국 서버의 근본적인 문제를 해결 해야 하는 상황이 되었고, 원인을 찾다보니 실시간으로 유저의 랭킹 구하는 부분이 정말 너무도 용감하게 구현되어 있는 것을 확인하였습니다.

점수에 따라 정렬을 하고, 그중에 원하는 유저가 어디에 있는지 차례대로 등수를 매겨가며 찾는 방식이었습니다. 간단한 등수를 구하기 위해 DB를 너무 혹사 시키고 있었던 겁니다.

허나 REDIS라는 in-memory dataset을 사용하면서 이 문제가 해결 되었습니다.
REDIS에서 제공하는 sorted-set을 활용하면 랭킹을 쉽고 빠르게 구할 수 있습니다.
zadd라는 명령어로 유저의 ID와 점수를 넣어두면 내부에서 점수에 따라 정렬된 상태로 유저 ID를 저장하게 됩니다.
그럼 zrevrank라는 명령으로 해당 유저가 내림차순으로 몇번째인지 쉽게 알아 낼 수 있습니다.
이런 일련의 과정이 메모리에서 처리 되기 때문에 접근이 굉장히 빠르고, 부하도 많이 줄어 들었습니다.

REDIS 도입하고, 유저 수는 더 늘었지만 DB 서버의 CPU 점유율은 10% 대를 유지하는 쾌거를 이루었답니다.
그리고 랭킹 리스트를 보여주는데 10초 남짓 걸렸던 것이 1초 안에 처리되었습니다.

이렇게 여유가 많이 생겼지만, 업그레이드 했던 DB 서버는 아직 그대로 사용하고 있습니다 :-)

by Justin Hwang

Back to top