▲블리자드 클래식 팀의 김태현 엔지니어

한 사람의 오타 하나로 한화 1,500억 원의 손실이 일어났다. 이렇게 장애가 발생했을 때 손실을 줄이려면 어떻게 하는 것이 좋을까? 장애를 일으킨 사람을 비난하면 되는가?

카카오가 주최하는 첫 번째 개발자 컨퍼런스, “if Kakao 2018’이 오늘(4일) 코엑스에서 개최됐다. 이날 ‘글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영사례’ 강연을 진행한 블리자드의 김태현 엔지니어는 2017년 AWS S3 장애 사례를 이야기하며 강연을 시작했다. 그는 사람은 실수할 수밖에 없으며, 이와 같은 장애에 잘 대응할 수 있는 방법을 구축하는 것에 초점을 맞춰야 한다고 설명했다. 그는 블리자드 클래식 팀에서 이런 장애들에 대해서 서비스 정지 없이 대응하는 ‘무정지, 무점검 서비스’ 방식을 소개했다.

강연자 김태현 엔지니어는 미국 얼바인에 위치한 블리자드 클래식팀에서 서버 개발을 맡고 있다. 그는 NHN과 SK컴즈에서 다양한 서비스를 개발했으며, 넥슨 아메리카에서 DevOps 팀을 이끈 바 있다.




블리자드 클래식 팀은 스타크래프트, 워크래프트, 디아블로 등, 오래된 게임들이 제대로 서비스되도록 개선하는 역할을 하고 있다. 오래된 게임들은 옛날 코드로 이루어져 있고 이전 환경에서 돌아가도록 개발되었기 때문에 현대 환경과 맞지 않는 부분들이 많기 때문이다.

이에 대해 김태현 엔지니어는 먼저 현대적 환경에서 게임이 제대로 돌아갈 수 있도록 하는 NCS(New Classic Sever) 서버 스택을 소개했다. 새로운 기능의 추가와 관리가 쉬운 NCS는 Rabbit MQ를 통해 각 서버들이 통신하는 구조로 이루어져 있다. 이를 통해 서버끼리의 통신은 가능하나, 직접적인 연결은 이루어지지 않는다.


서버코드는 C++를 기본으로, 네크워크/ 비동기 엔진은 libuv, Rabbit MQ, 데이터베이스로는 MySQL을 사용하고 있다. 소스코드 매니지먼트는 github를 사용하며, CD/CI는 Jenkins로 이루어진다. 인프라는 오픈스택을 기반으로 Terraform을 사용해 인프라 관리를 코드로 자동화한다.


모니터링은 자체제작 시스템인 가디언 툴을 사용하고 있다. 가디언 툴은 웹기반 모니터링 툴로, 정규식 검색하면 리스트가 나오고 서버의 상태를 확인할 수 있다. 또한, Query를 통해 서버를 선택해 특정 서버에 명령할 수 있다. 추가적인 메뉴를 통해 디테일하게 서버 상태를 확인할 수 있으며, 서버 로그도 웹상에서 바로 확인할 수 있다.

이어 김태현 엔지니어는 무정지, 무점검 서비스를 어렵게 하는 다섯 가지 문제점을 짚으며 클래식팀이 어떻게 해결했는지에 대한 사례를 공유했다.


첫 번째 문제점은 서버 업데이트다. 서버 업데이트가 진행되면 먼저 서버를 내리고, 패치를 위해 실행파일을 교체하게 된다. 따라서 서비스가 정지되어야 한다. 새로운 내용의 로직으로 서버가 재시작해야 하고, 하위호환이 안 되기 때문에 구버전과 신규버전이 함께 돌아가면 안 되기 때문이다. 이처럼 기존 방식으로는 점검이 시작되면 서버를 중지하고, 새로운 버전으로 바꾼 후 실행해 점검을 끝내고 서비스가 시작되는 식으로 이루어진다.

클래식 팀에서는 이에 서비스를 중지하지 않고 패치할 수 있도록 다른 방식으로 접근한다. 먼저 버전1이 적용된 상태에서 site B에 버전2 서버를 따로 만드는 것이다. 이후 버전1의 서버가 하나씩 버전2로 흘러가도록 한다. 모든 서버가 이전되면 버전2가 적용되고, 실행된다. 따라서 정지 없이 지속적으로 서버 업데이트를 할 수 있게 된다.


이 과정은 Flipping(뒤집기)로, 모두 버전2가 적용되면 버전1을 비활성화하게 된다. Flipping은 이전이 깔끔하게 가능하고, 서버를 완전히 지우고 새로 만들기 때문에 클린한 환경에서 이루어진다는 장점이 있다. 또한, 롤백이 쉽다는 이점이 있다. 버전1은 비활성화되었을 뿐 삭제된 것이 아니므로 개발자들이 자유롭게 조사할 수 있으며, 이전 버전에 어떤 문제가 있었는지 확인해볼 수 있다.

