Skip to content
This repository was archived by the owner on Jun 14, 2022. It is now read-only.

Latest commit

 

History

History
40 lines (19 loc) · 4.54 KB

File metadata and controls

40 lines (19 loc) · 4.54 KB

로깅

개요

유저의 게임 데이터는 유저가 게임을 진행해나감에 따라 계속 변경됩니다. 새로운 데이터가 추가되기도 하고, 기존 데이터가 덮어써지기도 하고, 있던 데이터를 삭제하기도 합니다. 일반적으로, 게임플레이를 만들기 위해서는 게임 데이터의 최신 내용만 DB에 저장하고 있으면 됩니다. 지금 갖고 있는 아이템이 언제 어떤 과정을 통해 생성되었는지, 내구도는 언제 왜 깎였는지 같은 변화 이력은 게임플레이에선 필요 없습니다.

그런데, 운영을 위해서는 그런 변화 이력이 반드시 필요합니다. 어뷰징으로 부당 이득을 얻은 유저를 찾아내서 제재하거나, 게임 로직에 버그가 있어서 데이터가 잘못 써졌을 때 그 내역을 추적해서 정상적인 데이터로 되돌리거나, 유저들의 행동 패턴을 분석하거나 하는 일에 게임 데이터의 변화 이력(로그)을 사용합니다.

게임 데이터를 변경할 때마다 그에 맞게 로깅 코드를 작성하는 일은 대단히 손이 많이 가고 실수하기 쉬운데, 실수한 것을 발견하기는 어렵습니다. 특히 런칭을 앞두고 급히 운영툴 기능을 만들면서 로그를 추가하게 마련이니, 로깅 코드를 빠뜨리기도 쉽습니다.

그래서 실버바인 서버 엔진 2는 게임 데이터가 어떻게 변화하는지 추적해서 자동으로 로그를 남겨줍니다. 값이 덮어씌워진 경우 이전 값과 새 값을 모두 남기고, 삭제된 경우에는 삭제되기 직전 값을 남깁니다. 게임 로직에서는 데이터가 어떻게 변하는지를 일일이 추적해서 로깅 코드를 짤 필요가 없습니다.

로그에 저장되는 내용

로그에는 어떤 행의 어떤 어떤 필드가 변경되었는지 자세히 적힙니다. 한 트랜잭션 안에서 값이 여러 번 변경되었을 경우에도 MarkAsChanged()를 부르는 시점마다 변화가 기록됩니다.

도큐먼트 로그

각 트랜잭션에 의해서 변경되는 도큐먼트 하나마다 하나의 로그 항목이 남습니다. 예를 들면, 한 트랜잭션에서 도큐먼트 2개가 함께 변경되었다면, 로그 항목도 각 도큐먼트별로 하나씩, 총 2개 남게 됩니다. 도큐먼트 로그는 도큐먼트가 저장되는 DB에 함께 저장되었다가 나중에 아카이브로 옮겨집니다.

도큐먼트 로그는 각 도큐먼트별 로그를 시간순으로 빠르게 조회할 수 있도록 저장됩니다. 도큐먼트 변경 로그를 사용해서 특정 유저의 데이터를 과거 시점으로 되감아볼 수 있습니다.

글로벌 테이블 로그

각 트랜잭션에 의해서 변경되는 글로벌 테이블의 키 하나마다 하나의 로그 항목이 남습니다. 글로벌 테이블 로그도 글로벌 테이블의 행이 저장되는 DB에 함께 저장되었다가 나중에 아카이브로 옮겨집니다.

글로벌 테이블 로그는 특정 키별 로그를 시간순으로 빠르게 조회할 수 있도록 저장됩니다.

분산 트랜잭션 로그 (미구현)

여러 도큐먼트와 글로벌 테이블이 하나의 트랜잭션에서 함께 변경될 수 있으므로, 이들이 함께 변경되었는지를 나타내는 표시가 필요하고, 어떤 한 로그 항목을 보았을 때 그것과 함께 변경된 데이터가 무엇인지를 알아낼 방법이 필요합니다. 실버바인 서버 엔진 2에서는 각 로그 항목마다 분산 트랜잭션의 id, 같은 분산 트랜잭션에 참여했던 다른 도큐먼트의 id, 같은 분산 트랜잭션에 참여했던 글로벌 테이블의 type과 Key를 중복해서 기록해서 분산 트랜잭션을 사후 분석할 수 있도록 합니다.

로그 인덱싱 / 아카이빙 (미구현)

모든 데이터의 변경 내역을 빠짐없이 저장하기 때문에 용량이 꽤 클 텐데, 로그가 적당히 쌓이면 잘라서 압축하고 S3로 옮기도록 만들 예정입니다. 이것을 아카이빙이라고 부릅니다. 묶어서 S3에 저장할 때도 도큐먼트별/키별로 조회하기 좋은 성질을 유지할 것입니다. 빠른 분석을 위해 Spark를 도입하는 것도 검토하고 있습니다.

이 설계는 [슈판워] 맨땅에서 데이터 분석 시스템 만들어나가기, <쿠키런> 바쁘고 가난한 개발자를 위한 S3 기반 로그 시스템을 참고했습니다.