[발 번역] Staircar: Redis-powered notifications

해당 글은 Staircar: Redis-powered notifications(원문: http://engineering.tumblr.com/post/7819252942/staircar-redis-powered- notifications) 라는 글을 발 번역한 것입니다. 오역에 주의하세요. 번역하고 보니 중간에 있는 이 문서 http://antirez.com/post/redis-presharding.html 를 꼭 읽어보시길 바랍니다.)

5월에 Tumblr에 들어간 이후 바로, 알림 시스템을 다시 만들게 되는 일을 맡게 되었습니다. 알림은 유저의 대시보드에 보여지는 아이템으로, 다른 Tumblr 블로그에서 리블로깅 되거나, 블로그를 팔로잉한 사용자가 좋아한다라는 내용이 들어있다.

최근까지, 알림은 Mysql 과 그 앞단에 대규모 memcache 캐싱을 통해서 서비스되었습니다. Tumblr의 핵심 소셜 인터랙션 데이터는 매우 삽입이 많습니다. 많은 알림 정보 한번에 생성하기 위해서  Mysql 의  InnoDB global transaction max (1024) 를 넘어서 Persona 버전의 Mysql(Percona version of MySQL) 을 사용해야만 했습니다.( 역자 주: 아마도 Tumblr의 데이터 삽입량이 mysql 의 한계를 넘어선 것 같습니다.  )

좀 더 확장성 있는 시스템을 만들기 위해서, 알림서비스의 주요 특성을 구분해보았습니다.

  • 시간으로 정렬되어진다.
  • 유일해야 한다.(중복되는 알림이 없어야 한다.)
  • 읽기/쓰기의 비율이 60%/30% 정도여야 한다. 대부분 캐싱되어야 한다.
  • 유저마다 정해진 수 만큼의 알림만 가져야 한다.
  • user 가 key가 되어야 하고, 해당 사용자만 읽을 수 있어야 한다.

Redis 는 “네트웍 너머에서 사용할 수 있는 데이터 구조의 집합” 이라고 할 수 있습니다. 꽤 뛰어난 성능을 가지고 있습니다. 거기다가,  sorted sets은 알림의 특성과 완벽하게 맞아떨어집니다. MySQL에서 비슷한 구조로 구현하면서 발생하는 I/O와 동시성 문제도 없습니다. Redis의 Sorted Set 은 score 로 정렬이 되고(tumblr는 unix timestamp가 Score입니다.) 유일한 데이터들을 가지고 저장하고 key를 이용해서 적은 비용으로 문자열을 짜르거나 추가할 수 있습니다. (tumblr에서는 user 가 key)

알림 서비스의 요청은 초당 7500건 이상, 그리고 데이터 사이즈는 23MM blogs, 블로그당 100개의 알림, 메시지당 160bytes 정도를 사용합니다. 요구 응답시간은 5ms 미만이며,  장애에 안정적이어야 하며, 지속적으로 확장 가능하다는 필요성 때문에 데이터를 preshard 하기를 원했습니다. 좀 더 나은 성능과, 장애에 안정적이며, 확장 가능성 등을 고려하는 것이 복잡함을 증가시켰지만, 이것은 복잡하지 않았습니다. 웹 어플리케이션을 이런식으로 만들기를 원했고, Redis의 앞단을 추상화 계층으로 만들었습니다.

Staircar 는 수백대의 Redis Instance와 통신하기 위한 간단한 HTTP service 입니다. 해당 작업을 위해서 몇몇 시작하는 오픈 소스들을 살펴보았지만, 우리에게 필요없는 수 많은 기능을 제공하거나, Sorted Set이 커질때 응답 시간이 제각각이거나 했습니다. 결국, libevent 를 기반으로 RESTful 하고 JSON으로 통신하는 서비스를  만들었습니다.

Staircar의 성능은 우리의 기대를 넘어섰고, 매우 안정적입니다. 응답시간도 심지어 피크 타임에도 평균적으로 5ms 이하입니다. 대규모 벤치마크에서 보여주듯이 서버 한대당 초당 30,000 Request를 처리가 가능합니다.

3~4ms 의 범위에 가장 많이 몰려있는 것을 볼 수 있습니다. 두 번째는 5ms 근처에 형성되고 있습니다. 99.99%의 요청이 10ms 이하에서 처리되고 있고, 98.2%의 요청이 5ms 이하에서 처리되고 있습니다.( 이것은 client 측에서 측정한 데이터입니다. 즉, 이것이 클라이언트에서 일반적으로 볼 수 있는 성능지표입니다.)

알림은 현재 한달 이상 완전히 Staircar를 통해서 서비스 되고 있습니다. Redis는 매우 빠르고 안정적입니다.  추후에는 우리의 성능 측정 방법과 Staircar를 최대한 성능을 내도록 수정하기 위해서 redis의 세부적인 동작에 대해서 파보도록 하겠습니다. 위의 그래프를 보여주기 위해서  Scribe, Hadoop, R  등을 사용하고 있습니다.

( Staircar라는 이름은 내부적인 코드네임입니다. 아직까지는 오픈소스가 되기에는 미흡하지만, 가까운 미래에 오픈소스로 배포할 계획입니다. )