김태현 엔지니어는 이와 같은 과정이 가능할 수 있는 기술적 이유를 네 가지로 나누어 설명했다. 먼저 VM, 즉 컨테이너 기반이기 때문에 새로운 사이트 생성이 용이하다는 점과 하위호환 API시스템을 통해 버전1과 2가 같은 시간대에 존재해도 서비스에 문제가 없다는 점을 짚었다. 또한, 서버에 설정파일과 로그파일이 포함되지 않고 오직 동작하는 바이너리만 들어있기 때문에 장애 없이 진행이 가능하다. 마지막으로, CD/CI 자동화를 통해 배포가 원클릭으로 이루어지며, 사이트 생성부터 테스트까지 자동화된 코드로 실행되도록 이루어져 있기 때문에 가능하다.

두번째 문제점은 설정파일의 변경이다. 설정이 바뀌게 되면 먼저 서버를 종료한 후에 새로운 설정을 재시작과 함께 로드하게된다. 최악으로는, 설정이나 서비스 일부만이 바꼈음에도 모든 서비스를 재시작해야하는 경우도 생긴다. 새로운 서버가 추가될 때, 새로운 API를 알아야기 때문에 모든 서버가 재시작을 해야하는 상황이 생기는 것이다.


클래식팀에서는 이에 대해 Flush System을 사용하고 있다. Flush System에서는 설정파일이 서버에 존재하지 않으며, 다운로드받은 설정 내용을 동적으로 전부 업데이트한다. 바뀐 내용으로 서버가 지속적으로 동작하게 되어있다. 설정파일의 포맷은 구글 protobuf 프로토콜을 이용해 복잡한 데이터 구조도 표현할 수 있으며, 설정 파일이 바뀌면 서버의 코드도 자동으로 생성되도록 구성되어있다. Flush System을 통해서 설정 중 일부만 바꿀 수 있으며, 특정 서버나 서비스만 바뀐 설정을 로드하도록 조정할 수 있다.


세 번째 문제는 상수변경이다. 상수의 문제점은 변경할 때 코드를 변경하고, 재배포를 해야 한다는 점이다. 새로운 버전을 업데이트하고, 재시작해야하는 것이다.


클래식팀에서는 이를 Var시스템을 통해 해결하고 있다. Var시스템은 Query 시스템의 일부로, 외부에서 서비스의 정지 없이 상수 값을 실시간으로 변경할 수 있도록 해준다. Query 시스템은 작동 중인 서비스에서 함수를 실시간으로 호출하고, 외부에서 등록해두면 호출했을 때 이 함수가 내부적으로 실행되도록 한다. 가디언 툴에서 바로 진행할 수 있으며, 디자이너나 프로듀서도 손쉽게 값을 바꿀 수 있다는 장점이 있다.

네번째 문제점은 스케일링이다. 동접자가 늘어나거나 줄어들면 이에 맞춰 서버를 늘리거나 줄일 필요가 생긴다. 서버에 변경이 이루어지면 서비스를 재시작해야하는 경우가 자주 일어난다. 하지만 NCS는 서버끼리 연결되어있지 않고 모든 통신이 Rabbit MQ를 거치도록 되어있기 때문에 새로운 서버가 추가되더라도 재 시작할 필요가 없다.

마지막 문제점은 장애다. 장애가 일어나면 서비스는 정지된다. 장애는 막을 수 없으며, 따라서 이에 대한 복구 시스템을 구축하는 것이 중요하다. 김태현 엔지니어는 이에 대해 헬스 체크(Health Check) 프로토콜을 구현하고 있다고 설명했다. 서버들은 각각 제대로 이루어지고 있는지 각자 리포트하도록 되어있다. 각 서버 상태는 가디언 툴에서 확인할 수 있다.


동종의 서비스는 하나의 Pool에 들어가 있으며, 문제가 생기면 그 서비스만 빼내면 된다. 따라서 어떤 서비스에 문제가 생기더라도 기존 서비스는 문제없이 진행이 가능하게 된다. 원인 모를 장애가 일어날 경우에는 디플로이를 새롭게 해 새로운 세트의 서버로 Flipping 하면 된다.

이어 김태현 엔지니어는 DevOps에 대하며 설명했다. 블리자드의 클래식팀은 문화로의 DevOps를 지향하고 있다. 개발 라이프 사이클에 엔지니어가 모두 관여하는 식으로 이루어지며, 각자가 할수 있는 역할을 적극 수행하는 방식이다. 문제가 생겨났을 때 누가 해결을 할지 수동적으로 정해지는 것이 아니라 문제점을 발견한 사람이 본인이 해결할 수 있을시 적극적으로 해결하게 된다.


김태현 엔지니어는 이와 같은 방식은 가디언 툴을 통해 엔지니어 외 다른 개발자들도 쉽게 해결할 수 있다는 점, 그리고 실패나 이상이 생기는 것에 대해서 두려움을 가지지 않도록 하는 사내 분위기를 통해 가능하다고 설명했다.

끝으로 김태현 엔지니어는 미래에 대한 비전으로 서버리스(Serverless)와 AI 기술을 꼽으며 강연을 마무리했다. 앞으로는 점차 서버를 통하지 않고 만든 코드를 서비스로 바로 올리게 될 것이며, 지구가 하나의 거대한 컴퓨터처럼 이루어져 보다 클라우드 호스팅의 부담이 커질 것이라는 것이 그의 설명이다. 이와함께 김태현 엔지니어는 AI 기술이 상용화되면서 툴킷화되고 각 AI 간의 네트워크 또한 이루어질 것이라고 짚었다.