트위터의 장애 극복 이야기

박재현님이 쓰신 트위터의 대용량 서비스 분석이라는 글을 보면 이제 트위터가 기술적으로 안정됐다는 생각이 듭니다.

사실 작년 8월만 하더라도 제가 쓴 글 중에 트위터가 잦은 장애와 기술적 한계 때문에 일각에선 더 이상 지속하지 못하는 거 아니냐는 의문이 팽배했습니다.

하지만 작년 연말 부터 폭주한 사용자를 느끈히 감당하고 있고 더 이상 ‘장애 고래(Failed Whale)’를 자주 보지 않아도 될 정도가 되었습니다. 아고라의 사례를 굳이 예로 들지 않더라도, 엄청난 트래픽을 직접 맞아 본 경험이 없다면 대용량 처리니 뭐니 하는 것도 다 탁상공론에 불과합니다.

그만큼 현장에서 얼마나 멋지게 성능 처리를 하느냐는 매우 중요한 요소 입니다. FOWA2008의 성능 워크숍에 갔을 때 만난 트위터, 페이스북, 딕닷컴의 개발자들도 돈이 턱없이 부족한 현실에서 어떻게 성능을 최대로 가져갈 수 있겠냐는 아이디어를 즉석에서 토론하고 논의하더군요.

어떤 측면에서 보면 미봉책이라고 비판을 들을 수 있는 아이디어들이 실제 난관을 훌륭하게 메꾸고 있음을 보게 됩니다. Daum에도 JDBC의 DB pool 병목을 해결하기 위한 다양한 내부 기술이 있으니까요. 트위터가 어떻게 문제를 해결해 왔는지 기술 내적 혹은 외적 요소를 한번 살펴 볼 필요가 있을 것 같네요.

발빠른 아이디어 구현 능력
트위터는 루비 온 레일즈를 이용한 대표적 웹 서비스입니다. 개발 컨벤션이 이미 정해져 있어 빠르고 손쉽게 서비스를 개발하면서 RESTful한 서비스를 만들 수 있는 MVC 프레임웍의 대표 주자이고 많은 스타트업이 즐겨씁니다.

트위터 초창기 주요 개발자였던 Blaine Cook은 memcached와 starling이라는 레일즈 기반 message queue 서버를 이용해 메모리와 페이지 캐싱을 통해 트위터의 성능을 향상 시킵니다. 트위터가 많은 사람들의 실시간 메시지를 전달할 수 있었던 가장 큰 아이디어를 제공한 셈이죠.

또한, 트위터 같은 웹 기반 실시간 메시징(혹은 채팅) 서비스를 효율적으로 처리하기 위해 기존 웹 통신의 반대 방식, 즉 서버가 웹 브라우저로 메시지를 전달(Push)해 주는 아이디어를 트위터에 적용합니다.

그런데, 잦은 장애와 내부와의 갈등으로 2008년 4월에 Cook이 갑작 스럽게 그만 두고 바통을 이어받은 친구는 바로 Evan Weaver입니다. CNET에서 개발자로 일하면서 레일즈 성능 최적화 컨설팅을 하던 이 친구가 트위터에 들어와서 아이디어를 짜내게 됩니다.

아래 내용은 그가 2009년 3월 Qcon에서 한 PT 참고했습니다.

우선 가장 중요한 메시지 큐 서버를 손 봅니다. 레일즈 기반의 Starling을 JVM 기반 라이브러리를 호출할 수 있는 Kestrel(구, Scalring)으로 바꾼 것이죠. 루비의 가비지 콜렉션 문제 때문에 MQ서버가 다운되는 일이 흔했기 때문에 일반적으로 뛰어난 자바의 GC기능을 이용하기 위해서였습니다. 트위터의 MQ 서버는 memchached 프로토콜을 이용하고 모든 메시지를 메모리에 올리는 방식을 이용합니다.

메모리에 데이터를 올릴 때도 여러 가지 계층을 둡니다. 각 트윗의 ID만을 배열로 가지고 있는 Vector Cache와 사용자와 트윗의 실제 DB정보를 보관하는 Row Cache이고 이는 CacheMonkey를 사용합니다.

Fragment cache는 트위터 전체 트래픽의 80%를 차지하는 서드파티의 API 호출을 위해 사용하는 것으로 DB가 아니라 캐쉬에서 데이터를 얻어 옵니다. 따라서 별도의 Page Cache를 분리해서 서비스를 제공합니다.

아고라의 경우에도 메모리 캐싱을 통해 잦은 DB 접속을 줄이고 있지만 캐쉬가 한번 무너지면 트위터로서는 엄청난 재앙이 되는 것이죠. 그렇기 때문에 복잡한 다중 구조의 캐싱을 하게 되는 것 같네요.

젊음의 힘이 서비스를 살린다
앞서 좀 장황하게 기술적 변화를 적었지만 가장 중요한 건 그런 아이디어를 내는 힘이 어디서 오는가 하는 점입니다.

