Quora에 페이스북 아키텍처에 대한 질문이 올라왔기에 독자 여러분을 위해 정리해드린다.
- 웹 프론트 엔드는 PHP로 작성되었다. 페이스북의 힙합 컴파일러는 PHP 코드를 C++ 코드로 변환하며, g++를 사용해 컴파일하므로 고성능 템플릿 엔진과 웹 논리 수행 층을 제공한다.
- 정적 컴파일에 완전히 의존하지 못하는 제약으로 인해, 페이스북은 힙합 인터프리터 해석기와 PHP 코드를 해석해 힙합 바이트 코드로 변경하는 힙합 가상 기계를 개발하기 시작했다.
- 비즈니스 논리는 Thrift를 사용해 서비스 형태로 만든다. 서비스는 서비스 요구 사항에 맞춰 PHP, C++, 자바로 만들어진다.
- 자바를 사용한 서비스 구현은 일반적인 엔터프라이즈 애플리케이션 서버가 아니라 페이스북이 직접 만든 전용 애플리케이션 서버를 사용한다. 처음 보기에는 바퀴를 재발명하는 듯한 느낌이 들지도 모르겠지만, 톰캣이나 심지어 제티의 오버헤드가 페이스북의 요구 사항에 부가가치를 더하지 못하므로 대부분 Thrift를 사용한 형태로 공개되어 있다.
- 영속적인 자료 저장은 MySQL, Memcached, 하둡 HBase를 사용한다. Memcached는 일반적인 범용 캐시 목적 뿐만 아니라 MySQL용 캐시로 사용된다. (옮긴이 주: 최근에는 SSD를 고려한 MySQL 패치로 성능 개선이 가능해져 Memcached 사용을 대폭 줄였다는 소식도 있다)
- 오프라인 프로세싱은 하둡과 하이브를 사용해서 수행한다.
- 로깅, 클릭, 피드와 같은 데이터는 Scribe를 사용해 전송하며, Scribe-HDFS를 사용해 HDFS에 저장된다. 맵리듀스를 사용해 후속 분석이 가능해진다.
- BigPipe는 파이프라인 논리를 사용한 페이지 렌더링 가속 기술이다.
- HTTP 프록시를 위해 Varnish Cache를 사용한다. 고성능 고효율로 인해 페이스북에서는 이를 선호한다.
- 사용자가 올린 수십 억개의 사진은 Haystack을 사용해 처리한다. 저수준 최적화와 append만 존재하는 쓰기를 지원하는 전용 자체 스토리지 솔루션이다.
- Facebook Messages는 샤딩과 동적 클러스터 관리에 기반한 독자적인 아키텍처를 사용한다. 비즈니스 논리와 영속성은 'Cell'이라는 단위로 캡슐화되어 있다. 각 셀은 사용자 일부를 처리한다. 사용자가 늘어나면 새로운 셀을 추가할 수 있다.
- Facebook Messages의 검색 엔진은 HBase에 저장된 역 색인(inverted index)로 만들어진다.
- 자동 완성 검색 기능은 전용 스토리지와 인출 논리를 사용한다.
- 채팅은 Erlang으로 개발된 Epoll 서버에 기반하며, Thrift로 접근한다.
- 적절한 복구 작업 흐름을 시작하거나 문제를 극복할 수 없을 경우 사람이 처리하게끔 감시 경고에 반응하는 자동화된 시스템을 구축했다.
- 옮긴이 주: 페이스북이 보유한 서버는 백만대를 넘어선 것으로 추정한다. 페이스북은 최근 샌디스크로 넘어간 퓨전 아이오에서 엔터프라이즈급 고성능 SSD를 가장 많이 구매한 고객이다. MySQL 서버는 모두 SSD 기반으로 동작하고 있다고 추정한다.
- 옮긴이 주: 최근 페이스북은 brtfs 메인테이너를 영입했다. 웹 서버의 파일 시스템부터 brtfs/SSD 조합을 사용해 성능 향상 작업을 벌이고 있는 것으로 추정한다.