Blaine Cook과 Evan Weaver 둘다 20대에 트위터에서 두각을 드러낸 친구들로 아직 30세를 넘지 않았습니다. 대학 다닐 때 부터 프로그래밍에 몰두했고 작은 스타트업 기업들에서 개발을 하면서 실력을 쌓아갔습니다.

가끔 제가 웹표준 강의를 나가면 애플의 사파리 개발자 David Hyatt, 오페라의 Annes Anne van Kesteren, Google의 HTML5 편집자 Ian Hickson이나 크롬 개발자 Ben Goodger를 예를 듭니다. 이들은 아직 20대거나 30대 초반으로 사실상 차세대 웹을 주도해 나가고 있습니다. 큰 성공은 사실상 20대에 이루어야 한다는 진리를 몸소 보여주는 친구들이죠.

저의 20대를 돌아보면 비록 성공적이진 못했지만, 90년대 후반 수십만명의 회원을 가진 웹 서비스와 100MB 트래픽을 유발한 인터넷 방송을 운영했었고 한달에 백억 가까운 지불 트랜잭션을 처리하는 기반 서비스, 해외 유명 보안 기업의 인증 서비스의 국내 에이전시 역할을 해본적이 있습니다. 아마 오늘의 제가 있기 까지 20대의 다양한 실패와 성공의 경험은 매우 값진 것이라고 생각합니다.

그래서 20대에 뭔가를 도전하려는 친구들에게 웬지 정감이 가고 응원해 주고 싶습니다. TOEIC, 자격증 그리고 공무원 시험에 매여 있는 것 보다 자기가 좋아하는 걸 찾고 도전하고 경험하는 것이 정말 중요하다고 봅니다.

국내 포털 기업에서도 이런 노력을 하는 젊은 인재들이 모인 스타트업 기업에 투자를 하거나 인수를 해주는 좋은 일 좀 많이 해줬으면 합니다.

역시 오픈 소스가 답이다
트위터에 오늘을 있게 한 기술 기반은 역시 오픈 소스 소프트웨어 입니다. 트위터 뿐만 아니고 우리가 많이 회자하는 성공 웹 서비스의 거의 대부분이 오픈소스를 기반합니다. 웹 서비스와 오픈 소스 소프트웨어는 현재의 컴퓨팅 혁신의 원동력이 됩니다.

엔터프라이즈 기반의 소프트웨어 개발을 주로 하던 분들에게는 애들 장난 처럼 보일지 몰라도 웹 기반 데이터 통신과 서비스가 이제 대세입니다. 오죽했으면 SOA라고 열심히 떠들던 웹 서비스 기술(WS*)이 RESTful한 서비스에 먹히는 일이 생기기 시작했습니다. 올해 웹공학회9(ISWE)에서는 From SOA to REST라는 화두가 던져졌을 정도니까요.

어쨌든 트위터는 다수의 소규모 오프 소스 프로젝트에 개발자를 투여하면서 개발자도 영입하고 기술도 축적해 나가게 됩니다. 그 중에서도 대표적으로 memcached의 기반이 되는 Donga Project를 비롯 Peep, Libmemcached , Valgrind와 같은 C 계열 개발 도구와 JVM 기반 Kestrel, Smile, Jconsole 그리고 Ruby 기반 BleakHouse 등이 있습니다.

대학생들에게 한 가지 조언은 오픈 소스라고 구글의 SoC 같은 방식으로 큰 프로젝트에 참여하는 것만 중요한 게 아니라 생활 속에서 필요한 코드를 짜서 공개하는 연습을 하고 github 같은 커뮤니티에 참여하는 것도 중요 합니다. Kestrel 같은 코드는 1500줄 밖에 안되는 포팅 코드이지만 트위터의 주요 메시지큐 서버 역할을 하고 있습니다.

어쨌든 트위터는 이런 여러 가지 방식으로 일단의 기술적 문제는 해결한 셈입니다. 하지만 여전히 문제는 남아 있습니다. 트위터에서 주로 떠드는 사람이 전체 사용자의 10% 정도라는 이야기가 있습니다. 25%는 듣기만 하고 50%는 삼일에 한번 정도 쓴다는 겁니다. 이는 트위터에게 행운일지도 모릅니다. 아마 사용자의 반인 50%가 재잘거리면 또 어떤 일이 일어날지 모르니까요.

여러분의 생각

  1. 좋은 글 잘 읽었습니다.^^ 20대가 막 끝난 입장에서 30대라도 늦지 않았습니다!!! 라고 말하고 싶네요.^^

  2. 장애고래의 표현이 멋지네요. 그런 표현보다도 아이디어를 즉각적으로 구현하는 트위터의 능력이 더 멋집니다^^

  3. 유어킷은 상용입니다.

의견 쓰기

이름* 이메일* 홈페이지(선택)